Skip to content

Commit 893cd69

Browse files
authored
[RISCV][MC] Emit x8 as fp instead of s0 (#135500)
When emphasizing `X8`'s functionality related to Frame Pointer, this option can be passed.
1 parent 1380a82 commit 893cd69

File tree

4 files changed

+201
-0
lines changed

4 files changed

+201
-0
lines changed

llvm/lib/Target/RISCV/MCTargetDesc/RISCVInstPrinter.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,10 @@ static cl::opt<bool>
3434
cl::desc("Disable the emission of assembler pseudo instructions"),
3535
cl::init(false), cl::Hidden);
3636

37+
static cl::opt<bool> EmitX8AsFP("riscv-emit-x8-as-fp",
38+
cl::desc("Emit x8 as fp instead of s0"),
39+
cl::init(false), cl::Hidden);
40+
3741
// Print architectural register names rather than the ABI names (such as x2
3842
// instead of sp).
3943
// TODO: Make RISCVInstPrinter::getRegisterName non-static so that this can a
@@ -54,6 +58,11 @@ bool RISCVInstPrinter::applyTargetSpecificCLOption(StringRef Opt) {
5458
ArchRegNames = true;
5559
return true;
5660
}
61+
if (Opt == "emit-x8-as-fp") {
62+
if (!ArchRegNames)
63+
EmitX8AsFP = true;
64+
return true;
65+
}
5766

5867
return false;
5968
}
@@ -311,6 +320,13 @@ void RISCVInstPrinter::printVMaskReg(const MCInst *MI, unsigned OpNo,
311320
}
312321

313322
const char *RISCVInstPrinter::getRegisterName(MCRegister Reg) {
323+
// When PrintAliases is enabled, and EmitX8AsFP is enabled, x8 will be printed
324+
// as fp instead of s0. Note that these similar registers are not replaced:
325+
// - X8_H: used for f16 register in zhinx
326+
// - X8_W: used for f32 register in zfinx
327+
// - X8_X9: used for GPR Pair
328+
if (!ArchRegNames && EmitX8AsFP && Reg == RISCV::X8)
329+
return "fp";
314330
return getRegisterName(Reg, ArchRegNames ? RISCV::NoRegAltName
315331
: RISCV::ABIRegAltName);
316332
}
Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2+
; RUN: llc -mtriple=riscv32 -verify-machineinstrs < %s \
3+
; RUN: | FileCheck -check-prefix=RV32I-DEFAULT %s
4+
; RUN: llc -mtriple=riscv64 -verify-machineinstrs < %s \
5+
; RUN: | FileCheck -check-prefix=RV64I-DEFAULT %s
6+
; RUN: llc -mtriple=riscv32 -M emit-x8-as-fp -verify-machineinstrs < %s \
7+
; RUN: | FileCheck -check-prefix=RV32I-EMIT-FP %s
8+
; RUN: llc -mtriple=riscv64 -M emit-x8-as-fp -verify-machineinstrs < %s \
9+
; RUN: | FileCheck -check-prefix=RV64I-EMIT-FP %s
10+
; RUN: llc -mtriple=riscv32 -M numeric -M emit-x8-as-fp -verify-machineinstrs \
11+
; RUN: < %s | FileCheck -check-prefix=RV32I-NUMERIC %s
12+
; RUN: llc -mtriple=riscv64 -M numeric -M emit-x8-as-fp -verify-machineinstrs \
13+
; RUN: < %s | FileCheck -check-prefix=RV64I-NUMERIC %s
14+
15+
define signext i32 @add(i32 %0, i32 %1) #0 {
16+
; RV32I-DEFAULT-LABEL: add:
17+
; RV32I-DEFAULT: # %bb.0:
18+
; RV32I-DEFAULT-NEXT: addi sp, sp, -16
19+
; RV32I-DEFAULT-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
20+
; RV32I-DEFAULT-NEXT: sw s0, 8(sp) # 4-byte Folded Spill
21+
; RV32I-DEFAULT-NEXT: addi s0, sp, 16
22+
; RV32I-DEFAULT-NEXT: sw a0, -12(s0)
23+
; RV32I-DEFAULT-NEXT: sw a1, -16(s0)
24+
; RV32I-DEFAULT-NEXT: lw a0, -12(s0)
25+
; RV32I-DEFAULT-NEXT: lw a1, -16(s0)
26+
; RV32I-DEFAULT-NEXT: add a0, a0, a1
27+
; RV32I-DEFAULT-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
28+
; RV32I-DEFAULT-NEXT: lw s0, 8(sp) # 4-byte Folded Reload
29+
; RV32I-DEFAULT-NEXT: addi sp, sp, 16
30+
; RV32I-DEFAULT-NEXT: ret
31+
;
32+
; RV64I-DEFAULT-LABEL: add:
33+
; RV64I-DEFAULT: # %bb.0:
34+
; RV64I-DEFAULT-NEXT: addi sp, sp, -32
35+
; RV64I-DEFAULT-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
36+
; RV64I-DEFAULT-NEXT: sd s0, 16(sp) # 8-byte Folded Spill
37+
; RV64I-DEFAULT-NEXT: addi s0, sp, 32
38+
; RV64I-DEFAULT-NEXT: sw a0, -20(s0)
39+
; RV64I-DEFAULT-NEXT: sw a1, -24(s0)
40+
; RV64I-DEFAULT-NEXT: lw a0, -20(s0)
41+
; RV64I-DEFAULT-NEXT: lw a1, -24(s0)
42+
; RV64I-DEFAULT-NEXT: addw a0, a0, a1
43+
; RV64I-DEFAULT-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
44+
; RV64I-DEFAULT-NEXT: ld s0, 16(sp) # 8-byte Folded Reload
45+
; RV64I-DEFAULT-NEXT: addi sp, sp, 32
46+
; RV64I-DEFAULT-NEXT: ret
47+
;
48+
; RV32I-EMIT-FP-LABEL: add:
49+
; RV32I-EMIT-FP: # %bb.0:
50+
; RV32I-EMIT-FP-NEXT: addi sp, sp, -16
51+
; RV32I-EMIT-FP-NEXT: sw ra, 12(sp) # 4-byte Folded Spill
52+
; RV32I-EMIT-FP-NEXT: sw fp, 8(sp) # 4-byte Folded Spill
53+
; RV32I-EMIT-FP-NEXT: addi fp, sp, 16
54+
; RV32I-EMIT-FP-NEXT: sw a0, -12(fp)
55+
; RV32I-EMIT-FP-NEXT: sw a1, -16(fp)
56+
; RV32I-EMIT-FP-NEXT: lw a0, -12(fp)
57+
; RV32I-EMIT-FP-NEXT: lw a1, -16(fp)
58+
; RV32I-EMIT-FP-NEXT: add a0, a0, a1
59+
; RV32I-EMIT-FP-NEXT: lw ra, 12(sp) # 4-byte Folded Reload
60+
; RV32I-EMIT-FP-NEXT: lw fp, 8(sp) # 4-byte Folded Reload
61+
; RV32I-EMIT-FP-NEXT: addi sp, sp, 16
62+
; RV32I-EMIT-FP-NEXT: ret
63+
;
64+
; RV64I-EMIT-FP-LABEL: add:
65+
; RV64I-EMIT-FP: # %bb.0:
66+
; RV64I-EMIT-FP-NEXT: addi sp, sp, -32
67+
; RV64I-EMIT-FP-NEXT: sd ra, 24(sp) # 8-byte Folded Spill
68+
; RV64I-EMIT-FP-NEXT: sd fp, 16(sp) # 8-byte Folded Spill
69+
; RV64I-EMIT-FP-NEXT: addi fp, sp, 32
70+
; RV64I-EMIT-FP-NEXT: sw a0, -20(fp)
71+
; RV64I-EMIT-FP-NEXT: sw a1, -24(fp)
72+
; RV64I-EMIT-FP-NEXT: lw a0, -20(fp)
73+
; RV64I-EMIT-FP-NEXT: lw a1, -24(fp)
74+
; RV64I-EMIT-FP-NEXT: addw a0, a0, a1
75+
; RV64I-EMIT-FP-NEXT: ld ra, 24(sp) # 8-byte Folded Reload
76+
; RV64I-EMIT-FP-NEXT: ld fp, 16(sp) # 8-byte Folded Reload
77+
; RV64I-EMIT-FP-NEXT: addi sp, sp, 32
78+
; RV64I-EMIT-FP-NEXT: ret
79+
;
80+
; RV32I-NUMERIC-LABEL: add:
81+
; RV32I-NUMERIC: # %bb.0:
82+
; RV32I-NUMERIC-NEXT: addi x2, x2, -16
83+
; RV32I-NUMERIC-NEXT: sw x1, 12(x2) # 4-byte Folded Spill
84+
; RV32I-NUMERIC-NEXT: sw x8, 8(x2) # 4-byte Folded Spill
85+
; RV32I-NUMERIC-NEXT: addi x8, x2, 16
86+
; RV32I-NUMERIC-NEXT: sw x10, -12(x8)
87+
; RV32I-NUMERIC-NEXT: sw x11, -16(x8)
88+
; RV32I-NUMERIC-NEXT: lw x10, -12(x8)
89+
; RV32I-NUMERIC-NEXT: lw x11, -16(x8)
90+
; RV32I-NUMERIC-NEXT: add x10, x10, x11
91+
; RV32I-NUMERIC-NEXT: lw x1, 12(x2) # 4-byte Folded Reload
92+
; RV32I-NUMERIC-NEXT: lw x8, 8(x2) # 4-byte Folded Reload
93+
; RV32I-NUMERIC-NEXT: addi x2, x2, 16
94+
; RV32I-NUMERIC-NEXT: ret
95+
;
96+
; RV64I-NUMERIC-LABEL: add:
97+
; RV64I-NUMERIC: # %bb.0:
98+
; RV64I-NUMERIC-NEXT: addi x2, x2, -32
99+
; RV64I-NUMERIC-NEXT: sd x1, 24(x2) # 8-byte Folded Spill
100+
; RV64I-NUMERIC-NEXT: sd x8, 16(x2) # 8-byte Folded Spill
101+
; RV64I-NUMERIC-NEXT: addi x8, x2, 32
102+
; RV64I-NUMERIC-NEXT: sw x10, -20(x8)
103+
; RV64I-NUMERIC-NEXT: sw x11, -24(x8)
104+
; RV64I-NUMERIC-NEXT: lw x10, -20(x8)
105+
; RV64I-NUMERIC-NEXT: lw x11, -24(x8)
106+
; RV64I-NUMERIC-NEXT: addw x10, x10, x11
107+
; RV64I-NUMERIC-NEXT: ld x1, 24(x2) # 8-byte Folded Reload
108+
; RV64I-NUMERIC-NEXT: ld x8, 16(x2) # 8-byte Folded Reload
109+
; RV64I-NUMERIC-NEXT: addi x2, x2, 32
110+
; RV64I-NUMERIC-NEXT: ret
111+
%3 = alloca i32, align 4
112+
%4 = alloca i32, align 4
113+
store i32 %0, ptr %3, align 4
114+
store i32 %1, ptr %4, align 4
115+
%5 = load i32, ptr %3, align 4
116+
%6 = load i32, ptr %4, align 4
117+
%7 = add nsw i32 %5, %6
118+
ret i32 %7
119+
}
120+
121+
attributes #0 = { noinline nounwind optnone "frame-pointer"="all" }
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
# RUN: llvm-mc --disassemble -triple=riscv32 --show-encoding < %s \
2+
# RUN: | FileCheck --check-prefixes=DEFAULT %s
3+
# RUN: llvm-mc --disassemble -triple=riscv64 --show-encoding < %s \
4+
# RUN: | FileCheck --check-prefixes=DEFAULT %s
5+
# RUN: llvm-mc --disassemble -triple=riscv32 -M emit-x8-as-fp \
6+
# RUN: --show-encoding < %s | FileCheck --check-prefixes=EMIT-FP %s
7+
# RUN: llvm-mc --disassemble -triple=riscv64 -M emit-x8-as-fp \
8+
# RUN: --show-encoding < %s | FileCheck --check-prefixes=EMIT-FP %s
9+
# RUN: llvm-mc --disassemble -triple=riscv32 -M numeric -M emit-x8-as-fp \
10+
# RUN: --show-encoding < %s | FileCheck --check-prefixes=NUMERIC %s
11+
# RUN: llvm-mc --disassemble -triple=riscv64 -M numeric -M emit-x8-as-fp \
12+
# RUN: --show-encoding < %s | FileCheck --check-prefixes=NUMERIC %s
13+
14+
# DEFAULT: sw a0, -12(s0) # encoding: [0x23,0x2a,0xa4,0xfe]
15+
# EMIT-FP: sw a0, -12(fp) # encoding: [0x23,0x2a,0xa4,0xfe]
16+
# NUMERIC: sw x10, -12(x8) # encoding: [0x23,0x2a,0xa4,0xfe]
17+
0x23 0x2a 0xa4 0xfe
18+
19+
# DEFAULT: lw a0, -12(s0) # encoding: [0x03,0x25,0x44,0xff]
20+
# EMIT-FP: lw a0, -12(fp) # encoding: [0x03,0x25,0x44,0xff]
21+
# NUMERIC: lw x10, -12(x8) # encoding: [0x03,0x25,0x44,0xff]
22+
0x03 0x25 0x44 0xff

llvm/test/MC/RISCV/emit-x8-as-fp.s

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
# RUN: llvm-mc --triple=riscv32 --show-encoding < %s 2>&1 \
2+
# RUN: | FileCheck --check-prefix=DEFAULT %s
3+
# RUN: llvm-mc --triple=riscv64 --show-encoding < %s 2>&1 \
4+
# RUN: | FileCheck --check-prefix=DEFAULT %s
5+
# RUN: llvm-mc --triple=riscv32 -M emit-x8-as-fp --show-encoding < %s 2>&1 \
6+
# RUN: | FileCheck --check-prefix=EMIT-FP %s
7+
# RUN: llvm-mc --triple=riscv64 -M emit-x8-as-fp --show-encoding < %s 2>&1 \
8+
# RUN: | FileCheck --check-prefix=EMIT-FP %s
9+
# RUN: llvm-mc --triple=riscv32 -M numeric -M emit-x8-as-fp --show-encoding \
10+
# RUN: < %s 2>&1 | FileCheck --check-prefix=NUMERIC %s
11+
# RUN: llvm-mc --triple=riscv64 -M numeric -M emit-x8-as-fp --show-encoding \
12+
# RUN: < %s 2>&1 | FileCheck --check-prefix=NUMERIC %s
13+
14+
# DEFAULT: sw a0, -12(s0) # encoding: [0x23,0x2a,0xa4,0xfe]
15+
# EMIT-FP: sw a0, -12(fp) # encoding: [0x23,0x2a,0xa4,0xfe]
16+
# NUMERIC: sw x10, -12(x8) # encoding: [0x23,0x2a,0xa4,0xfe]
17+
sw a0, -12(s0)
18+
19+
# DEFAULT: lw a0, -12(s0) # encoding: [0x03,0x25,0x44,0xff]
20+
# EMIT-FP: lw a0, -12(fp) # encoding: [0x03,0x25,0x44,0xff]
21+
# NUMERIC: lw x10, -12(x8) # encoding: [0x03,0x25,0x44,0xff]
22+
lw a0, -12(s0)
23+
24+
# DEFAULT: sw a0, -12(s0) # encoding: [0x23,0x2a,0xa4,0xfe]
25+
# EMIT-FP: sw a0, -12(fp) # encoding: [0x23,0x2a,0xa4,0xfe]
26+
# NUMERIC: sw x10, -12(x8) # encoding: [0x23,0x2a,0xa4,0xfe]
27+
sw a0, -12(fp)
28+
29+
# DEFAULT: lw a0, -12(s0) # encoding: [0x03,0x25,0x44,0xff]
30+
# EMIT-FP: lw a0, -12(fp) # encoding: [0x03,0x25,0x44,0xff]
31+
# NUMERIC: lw x10, -12(x8) # encoding: [0x03,0x25,0x44,0xff]
32+
lw a0, -12(fp)
33+
34+
# DEFAULT: sw a0, -12(s0) # encoding: [0x23,0x2a,0xa4,0xfe]
35+
# EMIT-FP: sw a0, -12(fp) # encoding: [0x23,0x2a,0xa4,0xfe]
36+
# NUMERIC: sw x10, -12(x8) # encoding: [0x23,0x2a,0xa4,0xfe]
37+
sw a0, -12(x8)
38+
39+
# DEFAULT: lw a0, -12(s0) # encoding: [0x03,0x25,0x44,0xff]
40+
# EMIT-FP: lw a0, -12(fp) # encoding: [0x03,0x25,0x44,0xff]
41+
# NUMERIC: lw x10, -12(x8) # encoding: [0x03,0x25,0x44,0xff]
42+
lw a0, -12(x8)

0 commit comments

Comments
 (0)