comparison src/cpu/x86/vm/templateTable_x86_64.cpp @ 1047:beb8f45ee9f0

6889740: G1: OpenDS fails with "unhandled exception in compiled code" Summary: Incorrect code was being generated for the store operation in the null case of the aastore bytecode template. The bad code was generated by the store_heap_oop routine which takes a Register as its second argument. Passing NULL_WORD (0) as the second argument causes the value to be converted to Register(0), which is rax. Thus the generated store was "mov (dst), $rax" instead of "mov (dst), $0x0". Changed calls to store_heap_oop that pass NULL_WORD as the second argument to a new routine store_heap_oop_null. Reviewed-by: kvn, twisti
author johnc
date Thu, 29 Oct 2009 09:42:26 -0700
parents bd02caa94611
children 85f13cdfbc1d
comparison
equal deleted inserted replaced
1046:72a6752ac432 1047:beb8f45ee9f0
137 } else { 137 } else {
138 __ leaq(rdx, obj); 138 __ leaq(rdx, obj);
139 } 139 }
140 __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg); 140 __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
141 if (val == noreg) { 141 if (val == noreg) {
142 __ store_heap_oop(Address(rdx, 0), NULL_WORD); 142 __ store_heap_oop_null(Address(rdx, 0));
143 } else { 143 } else {
144 __ store_heap_oop(Address(rdx, 0), val); 144 __ store_heap_oop(Address(rdx, 0), val);
145 __ g1_write_barrier_post(rdx, val, r8, rbx); 145 __ g1_write_barrier_post(rdx, val, r8, rbx);
146 } 146 }
147 147
150 #endif // SERIALGC 150 #endif // SERIALGC
151 case BarrierSet::CardTableModRef: 151 case BarrierSet::CardTableModRef:
152 case BarrierSet::CardTableExtension: 152 case BarrierSet::CardTableExtension:
153 { 153 {
154 if (val == noreg) { 154 if (val == noreg) {
155 __ store_heap_oop(obj, NULL_WORD); 155 __ store_heap_oop_null(obj);
156 } else { 156 } else {
157 __ store_heap_oop(obj, val); 157 __ store_heap_oop(obj, val);
158 // flatten object address if needed 158 // flatten object address if needed
159 if (!precise || (obj.index() == noreg && obj.disp() == 0)) { 159 if (!precise || (obj.index() == noreg && obj.disp() == 0)) {
160 __ store_check(obj.base()); 160 __ store_check(obj.base());
166 } 166 }
167 break; 167 break;
168 case BarrierSet::ModRef: 168 case BarrierSet::ModRef:
169 case BarrierSet::Other: 169 case BarrierSet::Other:
170 if (val == noreg) { 170 if (val == noreg) {
171 __ store_heap_oop(obj, NULL_WORD); 171 __ store_heap_oop_null(obj);
172 } else { 172 } else {
173 __ store_heap_oop(obj, val); 173 __ store_heap_oop(obj, val);
174 } 174 }
175 break; 175 break;
176 default : 176 default :