src/hotspot/cpu/x86/templateTable_x86.cpp
changeset 54921 be1cbfd81ea1
parent 53746 bdccafc038a2
child 55105 9ad765641e8f
child 58678 9cf78a70fa4f
equal deleted inserted replaced
54920:6a6935abebe8 54921:be1cbfd81ea1
  2984   Label notDouble;
  2984   Label notDouble;
  2985   __ cmpl(flags, dtos);
  2985   __ cmpl(flags, dtos);
  2986   __ jcc(Assembler::notEqual, notDouble);
  2986   __ jcc(Assembler::notEqual, notDouble);
  2987 #endif
  2987 #endif
  2988   // dtos
  2988   // dtos
  2989   __ access_load_at(T_DOUBLE, IN_HEAP, noreg /* dtos */, field, noreg, noreg);
  2989   // MO_RELAXED: for the case of volatile field, in fact it adds no extra work for the underlying implementation
       
  2990   __ access_load_at(T_DOUBLE, IN_HEAP | MO_RELAXED, noreg /* dtos */, field, noreg, noreg);
  2990   __ push(dtos);
  2991   __ push(dtos);
  2991   // Rewrite bytecode to be faster
  2992   // Rewrite bytecode to be faster
  2992   if (!is_static && rc == may_rewrite) {
  2993   if (!is_static && rc == may_rewrite) {
  2993     patch_bytecode(Bytecodes::_fast_dgetfield, bc, rbx);
  2994     patch_bytecode(Bytecodes::_fast_dgetfield, bc, rbx);
  2994   }
  2995   }
  3253 
  3254 
  3254   // ltos
  3255   // ltos
  3255   {
  3256   {
  3256     __ pop(ltos);
  3257     __ pop(ltos);
  3257     if (!is_static) pop_and_check_object(obj);
  3258     if (!is_static) pop_and_check_object(obj);
  3258     __ access_store_at(T_LONG, IN_HEAP, field, noreg /* ltos*/, noreg, noreg);
  3259     // MO_RELAXED: generate atomic store for the case of volatile field (important for x86_32)
       
  3260     __ access_store_at(T_LONG, IN_HEAP | MO_RELAXED, field, noreg /* ltos*/, noreg, noreg);
  3259 #ifdef _LP64
  3261 #ifdef _LP64
  3260     if (!is_static && rc == may_rewrite) {
  3262     if (!is_static && rc == may_rewrite) {
  3261       patch_bytecode(Bytecodes::_fast_lputfield, bc, rbx, true, byte_no);
  3263       patch_bytecode(Bytecodes::_fast_lputfield, bc, rbx, true, byte_no);
  3262     }
  3264     }
  3263 #endif // _LP64
  3265 #endif // _LP64
  3288 
  3290 
  3289   // dtos
  3291   // dtos
  3290   {
  3292   {
  3291     __ pop(dtos);
  3293     __ pop(dtos);
  3292     if (!is_static) pop_and_check_object(obj);
  3294     if (!is_static) pop_and_check_object(obj);
  3293     __ access_store_at(T_DOUBLE, IN_HEAP, field, noreg /* dtos */, noreg, noreg);
  3295     // MO_RELAXED: for the case of volatile field, in fact it adds no extra work for the underlying implementation
       
  3296     __ access_store_at(T_DOUBLE, IN_HEAP | MO_RELAXED, field, noreg /* dtos */, noreg, noreg);
  3294     if (!is_static && rc == may_rewrite) {
  3297     if (!is_static && rc == may_rewrite) {
  3295       patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx, true, byte_no);
  3298       patch_bytecode(Bytecodes::_fast_dputfield, bc, rbx, true, byte_no);
  3296     }
  3299     }
  3297   }
  3300   }
  3298 
  3301