Reviewers: Sven Panne, Rodolph Perfetta (ARM), jbramley,

Description:
ARM64 simulator fix for EXTR

Fixes extract when imms = 0 because a left shift of 64 is not valid.

Please review this at https://codereview.chromium.org/286193004/

SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge

Affected files (+24, -18 lines):
  M src/arm64/simulator-arm64.cc
  M test/cctest/test-assembler-arm64.cc


Index: src/arm64/simulator-arm64.cc
diff --git a/src/arm64/simulator-arm64.cc b/src/arm64/simulator-arm64.cc
index c7c9f6cedd9105aef766f45f273dfcf8226d9fc1..1ae57e9e2f1fcedba8cd1db7d3eb55e1372cde59 100644
--- a/src/arm64/simulator-arm64.cc
+++ b/src/arm64/simulator-arm64.cc
@@ -2103,10 +2103,12 @@ void Simulator::VisitExtract(Instruction* instr) {
   unsigned lsb = instr->ImmS();
   unsigned reg_size = (instr->SixtyFourBits() == 1) ? kXRegSizeInBits
                                                     : kWRegSizeInBits;
-  set_reg(reg_size,
-          instr->Rd(),
-          (static_cast<uint64_t>(reg(reg_size, instr->Rm())) >> lsb) |
-          (reg(reg_size, instr->Rn()) << (reg_size - lsb)));
+  uint64_t result = reg(reg_size, instr->Rm());
+  if (lsb) {
+ result = (result >> lsb) | (reg(reg_size, instr->Rn()) << (reg_size - lsb));
+  }
+
+  set_reg(reg_size, instr->Rd(), result);
 }


Index: test/cctest/test-assembler-arm64.cc
diff --git a/test/cctest/test-assembler-arm64.cc b/test/cctest/test-assembler-arm64.cc index c89cccef7ff62023a35311f0a3347012b0357d7e..6550ad0cf9e167409d6b9f17fa75ce4f330edd2b 100644
--- a/test/cctest/test-assembler-arm64.cc
+++ b/test/cctest/test-assembler-arm64.cc
@@ -4893,26 +4893,30 @@ TEST(extr) {
   __ Mov(x2, 0xfedcba9876543210L);

   __ Extr(w10, w1, w2, 0);
-  __ Extr(w11, w1, w2, 1);
-  __ Extr(x12, x2, x1, 2);
+  __ Extr(x11, x1, x2, 0);
+  __ Extr(w12, w1, w2, 1);
+  __ Extr(x13, x2, x1, 2);

-  __ Ror(w13, w1, 0);
-  __ Ror(w14, w2, 17);
-  __ Ror(w15, w1, 31);
-  __ Ror(x18, x2, 1);
-  __ Ror(x19, x1, 63);
+  __ Ror(w20, w1, 0);
+  __ Ror(x21, x1, 0);
+  __ Ror(w22, w2, 17);
+  __ Ror(w23, w1, 31);
+  __ Ror(x24, x2, 1);
+  __ Ror(x25, x1, 63);
   END();

   RUN();

   ASSERT_EQUAL_64(0x76543210, x10);
-  ASSERT_EQUAL_64(0xbb2a1908, x11);
-  ASSERT_EQUAL_64(0x0048d159e26af37bUL, x12);
-  ASSERT_EQUAL_64(0x89abcdef, x13);
-  ASSERT_EQUAL_64(0x19083b2a, x14);
-  ASSERT_EQUAL_64(0x13579bdf, x15);
-  ASSERT_EQUAL_64(0x7f6e5d4c3b2a1908UL, x18);
-  ASSERT_EQUAL_64(0x02468acf13579bdeUL, x19);
+  ASSERT_EQUAL_64(0xfedcba9876543210L, x11);
+  ASSERT_EQUAL_64(0xbb2a1908, x12);
+  ASSERT_EQUAL_64(0x0048d159e26af37bUL, x13);
+  ASSERT_EQUAL_64(0x89abcdef, x20);
+  ASSERT_EQUAL_64(0x0123456789abcdefL, x21);
+  ASSERT_EQUAL_64(0x19083b2a, x22);
+  ASSERT_EQUAL_64(0x13579bdf, x23);
+  ASSERT_EQUAL_64(0x7f6e5d4c3b2a1908UL, x24);
+  ASSERT_EQUAL_64(0x02468acf13579bdeUL, x25);

   TEARDOWN();
 }


--
--
v8-dev mailing list
v8-dev@googlegroups.com
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to v8-dev+unsubscr...@googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to