diff 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
line wrap: on
line diff
--- a/src/cpu/x86/vm/templateTable_x86_64.cpp	Wed Oct 28 11:16:42 2009 -0700
+++ b/src/cpu/x86/vm/templateTable_x86_64.cpp	Thu Oct 29 09:42:26 2009 -0700
@@ -139,7 +139,7 @@
         }
         __ g1_write_barrier_pre(rdx, r8, rbx, val != noreg);
         if (val == noreg) {
-          __ store_heap_oop(Address(rdx, 0), NULL_WORD);
+          __ store_heap_oop_null(Address(rdx, 0));
         } else {
           __ store_heap_oop(Address(rdx, 0), val);
           __ g1_write_barrier_post(rdx, val, r8, rbx);
@@ -152,7 +152,7 @@
     case BarrierSet::CardTableExtension:
       {
         if (val == noreg) {
-          __ store_heap_oop(obj, NULL_WORD);
+          __ store_heap_oop_null(obj);
         } else {
           __ store_heap_oop(obj, val);
           // flatten object address if needed
@@ -168,7 +168,7 @@
     case BarrierSet::ModRef:
     case BarrierSet::Other:
       if (val == noreg) {
-        __ store_heap_oop(obj, NULL_WORD);
+        __ store_heap_oop_null(obj);
       } else {
         __ store_heap_oop(obj, val);
       }