diff options
author | Craig Topper <craig.topper@sifive.com> | 2025-07-26 00:05:33 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-07-26 00:05:33 -0700 |
commit | 1669bd3ae9af0cac4414479d8f1e53e329fa3efb (patch) | |
tree | 7a1d21973bf721a6393f54684a5fce38f6e997bb /llvm/test | |
parent | b22e22ebfa546cc31e166dd5ca4cc808aa057c9b (diff) | |
download | llvm-1669bd3ae9af0cac4414479d8f1e53e329fa3efb.zip llvm-1669bd3ae9af0cac4414479d8f1e53e329fa3efb.tar.gz llvm-1669bd3ae9af0cac4414479d8f1e53e329fa3efb.tar.bz2 |
[RISCV] Accept c.slli/c.srli/c.srli with a 0 immediate as hints. (#150689)
These encodings were previously assigned to c.slli64/srli64/srai64, and
designated as hints for RV32 and RV64. Those mnemonics no longer appear
in the ISA manual after RV128 was removed. The spec now says that
c.slli/c.srli/c.srai with an immediate of 0 is a hint.
This patch updates the assembler to accept this. I've left the old
spelling for backwards compatibility but we disassemble a shift with a
zero immediate. The C_SLLI64_HINT/C_SRLI_HINT/C_SRAI_HINT instructions
are removed and the predicates for C_SLLI/C_SRLI/C_SRAI not accept a 0
immediate.
Fixes #150304
Diffstat (limited to 'llvm/test')
-rw-r--r-- | llvm/test/MC/Disassembler/RISCV/c_slli.txt | 64 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rv32c-invalid.s | 7 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rv64c-invalid.s | 7 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rvc-hints-invalid.s | 7 | ||||
-rw-r--r-- | llvm/test/MC/RISCV/rvc-hints-valid.s | 24 |
5 files changed, 60 insertions, 49 deletions
diff --git a/llvm/test/MC/Disassembler/RISCV/c_slli.txt b/llvm/test/MC/Disassembler/RISCV/c_slli.txt index 2520455..d8d65ef 100644 --- a/llvm/test/MC/Disassembler/RISCV/c_slli.txt +++ b/llvm/test/MC/Disassembler/RISCV/c_slli.txt @@ -14,7 +14,7 @@ # RUN: -M no-aliases --show-encoding < %s 2>&1 | \ # RUN: FileCheck --check-prefix=NOHINTS %s -# GOOD: c.slli64 zero +# GOOD: c.slli zero, 0 # NOHINTS: invalid instruction encoding 0x02 0x00 @@ -302,7 +302,7 @@ # NOHINTS: invalid instruction encoding 0x7E 0x10 -# GOOD: c.slli64 ra +# GOOD: c.slli ra, 0 0x82 0x00 # GOOD: c.slli ra, 1 @@ -526,7 +526,7 @@ # GOOD64: c.slli ra, 63 0xFE 0x10 -# GOOD: c.slli64 sp +# GOOD: c.slli sp, 0 0x02 0x01 # GOOD: c.slli sp, 1 @@ -750,7 +750,7 @@ # GOOD64: c.slli sp, 63 0x7E 0x11 -# GOOD: c.slli64 gp +# GOOD: c.slli gp, 0 0x82 0x01 # GOOD: c.slli gp, 1 @@ -974,7 +974,7 @@ # GOOD64: c.slli gp, 63 0xFE 0x11 -# GOOD: c.slli64 tp +# GOOD: c.slli tp, 0 0x02 0x02 # GOOD: c.slli tp, 1 @@ -1198,7 +1198,7 @@ # GOOD64: c.slli tp, 63 0x7E 0x12 -# GOOD: c.slli64 t0 +# GOOD: c.slli t0, 0 0x82 0x02 # GOOD: c.slli t0, 1 @@ -1422,7 +1422,7 @@ # GOOD64: c.slli t0, 63 0xFE 0x12 -# GOOD: c.slli64 t1 +# GOOD: c.slli t1, 0 0x02 0x03 # GOOD: c.slli t1, 1 @@ -1646,7 +1646,7 @@ # GOOD64: c.slli t1, 63 0x7E 0x13 -# GOOD: c.slli64 t2 +# GOOD: c.slli t2, 0 0x82 0x03 # GOOD: c.slli t2, 1 @@ -1870,7 +1870,7 @@ # GOOD64: c.slli t2, 63 0xFE 0x13 -# GOOD: c.slli64 s0 +# GOOD: c.slli s0, 0 0x02 0x04 # GOOD: c.slli s0, 1 @@ -2094,7 +2094,7 @@ # GOOD64: c.slli s0, 63 0x7E 0x14 -# GOOD: c.slli64 s1 +# GOOD: c.slli s1, 0 0x82 0x04 # GOOD: c.slli s1, 1 @@ -2318,7 +2318,7 @@ # GOOD64: c.slli s1, 63 0xFE 0x14 -# GOOD: c.slli64 a0 +# GOOD: c.slli a0, 0 0x02 0x05 # GOOD: c.slli a0, 1 @@ -2542,7 +2542,7 @@ # GOOD64: c.slli a0, 63 0x7E 0x15 -# GOOD: c.slli64 a1 +# GOOD: c.slli a1, 0 0x82 0x05 # GOOD: c.slli a1, 1 @@ -2766,7 +2766,7 @@ # GOOD64: c.slli a1, 63 0xFE 0x15 -# GOOD: c.slli64 a2 +# GOOD: c.slli a2, 0 0x02 0x06 # GOOD: c.slli a2, 1 @@ -2990,7 +2990,7 @@ # GOOD64: c.slli a2, 63 0x7E 0x16 -# GOOD: c.slli64 a3 +# GOOD: c.slli a3, 0 0x82 0x06 # GOOD: c.slli a3, 1 @@ -3214,7 +3214,7 @@ # GOOD64: c.slli a3, 63 0xFE 0x16 -# GOOD: c.slli64 a4 +# GOOD: c.slli a4, 0 0x02 0x07 # GOOD: c.slli a4, 1 @@ -3438,7 +3438,7 @@ # GOOD64: c.slli a4, 63 0x7E 0x17 -# GOOD: c.slli64 a5 +# GOOD: c.slli a5, 0 0x82 0x07 # GOOD: c.slli a5, 1 @@ -3662,7 +3662,7 @@ # GOOD64: c.slli a5, 63 0xFE 0x17 -# GOOD: c.slli64 a6 +# GOOD: c.slli a6, 0 0x02 0x08 # GOOD: c.slli a6, 1 @@ -3886,7 +3886,7 @@ # GOOD64: c.slli a6, 63 0x7E 0x18 -# GOOD: c.slli64 a7 +# GOOD: c.slli a7, 0 0x82 0x08 # GOOD: c.slli a7, 1 @@ -4110,7 +4110,7 @@ # GOOD64: c.slli a7, 63 0xFE 0x18 -# GOOD: c.slli64 s2 +# GOOD: c.slli s2, 0 0x02 0x09 # GOOD: c.slli s2, 1 @@ -4334,7 +4334,7 @@ # GOOD64: c.slli s2, 63 0x7E 0x19 -# GOOD: c.slli64 s3 +# GOOD: c.slli s3, 0 0x82 0x09 # GOOD: c.slli s3, 1 @@ -4558,7 +4558,7 @@ # GOOD64: c.slli s3, 63 0xFE 0x19 -# GOOD: c.slli64 s4 +# GOOD: c.slli s4, 0 0x02 0x0A # GOOD: c.slli s4, 1 @@ -4782,7 +4782,7 @@ # GOOD64: c.slli s4, 63 0x7E 0x1A -# GOOD: c.slli64 s5 +# GOOD: c.slli s5, 0 0x82 0x0A # GOOD: c.slli s5, 1 @@ -5006,7 +5006,7 @@ # GOOD64: c.slli s5, 63 0xFE 0x1A -# GOOD: c.slli64 s6 +# GOOD: c.slli s6, 0 0x02 0x0B # GOOD: c.slli s6, 1 @@ -5230,7 +5230,7 @@ # GOOD64: c.slli s6, 63 0x7E 0x1B -# GOOD: c.slli64 s7 +# GOOD: c.slli s7, 0 0x82 0x0B # GOOD: c.slli s7, 1 @@ -5454,7 +5454,7 @@ # GOOD64: c.slli s7, 63 0xFE 0x1B -# GOOD: c.slli64 s8 +# GOOD: c.slli s8, 0 0x02 0x0C # GOOD: c.slli s8, 1 @@ -5678,7 +5678,7 @@ # GOOD64: c.slli s8, 63 0x7E 0x1C -# GOOD: c.slli64 s9 +# GOOD: c.slli s9, 0 0x82 0x0C # GOOD: c.slli s9, 1 @@ -5902,7 +5902,7 @@ # GOOD64: c.slli s9, 63 0xFE 0x1C -# GOOD: c.slli64 s10 +# GOOD: c.slli s10, 0 0x02 0x0D # GOOD: c.slli s10, 1 @@ -6126,7 +6126,7 @@ # GOOD64: c.slli s10, 63 0x7E 0x1D -# GOOD: c.slli64 s11 +# GOOD: c.slli s11, 0 0x82 0x0D # GOOD: c.slli s11, 1 @@ -6350,7 +6350,7 @@ # GOOD64: c.slli s11, 63 0xFE 0x1D -# GOOD: c.slli64 t3 +# GOOD: c.slli t3, 0 0x02 0x0E # GOOD: c.slli t3, 1 @@ -6574,7 +6574,7 @@ # GOOD64: c.slli t3, 63 0x7E 0x1E -# GOOD: c.slli64 t4 +# GOOD: c.slli t4, 0 0x82 0x0E # GOOD: c.slli t4, 1 @@ -6798,7 +6798,7 @@ # GOOD64: c.slli t4, 63 0xFE 0x1E -# GOOD: c.slli64 t5 +# GOOD: c.slli t5, 0 0x02 0x0F # GOOD: c.slli t5, 1 @@ -7022,7 +7022,7 @@ # GOOD64: c.slli t5, 63 0x7E 0x1F -# GOOD: c.slli64 t6 +# GOOD: c.slli t6, 0 0x82 0x0F # GOOD: c.slli t6, 1 diff --git a/llvm/test/MC/RISCV/rv32c-invalid.s b/llvm/test/MC/RISCV/rv32c-invalid.s index 9492c7f..5214747 100644 --- a/llvm/test/MC/RISCV/rv32c-invalid.s +++ b/llvm/test/MC/RISCV/rv32c-invalid.s @@ -35,10 +35,9 @@ c.addi16sp t0, 16 # CHECK: :[[@LINE]]:13: error: register must be sp (x2) # Out of range immediates -## uimmlog2xlennonzero -c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31] -c.srli a0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31] -c.srai a0, 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31] +## uimmlog2xlenn +c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 31] +c.srli a0, 32 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 31] ## simm6 c.li t0, 128 # CHECK: :[[@LINE]]:10: error: immediate must be an integer in the range [-32, 31] diff --git a/llvm/test/MC/RISCV/rv64c-invalid.s b/llvm/test/MC/RISCV/rv64c-invalid.s index 9b0a324..404e02cf 100644 --- a/llvm/test/MC/RISCV/rv64c-invalid.s +++ b/llvm/test/MC/RISCV/rv64c-invalid.s @@ -13,10 +13,9 @@ c.ldsp zero, 4(sp) # CHECK: :[[@LINE]]:9: error: register must be a GPR excludi # Out of range immediates -## uimmlog2xlennonzero -c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 63] -c.srli a0, -1 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 63] -c.srai a0, 0 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 63] +## uimmlog2xlen +c.slli t0, 64 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 63] +c.srli a0, -1 # CHECK: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 63] ## simm6 c.addiw t0, -33 # CHECK: :[[@LINE]]:13: error: immediate must be an integer in the range [-32, 31] diff --git a/llvm/test/MC/RISCV/rvc-hints-invalid.s b/llvm/test/MC/RISCV/rvc-hints-invalid.s index 9af2915..540d2c6 100644 --- a/llvm/test/MC/RISCV/rvc-hints-invalid.s +++ b/llvm/test/MC/RISCV/rvc-hints-invalid.s @@ -1,7 +1,7 @@ # RUN: not llvm-mc -triple=riscv32 -mattr=+c < %s 2>&1 \ # RUN: | FileCheck -check-prefixes=CHECK,CHECK-RV32 %s # RUN: not llvm-mc -triple=riscv64 -mattr=+c < %s 2>&1 \ -# RUN: | FileCheck -check-prefixes=CHECK,CHECK-RV64 %s +# RUN: | FileCheck -check-prefixes=CHECK %s c.nop 0 # CHECK: :[[@LINE]]:7: error: immediate must be non-zero in the range [-32, 31] @@ -15,10 +15,7 @@ c.mv x0, x0 # CHECK: :[[@LINE]]:10: error: register must be a GPR excluding zero c.add x0, x0 # CHECK: :[[@LINE]]:11: error: register must be a GPR excluding zero (x0) -c.slli x0, 0 # CHECK-RV32: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31] -c.slli x0, 32 # CHECK-RV32: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 31] - -c.slli x0, 0 # CHECK-RV64: :[[@LINE]]:12: error: immediate must be an integer in the range [1, 63] +c.slli x0, 32 # CHECK-RV32: :[[@LINE]]:12: error: immediate must be an integer in the range [0, 31] c.srli64 x30 # CHECK: :[[@LINE]]:10: error: invalid operand for instruction diff --git a/llvm/test/MC/RISCV/rvc-hints-valid.s b/llvm/test/MC/RISCV/rvc-hints-valid.s index 5dc86d1..7fba864 100644 --- a/llvm/test/MC/RISCV/rvc-hints-valid.s +++ b/llvm/test/MC/RISCV/rvc-hints-valid.s @@ -48,18 +48,34 @@ c.add x0, a0 # CHECK-ASM: encoding: [0x06,0x00] c.slli x0, 1 -# CHECK-ASM-AND-OBJ: c.slli64 zero +# CHECK-ASM-AND-OBJ: c.slli zero, 0 # CHECK-ASM: encoding: [0x02,0x00] c.slli64 x0 -# CHECK-ASM-AND-OBJ: c.slli64 a0 +# CHECK-ASM-AND-OBJ: c.slli zero, 0 +# CHECK-ASM: encoding: [0x02,0x00] +c.slli x0, 0 + +# CHECK-ASM-AND-OBJ: c.slli a0, 0 # CHECK-ASM: encoding: [0x02,0x05] c.slli64 a0 -# CHECK-ASM-AND-OBJ: c.srli64 a1 +# CHECK-ASM-AND-OBJ: c.slli a0, 0 +# CHECK-ASM: encoding: [0x02,0x05] +c.slli a0, 0 + +# CHECK-ASM-AND-OBJ: c.srli a1, 0 # CHECK-ASM: encoding: [0x81,0x81] c.srli64 a1 -# CHECK-ASM-AND-OBJ: c.srai64 a0 +# CHECK-ASM-AND-OBJ: c.srli a1, 0 +# CHECK-ASM: encoding: [0x81,0x81] +c.srli a1, 0 + +# CHECK-ASM-AND-OBJ: c.srai a0, 0 # CHECK-ASM: encoding: [0x01,0x85] c.srai64 a0 + +# CHECK-ASM-AND-OBJ: c.srai a0, 0 +# CHECK-ASM: encoding: [0x01,0x85] +c.srai a0, 0 |