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