RISC-V: PR27436, make operand C> work the same as >.
authorNelson Chu <nelson.chu@sifive.com>
Fri, 16 Apr 2021 06:50:32 +0000 (14:50 +0800)
committerNelson Chu <nelson.chu@sifive.com>
Fri, 16 Apr 2021 09:03:29 +0000 (17:03 +0800)
gas/
    PR 27436
    * config/tc-riscv.c (riscv_ip): make operand C> work the same as >.
    * testsuite/gas/riscv/shamt-32.d: New testcase.
    * testsuite/gas/riscv/shamt-32.l: Likewise.
    * testsuite/gas/riscv/shamt-32.s: Likewise.
    * testsuite/gas/riscv/shamt-64.d: Likewise.
    * testsuite/gas/riscv/shamt-64.l: Likewise.
    * testsuite/gas/riscv/shamt-64.s: Likewise.

gas/ChangeLog
gas/config/tc-riscv.c
gas/testsuite/gas/riscv/shamt-32.d [new file with mode: 0644]
gas/testsuite/gas/riscv/shamt-32.l [new file with mode: 0644]
gas/testsuite/gas/riscv/shamt-32.s [new file with mode: 0644]
gas/testsuite/gas/riscv/shamt-64.d [new file with mode: 0644]
gas/testsuite/gas/riscv/shamt-64.l [new file with mode: 0644]
gas/testsuite/gas/riscv/shamt-64.s [new file with mode: 0644]

index ed25af6ac45ac017a4009d5cca0165cfd29b20e1..8df122554a535c7916c27c44dbb2d7778b3e1804 100644 (file)
@@ -1,3 +1,14 @@
+2021-04-16  Nelson Chu  <nelson.chu@sifive.com>
+
+       PR 27436
+       * config/tc-riscv.c (riscv_ip): make operand C> work the same as >.
+       * testsuite/gas/riscv/shamt-32.d: New testcase.
+       * testsuite/gas/riscv/shamt-32.l: Likewise.
+       * testsuite/gas/riscv/shamt-32.s: Likewise.
+       * testsuite/gas/riscv/shamt-64.d: Likewise.
+       * testsuite/gas/riscv/shamt-64.l: Likewise.
+       * testsuite/gas/riscv/shamt-64.s: Likewise.
+
 2021-04-16  Lifang Xia <lifang_xia@c-sky.com>
 
        * testsuite/gas/riscv/c-zero-imm.d: Compress addi a4,a4,0 to
index 2bce5e81d924a3dde10dac45a88f4b942aa4d948..3fff33e9a11cefc88cde74cd37212ae22c0bfd77 100644 (file)
@@ -2088,11 +2088,10 @@ riscv_ip (char *str, struct riscv_cl_insn *ip, expressionS *imm_expr,
                      || regno != 0)
                    break;
                  continue;
-               case '>':
+               case '>': /* Shift amount, 0 - (XLEN-1).  */
                  if (my_getSmallExpression (imm_expr, imm_reloc, s, p)
                      || imm_expr->X_op != O_constant
-                     || imm_expr->X_add_number <= 0
-                     || imm_expr->X_add_number >= 64)
+                     || (unsigned long) imm_expr->X_add_number >= xlen)
                    break;
                  ip->insn_opcode |= ENCODE_CITYPE_IMM (imm_expr->X_add_number);
                rvc_imm_done:
diff --git a/gas/testsuite/gas/riscv/shamt-32.d b/gas/testsuite/gas/riscv/shamt-32.d
new file mode 100644 (file)
index 0000000..b756109
--- /dev/null
@@ -0,0 +1,3 @@
+#as: -march=rv32i
+#objdump: -dr
+#error_output: shamt-32.l
diff --git a/gas/testsuite/gas/riscv/shamt-32.l b/gas/testsuite/gas/riscv/shamt-32.l
new file mode 100644 (file)
index 0000000..71feee3
--- /dev/null
@@ -0,0 +1,13 @@
+.*Assembler messages:
+.*:4: Error: improper shift amount \(32\)
+.*:5: Error: improper shift amount \(63\)
+.*:9: Error: improper shift amount \(32\)
+.*:10: Error: improper shift amount \(63\)
+.*:14: Error: improper shift amount \(32\)
+.*:15: Error: improper shift amount \(63\)
+.*:20: Error: improper shift amount \(32\)
+.*:21: Error: improper shift amount \(63\)
+.*:25: Error: improper shift amount \(32\)
+.*:26: Error: improper shift amount \(63\)
+.*:30: Error: improper shift amount \(32\)
+.*:31: Error: improper shift amount \(63\)
diff --git a/gas/testsuite/gas/riscv/shamt-32.s b/gas/testsuite/gas/riscv/shamt-32.s
new file mode 100644 (file)
index 0000000..6f1a5ba
--- /dev/null
@@ -0,0 +1,31 @@
+       .option norvc
+       slli    a0, a0, 0
+       slli    a0, a0, 31
+       slli    a0, a0, 32
+       slli    a0, a0, 63
+
+       srli    a0, a0, 0
+       srli    a0, a0, 31
+       srli    a0, a0, 32
+       srli    a0, a0, 63
+
+       srai    a0, a0, 0
+       srai    a0, a0, 31
+       srai    a0, a0, 32
+       srai    a0, a0, 63
+
+       .option rvc
+       slli    a0, a0, 0
+       slli    a0, a0, 31
+       slli    a0, a0, 32
+       slli    a0, a0, 63
+
+       srli    a0, a0, 0
+       srli    a0, a0, 31
+       srli    a0, a0, 32
+       srli    a0, a0, 63
+
+       srai    a0, a0, 0
+       srai    a0, a0, 31
+       srai    a0, a0, 32
+       srai    a0, a0, 63
diff --git a/gas/testsuite/gas/riscv/shamt-64.d b/gas/testsuite/gas/riscv/shamt-64.d
new file mode 100644 (file)
index 0000000..563c7e6
--- /dev/null
@@ -0,0 +1,3 @@
+#as: -march=rv64i
+#objdump: -dr
+#error_output: shamt-64.l
diff --git a/gas/testsuite/gas/riscv/shamt-64.l b/gas/testsuite/gas/riscv/shamt-64.l
new file mode 100644 (file)
index 0000000..ded1777
--- /dev/null
@@ -0,0 +1,7 @@
+.*Assembler messages:
+.*:19: Error: improper shift amount \(32\)
+.*:20: Error: improper shift amount \(63\)
+.*:24: Error: improper shift amount \(32\)
+.*:25: Error: improper shift amount \(63\)
+.*:29: Error: improper shift amount \(32\)
+.*:30: Error: improper shift amount \(63\)
diff --git a/gas/testsuite/gas/riscv/shamt-64.s b/gas/testsuite/gas/riscv/shamt-64.s
new file mode 100644 (file)
index 0000000..703dfb2
--- /dev/null
@@ -0,0 +1,46 @@
+       .option norvc
+       slli    a0, a0, 0
+       slli    a0, a0, 31
+       slli    a0, a0, 32
+       slli    a0, a0, 63
+
+       srli    a0, a0, 0
+       srli    a0, a0, 31
+       srli    a0, a0, 32
+       srli    a0, a0, 63
+
+       srai    a0, a0, 0
+       srai    a0, a0, 31
+       srai    a0, a0, 32
+       srai    a0, a0, 63
+
+       slliw   a0, a0, 0
+       slliw   a0, a0, 31
+       slliw   a0, a0, 32
+       slliw   a0, a0, 63
+
+       srliw   a0, a0, 0
+       srliw   a0, a0, 31
+       srliw   a0, a0, 32
+       srliw   a0, a0, 63
+
+       sraiw   a0, a0, 0
+       sraiw   a0, a0, 31
+       sraiw   a0, a0, 32
+       sraiw   a0, a0, 63
+
+       .option rvc
+       slli    a0, a0, 0
+       slli    a0, a0, 31
+       slli    a0, a0, 32
+       slli    a0, a0, 63
+
+       srli    a0, a0, 0
+       srli    a0, a0, 31
+       srli    a0, a0, 32
+       srli    a0, a0, 63
+
+       srai    a0, a0, 0
+       srai    a0, a0, 31
+       srai    a0, a0, 32
+       srai    a0, a0, 63