@@ -133,6 +133,7 @@ Address TemplateTable::at_bcp(int offset) {
133133void TemplateTable::patch_bytecode (Bytecodes::Code bc, Register bc_reg,
134134 Register temp_reg, bool load_bc_into_bc_reg /* =true*/ ,
135135 int byte_no) {
136+ assert_different_registers (bc_reg, temp_reg);
136137 if (!RewriteBytecodes) { return ; }
137138 Label L_patch_done;
138139
@@ -196,7 +197,11 @@ void TemplateTable::patch_bytecode(Bytecodes::Code bc, Register bc_reg,
196197 __ bind (L_okay);
197198#endif
198199
199- // patch bytecode
200+ // Patch bytecode with release store to coordinate with ResolvedFieldEntry loads
201+ // in fast bytecode codelets. load_field_entry has a memory barrier that gains
202+ // the needed ordering, together with control dependency on entering the fast codelet
203+ // itself.
204+ __ membar (MacroAssembler::LoadStore | MacroAssembler::StoreStore);
200205 __ sb (bc_reg, at_bcp (0 ));
201206 __ bind (L_patch_done);
202207}
@@ -3017,6 +3022,7 @@ void TemplateTable::fast_storefield(TosState state) {
30173022
30183023 // X11: field offset, X12: field holder, X13: flags
30193024 load_resolved_field_entry (x12, x12, noreg, x11, x13);
3025+ __ verify_field_offset (x11);
30203026
30213027 {
30223028 Label notVolatile;
@@ -3104,6 +3110,8 @@ void TemplateTable::fast_accessfield(TosState state) {
31043110 __ load_field_entry (x12, x11);
31053111
31063112 __ load_sized_value (x11, Address (x12, in_bytes (ResolvedFieldEntry::field_offset_offset ())), sizeof (int ), true /* is_signed*/ );
3113+ __ verify_field_offset (x11);
3114+
31073115 __ load_unsigned_byte (x13, Address (x12, in_bytes (ResolvedFieldEntry::flags_offset ())));
31083116
31093117 // x10: object
@@ -3159,7 +3167,9 @@ void TemplateTable::fast_xaccess(TosState state) {
31593167 __ ld (x10, aaddress (0 ));
31603168 // access constant pool cache
31613169 __ load_field_entry (x12, x13, 2 );
3170+
31623171 __ load_sized_value (x11, Address (x12, in_bytes (ResolvedFieldEntry::field_offset_offset ())), sizeof (int ), true /* is_signed*/ );
3172+ __ verify_field_offset (x11);
31633173
31643174 // make sure exception is reported in correct bcp range (getfield is
31653175 // next instruction)
0 commit comments