< prev index next >

src/cpu/sparc/vm/c1_LIRAssembler_sparc.cpp

Print this page
rev 12906 : [mq]: gc_interface

@@ -2565,13 +2565,14 @@
 
 }
 
 
 void LIR_Assembler::emit_compare_and_swap(LIR_OpCompareAndSwap* op) {
+  LIR_Address* address = op->addr()->as_address_ptr();
   if (op->code() == lir_cas_long) {
     assert(VM_Version::supports_cx8(), "wrong machine");
-    Register addr = op->addr()->as_pointer_register();
+    Register addr = address->base()->as_pointer_register();
     Register cmp_value_lo = op->cmp_value()->as_register_lo();
     Register cmp_value_hi = op->cmp_value()->as_register_hi();
     Register new_value_lo = op->new_value()->as_register_lo();
     Register new_value_hi = op->new_value()->as_register_hi();
     Register t1 = op->tmp1()->as_register();

@@ -2582,11 +2583,11 @@
     __ casx(addr, t1, t2);
     // generate condition code - if the swap succeeded, t2 ("new value" reg) was
     // overwritten with the original value in "addr" and will be equal to t1.
     __ cmp(t1, t2);
   } else if (op->code() == lir_cas_int || op->code() == lir_cas_obj) {
-    Register addr = op->addr()->as_pointer_register();
+    Register addr = address->base()->as_pointer_register();
     Register cmp_value = op->cmp_value()->as_register();
     Register new_value = op->new_value()->as_register();
     Register t1 = op->tmp1()->as_register();
     Register t2 = op->tmp2()->as_register();
     __ mov(cmp_value, t1);

@@ -3162,20 +3163,35 @@
   assert_different_registers(rs, rd, rd->successor());
   __ srlx(rs, 32, rd);
   __ srl (rs,  0, rd->successor());
 }
 
-
 void LIR_Assembler::leal(LIR_Opr addr_opr, LIR_Opr dest) {
-  LIR_Address* addr = addr_opr->as_address_ptr();
-  assert(addr->index()->is_illegal() && addr->scale() == LIR_Address::times_1, "can't handle complex addresses yet");
+  const LIR_Address* addr = addr_opr->as_address_ptr();
+  assert(addr->scale() == LIR_Address::times_1, "can't handle complex addresses yet");
+  const Register dest_reg = dest->as_pointer_register();
+  const Register base_reg = addr->base()->as_pointer_register();
 
   if (Assembler::is_simm13(addr->disp())) {
-    __ add(addr->base()->as_pointer_register(), addr->disp(), dest->as_pointer_register());
+    if (addr->index()->is_valid()) {
+      const Register index_reg = addr->index()->as_pointer_register();
+      assert(index_reg != G3_scratch, "invariant");
+      __ add(base_reg, addr->disp(), G3_scratch);
+      __ add(index_reg, G3_scratch, dest_reg);
+
+    } else {
+      __ add(base_reg, addr->disp(), dest_reg);
+    }
   } else {
     __ set(addr->disp(), G3_scratch);
-    __ add(addr->base()->as_pointer_register(), G3_scratch, dest->as_pointer_register());
+    if (addr->index()->is_valid()) {
+      const Register index_reg = addr->index()->as_pointer_register();
+      assert(index_reg != G3_scratch, "invariant");
+      __ add(index_reg, G3_scratch, G3_scratch);
+
+    }
+    __ add(base_reg, G3_scratch, dest_reg);
   }
 }
 
 
 void LIR_Assembler::get_thread(LIR_Opr result_reg) {
< prev index next >