src/cpu/x86/vm/templateTable_x86_64.cpp

Print this page




 122                          Address obj,
 123                          Register val,
 124                          BarrierSet::Name barrier,
 125                          bool precise) {
 126   assert(val == noreg || val == rax, "parameter is just for looks");
 127   switch (barrier) {
 128 #ifndef SERIALGC
 129     case BarrierSet::G1SATBCT:
 130     case BarrierSet::G1SATBCTLogging:
 131       {
 132         // flatten object address if needed
 133         if (obj.index() == noreg && obj.disp() == 0) {
 134           if (obj.base() != rdx) {
 135             __ movq(rdx, obj.base());
 136           }
 137         } else {
 138           __ leaq(rdx, obj);
 139         }
 140         __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
 141         if (val == noreg) {
 142           __ store_heap_oop(Address(rdx, 0), NULL_WORD);
 143         } else {
 144           __ store_heap_oop(Address(rdx, 0), val);
 145           __ g1_write_barrier_post(rdx, val, r8, rbx);
 146         }
 147 
 148       }
 149       break;
 150 #endif // SERIALGC
 151     case BarrierSet::CardTableModRef:
 152     case BarrierSet::CardTableExtension:
 153       {
 154         if (val == noreg) {
 155           __ store_heap_oop(obj, NULL_WORD);
 156         } else {
 157           __ store_heap_oop(obj, val);
 158           // flatten object address if needed
 159           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 160             __ store_check(obj.base());
 161           } else {
 162             __ leaq(rdx, obj);
 163             __ store_check(rdx);
 164           }
 165         }
 166       }
 167       break;
 168     case BarrierSet::ModRef:
 169     case BarrierSet::Other:
 170       if (val == noreg) {
 171         __ store_heap_oop(obj, NULL_WORD);
 172       } else {
 173         __ store_heap_oop(obj, val);
 174       }
 175       break;
 176     default      :
 177       ShouldNotReachHere();
 178 
 179   }
 180 }
 181 
 182 Address TemplateTable::at_bcp(int offset) {
 183   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 184   return Address(r13, offset);
 185 }
 186 
 187 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
 188                                    Register scratch,
 189                                    bool load_bc_into_scratch/*=true*/) {
 190   if (!RewriteBytecodes) {
 191     return;




 122                          Address obj,
 123                          Register val,
 124                          BarrierSet::Name barrier,
 125                          bool precise) {
 126   assert(val == noreg || val == rax, "parameter is just for looks");
 127   switch (barrier) {
 128 #ifndef SERIALGC
 129     case BarrierSet::G1SATBCT:
 130     case BarrierSet::G1SATBCTLogging:
 131       {
 132         // flatten object address if needed
 133         if (obj.index() == noreg && obj.disp() == 0) {
 134           if (obj.base() != rdx) {
 135             __ movq(rdx, obj.base());
 136           }
 137         } else {
 138           __ leaq(rdx, obj);
 139         }
 140         __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
 141         if (val == noreg) {
 142           __ store_heap_oop_null(Address(rdx, 0));
 143         } else {
 144           __ store_heap_oop(Address(rdx, 0), val);
 145           __ g1_write_barrier_post(rdx, val, r8, rbx);
 146         }
 147 
 148       }
 149       break;
 150 #endif // SERIALGC
 151     case BarrierSet::CardTableModRef:
 152     case BarrierSet::CardTableExtension:
 153       {
 154         if (val == noreg) {
 155           __ store_heap_oop_null(obj);
 156         } else {
 157           __ store_heap_oop(obj, val);
 158           // flatten object address if needed
 159           if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
 160             __ store_check(obj.base());
 161           } else {
 162             __ leaq(rdx, obj);
 163             __ store_check(rdx);
 164           }
 165         }
 166       }
 167       break;
 168     case BarrierSet::ModRef:
 169     case BarrierSet::Other:
 170       if (val == noreg) {
 171         __ store_heap_oop_null(obj);
 172       } else {
 173         __ store_heap_oop(obj, val);
 174       }
 175       break;
 176     default      :
 177       ShouldNotReachHere();
 178 
 179   }
 180 }
 181 
 182 Address TemplateTable::at_bcp(int offset) {
 183   assert(_desc->uses_bcp(), "inconsistent uses_bcp information");
 184   return Address(r13, offset);
 185 }
 186 
 187 void TemplateTable::patch_bytecode(Bytecodes::Code bytecode, Register bc,
 188                                    Register scratch,
 189                                    bool load_bc_into_scratch/*=true*/) {
 190   if (!RewriteBytecodes) {
 191     return;