11//
2- // Copyright (c) 2024, 2025 , Oracle and/or its affiliates. All rights reserved.
2+ // Copyright (c) 2024, 2026 , Oracle and/or its affiliates. All rights reserved.
33// DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
44//
55// This code is free software; you can redistribute it and/or modify it
@@ -74,48 +74,76 @@ static void write_barrier_post(MacroAssembler* masm,
7474%}
7575
7676// TODO 8350865 (same applies to g1StoreLSpecialTwoOops)
77- // - Can we use an unbound register for src?
7877// - Do no set/overwrite barrier data here, also handle G1C2BarrierPostNotNull
79- // - Is the zero-extend really required in all the places?
8078// - Move this into the .m4?
81- instruct g1StoreLSpecialOneOop (indirect mem, iRegL_R11 src, immI off, iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4 , rFlagsReg cr)
79+ instruct g1StoreLSpecialOneOopOff0 (indirect mem, iRegLNoSp src, immI0 off, iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, rFlagsReg cr)
8280%{
8381 predicate(UseG1GC);
8482 match(Set mem (StoreLSpecial mem (Binary src off)));
85- effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, KILL cr);
83+ effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, KILL cr);
84+ ins_cost(INSN_COST);
85+ format %{ "str $src, $mem\t# g1StoreLSpecialOneOopOff0" %}
86+ ins_encode %{
87+ ((MachNode*)this)->set_barrier_data(G1C2BarrierPre | G1C2BarrierPost);
88+ write_barrier_pre(masm, this,
89+ $mem$$Register /* obj */,
90+ $tmp1$$Register /* pre_val */,
91+ $tmp2$$Register /* tmp1 */,
92+ $tmp3$$Register /* tmp2 */,
93+ RegSet::of($mem$$Register, $src$$Register) /* preserve */);
94+
95+ __ str($src$$Register, $mem$$Register);
96+
97+ // Extract the narrow oop field value
98+ __ ubfm($tmp1$$Register, $src$$Register, 0, 31);
99+ __ decode_heap_oop($tmp1$$Register, $tmp1$$Register);
100+ write_barrier_post(masm, this,
101+ $mem$$Register /* store_addr */,
102+ $tmp1$$Register /* new_val */,
103+ $tmp2$$Register /* tmp1 */,
104+ $tmp3$$Register /* tmp2 */);
105+ %}
106+ ins_pipe(istore_reg_mem);
107+ %}
108+
109+ instruct g1StoreLSpecialOneOopOff4(indirect mem, iRegLNoSp src, immI_4 off, iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4, rFlagsReg cr)
110+ %{
111+ predicate(UseG1GC);
112+ match(Set mem (StoreLSpecial mem (Binary src off)));
113+ effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
86114 ins_cost(INSN_COST);
87- format %{ "str $src, $mem\t# g1StoreLSpecialOneOop " %}
115+ format %{ "str $src, $mem\t# g1StoreLSpecialOneOopOff4 " %}
88116 ins_encode %{
89117 ((MachNode*)this)->set_barrier_data(G1C2BarrierPre | G1C2BarrierPost);
90118
91119 // Adjust address to point to narrow oop
92- __ add($tmp4$$Register, $mem$$Register, $off$$constant );
120+ __ add($tmp4$$Register, $mem$$Register, 4 );
93121 write_barrier_pre(masm, this,
94122 $tmp4$$Register /* obj */,
95123 $tmp1$$Register /* pre_val */,
96124 $tmp2$$Register /* tmp1 */,
97- $tmp3$$Register /* tmp2 */);
125+ $tmp3$$Register /* tmp2 */,
126+ RegSet::of($mem$$Register, $src$$Register, $tmp4$$Register) /* preserve */);
98127
99128 __ str($src$$Register, $mem$$Register);
100129
101- // Shift long value to extract the narrow oop field value and zero-extend it
102- __ lsr($src$$Register, $src$$Register, $off$$constant << LogBitsPerByte);
103- __ ubfm($src$$Register, $src$$Register, 0, 31);
104-
130+ // Shift long value to extract the narrow oop field value
131+ __ lsr($tmp1$$Register, $src$$Register, 32);
132+ __ decode_heap_oop($tmp1$$Register, $tmp1$$Register);
105133 write_barrier_post(masm, this,
106134 $tmp4$$Register /* store_addr */,
107- $src $$Register /* new_val */,
135+ $tmp1 $$Register /* new_val */,
108136 $tmp2$$Register /* tmp1 */,
109137 $tmp3$$Register /* tmp2 */);
110138 %}
111139 ins_pipe(istore_reg_mem);
112140%}
113141
114- instruct g1StoreLSpecialTwoOops(indirect mem, iRegL_R11 src, iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4, rFlagsReg cr)
142+ instruct g1StoreLSpecialTwoOops(indirect mem, iRegLNoSp src, iRegPNoSp tmp1, iRegPNoSp tmp2, iRegPNoSp tmp3, iRegPNoSp tmp4, rFlagsReg cr)
115143%{
116144 predicate(UseG1GC);
117145 match(Set mem (StoreLSpecial mem src));
118- effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, USE_KILL src, KILL cr);
146+ effect(TEMP tmp1, TEMP tmp2, TEMP tmp3, TEMP tmp4, KILL cr);
119147 ins_cost(INSN_COST);
120148 format %{ "str $src, $mem\t# g1StoreLSpecialTwoOops" %}
121149 ins_encode %{
@@ -140,17 +168,19 @@ instruct g1StoreLSpecialTwoOops(indirect mem, iRegL_R11 src, iRegPNoSp tmp1, iRe
140168
141169 // Zero-extend first narrow oop to long
142170 __ ubfm($tmp1$$Register, $src$$Register, 0, 31);
143-
144- // Shift long value to extract the second narrow oop field value
145- __ lsr($src$$Register, $src$$Register, 32);
171+ __ decode_heap_oop($tmp1$$Register, $tmp1$$Register);
146172 write_barrier_post(masm, this,
147173 $mem$$Register /* store_addr */,
148174 $tmp1$$Register /* new_val */,
149175 $tmp2$$Register /* tmp1 */,
150176 $tmp3$$Register /* tmp2 */);
177+
178+ // Shift long value to extract the second narrow oop field value
179+ __ lsr($tmp1$$Register, $src$$Register, 32);
180+ __ decode_heap_oop($tmp1$$Register, $tmp1$$Register);
151181 write_barrier_post(masm, this,
152182 $tmp4$$Register /* store_addr */,
153- $src $$Register /* new_val */,
183+ $tmp1 $$Register /* new_val */,
154184 $tmp2$$Register /* tmp1 */,
155185 $tmp3$$Register /* tmp2 */);
156186 %}
0 commit comments