@@ -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