[aarch64] - Only use MOV for disassembly when shifter op is LSL #0
authorEgeyar Bagcioglu <egeyar.bagcioglu@oracle.com>
Mon, 3 Dec 2018 17:31:44 +0000 (17:31 +0000)
committerRichard Earnshaw <Richard.Earnshaw@arm.com>
Mon, 3 Dec 2018 17:34:33 +0000 (17:34 +0000)
ARM Architecture Reference Manual for the profile ARMv8-A, Issue C.a,
states that MOV (register) is an alias of the ORR (shifted register)
iff shift == '00' && imm6 == '000000' && Rn == '11111'.  However, mov
is currently preferred for a broader range of orr instructions, which
is incorrect.

2018-12-03  Egeyar Bagcioglu <egeyar.bagcioglu@oracle.com>

opcodes:
PR 23193
        PR 19721
        * aarch64-tbl.h (aarch64_opcode_table): Only disassemble an ORR
encoding as MOV if the shift operation is a left shift of zero.

gas:
PR 23193
PR 19721
* testsuite/gas/aarch64/pr19721.s: Add new test cases.
* testsuite/gas/aarch64/pr19721.d: Correct existing test
cases and add new ones.

gas/ChangeLog
gas/testsuite/gas/aarch64/pr19721.d
gas/testsuite/gas/aarch64/pr19721.s
opcodes/ChangeLog
opcodes/aarch64-tbl.h

index 5a1eeea28e95dbe77f00ec4fd2b1ee5ddc4c683a..a7bcfee82fb525f0355c414be7b5f86256f1fc97 100644 (file)
@@ -1,3 +1,11 @@
+2018-12-03  Egeyar Bagcioglu  <egeyar.bagcioglu@oracle.com>
+
+       PR 23193
+       PR 19721
+       * testsuite/gas/aarch64/pr19721.s: Add new test cases.
+       * testsuite/gas/aarch64/pr19721.d: Correct existing test
+       cases and add new ones.
+
 2018-12-03  Nick Clifton  <nickc@redhat.com>
 
        PR 23941
index a621ae56e856cc7624354a2540ea6f13dbe4e2f7..785d2a205d86c0f590d26a8f13d53cbd62c59d97 100644 (file)
@@ -6,5 +6,8 @@ Disassembly of section \.text:
 
 0+000 <.*>:
    0:  aa1103e7        mov     x7, x17
-   4:  aa1167e7        mov     x7, x17, lsl #25
-   8:  aa1167e7        mov     x7, x17, lsl #25
+   4:  aa1167e7        orr     x7, xzr, x17, lsl #25
+   8:  aa1167e7        orr     x7, xzr, x17, lsl #25
+   c:  aa4003e0        orr     x0, xzr, x0, lsr #0
+  10:  aa0007e0        orr     x0, xzr, x0, lsl #1
+  14:  aa0003d0        orr     x16, x30, x0
index cda068a7e379d7f64489ed66a3891bd5b6de9e43..be2b508d539e4c38247b7704114fd2ee465e204f 100644 (file)
@@ -3,3 +3,6 @@
        mov     x7, x17
        mov     x7, x17, lsl 25
        orr     x7, xzr, x17, lsl 25
+        orr     x0, xzr, x0, lsr #0    // shift == 01
+        orr     x0, xzr, x0, lsl #1    // imm6 == 000001
+        orr     x16, x30, x0           // Rn == 11110
index 63560f11cbdce2e0392389c113bf6e3d3391b44e..a9bdb2fed889a29bc0e3e6e5dc437e2c59643135 100644 (file)
@@ -1,3 +1,10 @@
+2018-12-03  Egeyar Bagcioglu <egeyar.bagcioglu@oracle.com>
+
+       PR 23193
+        PR 19721
+        * aarch64-tbl.h (aarch64_opcode_table): Only disassemble an ORR
+       encoding as MOV if the shift operation is a left shift of zero.
+
 2018-11-29  Jim Wilson  <jimw@sifive.com>
 
        * riscv-opc.c (unimp): Mark compressed unimp as INSN_ALIAS.
index 6fb74bfaca0d3067c6d1b07a5d90946887d1b34d..0ba72cb53887be921b82efff2b4a92baba89ebc4 100644 (file)
@@ -3369,7 +3369,7 @@ struct aarch64_opcode aarch64_opcode_table[] =
   CORE_INSN ("and", 0xa000000, 0x7f200000, log_shift, 0, OP3 (Rd, Rn, Rm_SFT), QL_I3SAMER, F_SF),
   CORE_INSN ("bic", 0xa200000, 0x7f200000, log_shift, 0, OP3 (Rd, Rn, Rm_SFT), QL_I3SAMER, F_SF),
   CORE_INSN ("orr", 0x2a000000, 0x7f200000, log_shift, 0, OP3 (Rd, Rn, Rm_SFT), QL_I3SAMER, F_HAS_ALIAS | F_SF),
-  CORE_INSN ("mov", 0x2a0003e0, 0x7f2003e0, log_shift, 0, OP2 (Rd, Rm_SFT), QL_I2SAMER, F_ALIAS | F_SF),
+  CORE_INSN ("mov", 0x2a0003e0, 0x7fe0ffe0, log_shift, 0, OP2 (Rd, Rm_SFT), QL_I2SAMER, F_ALIAS | F_SF),
   CORE_INSN ("uxtw", 0x2a0003e0, 0x7f2003e0, log_shift, OP_UXTW, OP2 (Rd, Rm), QL_I2SAMEW, F_ALIAS | F_PSEUDO),
   CORE_INSN ("orn", 0x2a200000, 0x7f200000, log_shift, 0, OP3 (Rd, Rn, Rm_SFT), QL_I3SAMER, F_HAS_ALIAS | F_SF),
   CORE_INSN ("mvn", 0x2a2003e0, 0x7f2003e0, log_shift, 0, OP2 (Rd, Rm_SFT), QL_I2SAMER, F_ALIAS | F_SF),