Skip to content

Commit c361fd5

Browse files
authored
[RISCV] Fix More RV32 Signed Immediates (llvm#120658)
1 parent 95c5386 commit c361fd5

File tree

4 files changed

+95
-4
lines changed

4 files changed

+95
-4
lines changed

llvm/lib/Target/RISCV/AsmParser/RISCVAsmParser.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -530,7 +530,7 @@ struct RISCVOperand final : public MCParsedAsmOperand {
530530
if (!IsConstantImm)
531531
IsValid = RISCVAsmParser::classifySymbolRef(getImm(), VK);
532532
else
533-
IsValid = isShiftedInt<N - 1, 1>(Imm);
533+
IsValid = isShiftedInt<N - 1, 1>(fixImmediateForRV32(Imm, isRV64Imm()));
534534
return IsValid && VK == RISCVMCExpr::VK_RISCV_None;
535535
}
536536

@@ -943,7 +943,8 @@ struct RISCVOperand final : public MCParsedAsmOperand {
943943
RISCVMCExpr::VariantKind VK = RISCVMCExpr::VK_RISCV_None;
944944
int64_t Imm;
945945
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
946-
return IsConstantImm && isShiftedInt<7, 5>(Imm) &&
946+
return IsConstantImm &&
947+
isShiftedInt<7, 5>(fixImmediateForRV32(Imm, isRV64Imm())) &&
947948
VK == RISCVMCExpr::VK_RISCV_None;
948949
}
949950

@@ -955,7 +956,8 @@ struct RISCVOperand final : public MCParsedAsmOperand {
955956
int64_t Imm;
956957
RISCVMCExpr::VariantKind VK = RISCVMCExpr::VK_RISCV_None;
957958
bool IsConstantImm = evaluateConstantImm(getImm(), Imm, VK);
958-
return IsConstantImm && (Imm != 0) && isShiftedInt<6, 4>(Imm) &&
959+
return IsConstantImm && (Imm != 0) &&
960+
isShiftedInt<6, 4>(fixImmediateForRV32(Imm, isRV64Imm())) &&
959961
VK == RISCVMCExpr::VK_RISCV_None;
960962
}
961963

llvm/test/MC/RISCV/rv32c-only-valid.s

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,31 @@ c.jal 2046
2626
# CHECK-ASM: c.addi a1, -1
2727
# CHECK-ASM: encoding: [0xfd,0x15]
2828
c.addi a1, 0xffffffff
29+
30+
# CHECK-OBJ: c.addi16sp sp, -352
31+
# CHECK-ASM: c.addi16sp sp, -352
32+
# CHECK-ASM: encoding: [0x0d,0x71]
33+
c.addi16sp sp, 0xfffffea0
34+
35+
## Branch and Jump immediates are relative but printed as their absolute address
36+
## when disassembling.
37+
38+
# CHECK-OBJ: c.beqz a2, 0xffffff06
39+
# CHECK-ASM: c.beqz a2, -256
40+
# CHECK-ASM: encoding: [0x01,0xd2]
41+
c.beqz a2, 0xffffff00
42+
43+
# CHECK-OBJ: c.beqz a0, 0xffffff16
44+
# CHECK-ASM: .insn cb 1, 6, a0, -242
45+
# CHECK-ASM: encoding: [0x19,0xd5]
46+
.insn cb 1, 6, a0, 0xffffff0e
47+
48+
# CHECK-OBJ: c.jal 0xfffffab4
49+
# CHECK-ASM: c.jal -1366
50+
# CHECK-ASM: encoding: [0x6d,0x34]
51+
c.jal 0xfffffaaa
52+
53+
# CHECK-OBJ: c.j 0xfffffcd8
54+
# CHECK-ASM: .insn cj 1, 5, -820
55+
# CHECK-ASM: encoding: [0xf1,0xb1]
56+
.insn cj 1, 5, 0xfffffccc

llvm/test/MC/RISCV/rv32i-only-valid.s

Lines changed: 44 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
33
# RUN: llvm-mc -filetype=obj -triple=riscv32 < %s \
44
# RUN: | llvm-objdump -M no-aliases --no-print-imm-hex -d -r - \
5-
# RUN: | FileCheck -check-prefixes=CHECK-ASM-AND-OBJ %s
5+
# RUN: | FileCheck -check-prefixes=CHECK-OBJ,CHECK-ASM-AND-OBJ %s
66

77
# CHECK-ASM-AND-OBJ: addi a0, a1, -1
88
# CHECK-ASM: encoding: [0x13,0x85,0xf5,0xff]
@@ -16,3 +16,46 @@ lw a1, 0xfffff9ab(a2)
1616
# CHECK-ASM-AND-OBJ: sw a1, -8(a2)
1717
# CHECK-ASM: encoding: [0x23,0x2c,0xb6,0xfe]
1818
sw a1, 0xfffffff8(a2)
19+
20+
## Branch and Jump immediates are relative but printed as their absolute address
21+
## when disassembling.
22+
23+
# CHECK-ASM: beq t0, t1, -4096
24+
# CHECK-ASM: encoding: [0x63,0x80,0x62,0x80]
25+
# CHECK-OBJ: beq t0, t1, 0xfffff010
26+
beq t0, t1, 0xfffff000
27+
28+
# CHECK-ASM: bne t1, t2, -4082
29+
# CHECK-ASM: encoding: [0x63,0x17,0x73,0x80]
30+
# CHECK-OBJ: bne t1, t2, 0xfffff022
31+
bne t1, t2, 0xfffff00e
32+
33+
# CHECK-ASM: beq t2, zero, -3550
34+
# CHECK-ASM: encoding: [0x63,0x81,0x03,0xa2]
35+
# CHECK-OBJ: beq t2, zero, 0xfffff23a
36+
beqz t2, 0xfffff222
37+
38+
# CHECK-ASM: .insn b 99, 0, a0, a1, -3004
39+
# CHECK-ASM: encoding: [0x63,0x02,0xb5,0xc4]
40+
# CHECK-OBJ: beq a0, a1, 0xfffff460
41+
.insn b BRANCH, 0, a0, a1, 0xfffff444
42+
43+
# CHECK-ASM: jal ra, -2458
44+
# CHECK-ASM: encoding: [0xef,0xf0,0x6f,0xe6]
45+
# CHECK-OBJ: jal ra, 0xfffff686
46+
jal ra, 0xfffff666
47+
48+
# CHECK-ASM: jal ra, -1912
49+
# CHECK-ASM: encoding: [0xef,0xf0,0x9f,0x88]
50+
# CHECK-OBJ: jal ra, 0xfffff8ac
51+
jal 0xfffff888
52+
53+
# CHECK-ASM: jal zero, -1366
54+
# CHECK-ASM: encoding: [0x6f,0xf0,0xbf,0xaa]
55+
# CHECK-OBJ: jal zero, 0xfffffad2
56+
j 0xfffffaaa
57+
58+
# CHECK-ASM: .insn j 111, a0, -820
59+
# CHECK-ASM: encoding: [0x6f,0x65,0xe6,0xff]
60+
# CHECK-OBJ: jal a0, 0xfff6682a
61+
.insn j JAL, a0, 0xfffffccc
Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
# RUN: llvm-mc %s -triple=riscv32 -mattr=+zicbop -show-encoding \
2+
# RUN: | FileCheck -check-prefixes=CHECK-ASM,CHECK-ASM-AND-OBJ %s
3+
# RUN: llvm-mc -filetype=obj -triple=riscv32 -mattr=+zicbop < %s \
4+
# RUN: | llvm-objdump --no-print-imm-hex --mattr=+zicbop -d -r - \
5+
# RUN: | FileCheck --check-prefix=CHECK-ASM-AND-OBJ %s
6+
7+
## This test checks that 32-bit hex immediates are accepted for the `prefetch.*`
8+
## instructions on rv32.
9+
10+
# CHECK-ASM-AND-OBJ: prefetch.i -2048(t0)
11+
# CHECK-ASM: encoding: [0x13,0xe0,0x02,0x80]
12+
prefetch.i 0xfffff800(t0)
13+
# CHECK-ASM-AND-OBJ: prefetch.r -2048(t1)
14+
# CHECK-ASM: encoding: [0x13,0x60,0x13,0x80]
15+
prefetch.r 0xfffff800(t1)
16+
# CHECK-ASM-AND-OBJ: prefetch.w -2048(t2)
17+
# CHECK-ASM: encoding: [0x13,0xe0,0x33,0x80]
18+
prefetch.w 0xfffff800(t2)

0 commit comments

Comments
 (0)