Blob Blame History Raw
diff -r 3fc29347b27f src/cpu/ppc/vm/ppc.ad
--- openjdk/hotspot/src/cpu/ppc/vm/ppc.ad	Fri May 20 19:42:15 2016 +0100
+++ openjdk/hotspot/src/cpu/ppc/vm/ppc.ad	Thu Jun 02 17:36:55 2016 +0100
@@ -2516,8 +2516,13 @@
     MacroAssembler _masm(&cbuf);
     int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
     // Operand 'ds' requires 4-alignment.
-    assert((Idisp & 0x3) == 0, "unaligned offset");
-    __ ld($dst$$Register, Idisp, $mem$$base$$Register);
+    if (Idisp & 0x3) {
+      __ addi($dst$$Register, $mem$$base$$Register, Idisp);
+      __ ld($dst$$Register, 0, $dst$$Register);
+    } else {
+      __ ld($dst$$Register, Idisp, $mem$$base$$Register);
+      __ nop();
+    }
   %}
 
   // Load acquire.
@@ -2526,11 +2531,30 @@
     MacroAssembler _masm(&cbuf);
     int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
     // Operand 'ds' requires 4-alignment.
-    assert((Idisp & 0x3) == 0, "unaligned offset");
-    __ ld($dst$$Register, Idisp, $mem$$base$$Register);
+    if (Idisp & 0x3) {
+      __ addi($dst$$Register, $mem$$base$$Register, Idisp);
+      __ ld($dst$$Register, 0, $dst$$Register);
+    } else {
+      __ ld($dst$$Register, Idisp, $mem$$base$$Register);
+      __ nop();
+    }
     __ twi_0($dst$$Register);
     __ isync();
   %}
+  
+  enc_class enc_lwa(iRegLdst dst, memoryAlg4 mem) %{
+    // TODO: PPC port $archOpcode(ppc64Opcode_ld);
+    MacroAssembler _masm(&cbuf);
+    int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
+    // Operand 'ds' requires 4-alignment.
+    if (Idisp & 0x3) {
+      __ addi($dst$$Register, $mem$$base$$Register, Idisp);
+      __ lwa($dst$$Register, 0, $dst$$Register);
+    } else {
+      __ lwa($dst$$Register, Idisp, $mem$$base$$Register);
+      __ nop();
+    }
+  %}  
 
   enc_class enc_lfd(RegF dst, memory mem) %{
     // TODO: PPC port $archOpcode(ppc64Opcode_lfd);
@@ -2857,8 +2881,13 @@
     MacroAssembler _masm(&cbuf);
     int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
     // Operand 'ds' requires 4-alignment.
-    assert((Idisp & 0x3) == 0, "unaligned offset");
-    __ std($src$$Register, Idisp, $mem$$base$$Register);
+    if (Idisp & 0x3) {
+      __ addi($src$$Register, $mem$$base$$Register, Idisp);
+      __ std($src$$Register, Idisp, $src$$Register);
+    } else {
+      __ std($src$$Register, Idisp, $mem$$base$$Register);
+      __ nop();
+    }
   %}
 
   enc_class enc_stfs(RegF src, memory mem) %{
@@ -5467,12 +5496,8 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LWA     $dst, $mem \t// loadI2L" %}
-  size(4);
-  ins_encode %{
-    // TODO: PPC port $archOpcode(ppc64Opcode_lwa);
-    int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
-    __ lwa($dst$$Register, Idisp, $mem$$base$$Register);
-  %}
+  size(8);
+  ins_encode( enc_lwa(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
 
@@ -5484,11 +5509,18 @@
   format %{ "LWA     $dst, $mem \t// loadI2L acquire"
             "TWI     $dst\n\t"
             "ISYNC" %}
-  size(12);
+  size(16);
   ins_encode %{
     // TODO: PPC port $archOpcode(ppc64Opcode_lwa);
     int Idisp = $mem$$disp + frame_slots_bias($mem$$base, ra_);
-    __ lwa($dst$$Register, Idisp, $mem$$base$$Register);
+    // Operand 'ds' requires 4-alignment.
+    if (Idisp & 0x3) {
+      __ addi($dst$$Register, $mem$$base$$Register, Idisp);
+      __ lwa($dst$$Register, 0, $dst$$Register);
+    } else {
+      __ lwa($dst$$Register, Idisp, $mem$$base$$Register);
+      __ nop();
+    }
     __ twi_0($dst$$Register);
     __ isync();
   %}
@@ -5502,7 +5534,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// long" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5515,7 +5547,7 @@
   format %{ "LD      $dst, $mem \t// long acquire\n\t"
             "TWI     $dst\n\t"
             "ISYNC" %}
-  size(12);
+  size(16);
   ins_encode( enc_ld_ac(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5527,7 +5559,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// unaligned long" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5541,7 +5573,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// load 8-byte Vector" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5601,7 +5633,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// ptr" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5614,7 +5646,7 @@
   format %{ "LD      $dst, $mem \t// ptr acquire\n\t"
             "TWI     $dst\n\t"
             "ISYNC" %}
-  size(12);
+  size(16);
   ins_encode( enc_ld_ac(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5626,7 +5658,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// ptr + p2x" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -5648,7 +5680,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $mem \t// klass ptr" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -6521,7 +6553,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "STD     $src, $mem \t// long" %}
-  size(4);
+  size(8);
   ins_encode( enc_std(src, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -6535,7 +6567,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "STD     $mem, $src \t// packed8B" %}
-  size(4);
+  size(8);
   ins_encode( enc_std(src, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -6568,7 +6600,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "STD     $src, $dst \t// ptr" %}
-  size(4);
+  size(8);
   ins_encode( enc_std(src, dst) );
   ins_pipe(pipe_class_memory);
 %}
@@ -7521,7 +7553,7 @@
   format %{ "LD      $dst, $mem \t// loadPLocked\n\t"
             "TWI     $dst\n\t"
             "ISYNC" %}
-  size(12);
+  size(16);
   ins_encode( enc_ld_ac(dst, mem) );
   ins_pipe(pipe_class_memory);
 %}
@@ -9287,7 +9319,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "LD      $dst, $src \t// long" %}
-  size(4);
+  size(8);
   ins_encode( enc_ld(dst, src) );
   ins_pipe(pipe_class_memory);
 %}
@@ -9298,7 +9330,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "STD     $src, $dst \t// long" %}
-  size(4);
+  size(8);
   ins_encode( enc_std(src, dst) ); // rs=rt
   ins_pipe(pipe_class_memory);
 %}
@@ -9372,7 +9404,7 @@
 instruct moveD2L_stack_reg(iRegLdst dst, stackSlotD src) %{
   match(Set dst (MoveD2L src));
   ins_cost(MEMORY_REF_COST);
-  size(4);
+  size(8);
   format %{ "LD      $dst, $src \t// MoveD2L" %}
   ins_encode( enc_ld(dst, src) );
   ins_pipe(pipe_class_memory);
@@ -9407,7 +9439,7 @@
   ins_cost(MEMORY_REF_COST);
 
   format %{ "STD     $src, $dst \t// MoveL2D" %}
-  size(4);
+  size(8);
   ins_encode( enc_std(src, dst) );
   ins_pipe(pipe_class_memory);
 %}