xref: /llvm-project/llvm/test/CodeGen/RISCV/inline-asm-zfh-modifier-N.ll (revision 228f88fdc8e92789e0562f8a47493493da843145)
1*228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=zfh -verify-machineinstrs -no-integrated-as < %s \
3*228f88fdSSam Elliott; RUN:   -target-abi=ilp32f | FileCheck -check-prefix=RV32ZFH %s
4*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=zfh -verify-machineinstrs -no-integrated-as < %s \
5*228f88fdSSam Elliott; RUN:   -target-abi=lp64f | FileCheck -check-prefix=RV64ZFH %s
6*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=zfh,+d -verify-machineinstrs -no-integrated-as < %s \
7*228f88fdSSam Elliott; RUN:   -target-abi=ilp32d | FileCheck -check-prefix=RV32DZFH %s
8*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=zfh,+d -verify-machineinstrs -no-integrated-as < %s \
9*228f88fdSSam Elliott; RUN:   -target-abi=lp64d | FileCheck -check-prefix=RV64DZFH %s
10*228f88fdSSam Elliott
11*228f88fdSSam Elliott;; `.insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)` is
12*228f88fdSSam Elliott;; the raw encoding for `fadd.h`
13*228f88fdSSam Elliott
14*228f88fdSSam Elliott@gh = external global half
15*228f88fdSSam Elliott
16*228f88fdSSam Elliottdefine half @constraint_f_half(half %a) nounwind {
17*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_f_half:
18*228f88fdSSam Elliott; RV32ZFH:       # %bb.0:
19*228f88fdSSam Elliott; RV32ZFH-NEXT:    lui a0, %hi(gh)
20*228f88fdSSam Elliott; RV32ZFH-NEXT:    flh fa5, %lo(gh)(a0)
21*228f88fdSSam Elliott; RV32ZFH-NEXT:    #APP
22*228f88fdSSam Elliott; RV32ZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
23*228f88fdSSam Elliott; RV32ZFH-NEXT:    #NO_APP
24*228f88fdSSam Elliott; RV32ZFH-NEXT:    ret
25*228f88fdSSam Elliott;
26*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_f_half:
27*228f88fdSSam Elliott; RV64ZFH:       # %bb.0:
28*228f88fdSSam Elliott; RV64ZFH-NEXT:    lui a0, %hi(gh)
29*228f88fdSSam Elliott; RV64ZFH-NEXT:    flh fa5, %lo(gh)(a0)
30*228f88fdSSam Elliott; RV64ZFH-NEXT:    #APP
31*228f88fdSSam Elliott; RV64ZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
32*228f88fdSSam Elliott; RV64ZFH-NEXT:    #NO_APP
33*228f88fdSSam Elliott; RV64ZFH-NEXT:    ret
34*228f88fdSSam Elliott;
35*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_f_half:
36*228f88fdSSam Elliott; RV32DZFH:       # %bb.0:
37*228f88fdSSam Elliott; RV32DZFH-NEXT:    lui a0, %hi(gh)
38*228f88fdSSam Elliott; RV32DZFH-NEXT:    flh fa5, %lo(gh)(a0)
39*228f88fdSSam Elliott; RV32DZFH-NEXT:    #APP
40*228f88fdSSam Elliott; RV32DZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
41*228f88fdSSam Elliott; RV32DZFH-NEXT:    #NO_APP
42*228f88fdSSam Elliott; RV32DZFH-NEXT:    ret
43*228f88fdSSam Elliott;
44*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_f_half:
45*228f88fdSSam Elliott; RV64DZFH:       # %bb.0:
46*228f88fdSSam Elliott; RV64DZFH-NEXT:    lui a0, %hi(gh)
47*228f88fdSSam Elliott; RV64DZFH-NEXT:    flh fa5, %lo(gh)(a0)
48*228f88fdSSam Elliott; RV64DZFH-NEXT:    #APP
49*228f88fdSSam Elliott; RV64DZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
50*228f88fdSSam Elliott; RV64DZFH-NEXT:    #NO_APP
51*228f88fdSSam Elliott; RV64DZFH-NEXT:    ret
52*228f88fdSSam Elliott  %1 = load half, ptr @gh
53*228f88fdSSam Elliott  %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=f,f,f"(half %a, half %1)
54*228f88fdSSam Elliott  ret half %2
55*228f88fdSSam Elliott}
56*228f88fdSSam Elliott
57*228f88fdSSam Elliottdefine half @constraint_cf_half(half %a) nounwind {
58*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_cf_half:
59*228f88fdSSam Elliott; RV32ZFH:       # %bb.0:
60*228f88fdSSam Elliott; RV32ZFH-NEXT:    lui a0, %hi(gh)
61*228f88fdSSam Elliott; RV32ZFH-NEXT:    flh fa5, %lo(gh)(a0)
62*228f88fdSSam Elliott; RV32ZFH-NEXT:    #APP
63*228f88fdSSam Elliott; RV32ZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
64*228f88fdSSam Elliott; RV32ZFH-NEXT:    #NO_APP
65*228f88fdSSam Elliott; RV32ZFH-NEXT:    ret
66*228f88fdSSam Elliott;
67*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_cf_half:
68*228f88fdSSam Elliott; RV64ZFH:       # %bb.0:
69*228f88fdSSam Elliott; RV64ZFH-NEXT:    lui a0, %hi(gh)
70*228f88fdSSam Elliott; RV64ZFH-NEXT:    flh fa5, %lo(gh)(a0)
71*228f88fdSSam Elliott; RV64ZFH-NEXT:    #APP
72*228f88fdSSam Elliott; RV64ZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
73*228f88fdSSam Elliott; RV64ZFH-NEXT:    #NO_APP
74*228f88fdSSam Elliott; RV64ZFH-NEXT:    ret
75*228f88fdSSam Elliott;
76*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_cf_half:
77*228f88fdSSam Elliott; RV32DZFH:       # %bb.0:
78*228f88fdSSam Elliott; RV32DZFH-NEXT:    lui a0, %hi(gh)
79*228f88fdSSam Elliott; RV32DZFH-NEXT:    flh fa5, %lo(gh)(a0)
80*228f88fdSSam Elliott; RV32DZFH-NEXT:    #APP
81*228f88fdSSam Elliott; RV32DZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
82*228f88fdSSam Elliott; RV32DZFH-NEXT:    #NO_APP
83*228f88fdSSam Elliott; RV32DZFH-NEXT:    ret
84*228f88fdSSam Elliott;
85*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_cf_half:
86*228f88fdSSam Elliott; RV64DZFH:       # %bb.0:
87*228f88fdSSam Elliott; RV64DZFH-NEXT:    lui a0, %hi(gh)
88*228f88fdSSam Elliott; RV64DZFH-NEXT:    flh fa5, %lo(gh)(a0)
89*228f88fdSSam Elliott; RV64DZFH-NEXT:    #APP
90*228f88fdSSam Elliott; RV64DZFH-NEXT:    .insn 0x4, 0x04000053 | (10 << 7) | (10 << 15) | (15 << 20)
91*228f88fdSSam Elliott; RV64DZFH-NEXT:    #NO_APP
92*228f88fdSSam Elliott; RV64DZFH-NEXT:    ret
93*228f88fdSSam Elliott  %1 = load half, ptr @gh
94*228f88fdSSam Elliott  %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=^cf,^cf,^cf"(half %a, half %1)
95*228f88fdSSam Elliott  ret half %2
96*228f88fdSSam Elliott}
97*228f88fdSSam Elliott
98*228f88fdSSam Elliottdefine half @constraint_f_half_abi_name(half %a) nounwind {
99*228f88fdSSam Elliott; RV32ZFH-LABEL: constraint_f_half_abi_name:
100*228f88fdSSam Elliott; RV32ZFH:       # %bb.0:
101*228f88fdSSam Elliott; RV32ZFH-NEXT:    addi sp, sp, -16
102*228f88fdSSam Elliott; RV32ZFH-NEXT:    fsw fs0, 12(sp) # 4-byte Folded Spill
103*228f88fdSSam Elliott; RV32ZFH-NEXT:    lui a0, %hi(gh)
104*228f88fdSSam Elliott; RV32ZFH-NEXT:    flh fs0, %lo(gh)(a0)
105*228f88fdSSam Elliott; RV32ZFH-NEXT:    #APP
106*228f88fdSSam Elliott; RV32ZFH-NEXT:    .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20)
107*228f88fdSSam Elliott; RV32ZFH-NEXT:    #NO_APP
108*228f88fdSSam Elliott; RV32ZFH-NEXT:    fmv.h fa0, ft0
109*228f88fdSSam Elliott; RV32ZFH-NEXT:    flw fs0, 12(sp) # 4-byte Folded Reload
110*228f88fdSSam Elliott; RV32ZFH-NEXT:    addi sp, sp, 16
111*228f88fdSSam Elliott; RV32ZFH-NEXT:    ret
112*228f88fdSSam Elliott;
113*228f88fdSSam Elliott; RV64ZFH-LABEL: constraint_f_half_abi_name:
114*228f88fdSSam Elliott; RV64ZFH:       # %bb.0:
115*228f88fdSSam Elliott; RV64ZFH-NEXT:    addi sp, sp, -16
116*228f88fdSSam Elliott; RV64ZFH-NEXT:    fsw fs0, 12(sp) # 4-byte Folded Spill
117*228f88fdSSam Elliott; RV64ZFH-NEXT:    lui a0, %hi(gh)
118*228f88fdSSam Elliott; RV64ZFH-NEXT:    flh fs0, %lo(gh)(a0)
119*228f88fdSSam Elliott; RV64ZFH-NEXT:    #APP
120*228f88fdSSam Elliott; RV64ZFH-NEXT:    .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20)
121*228f88fdSSam Elliott; RV64ZFH-NEXT:    #NO_APP
122*228f88fdSSam Elliott; RV64ZFH-NEXT:    fmv.h fa0, ft0
123*228f88fdSSam Elliott; RV64ZFH-NEXT:    flw fs0, 12(sp) # 4-byte Folded Reload
124*228f88fdSSam Elliott; RV64ZFH-NEXT:    addi sp, sp, 16
125*228f88fdSSam Elliott; RV64ZFH-NEXT:    ret
126*228f88fdSSam Elliott;
127*228f88fdSSam Elliott; RV32DZFH-LABEL: constraint_f_half_abi_name:
128*228f88fdSSam Elliott; RV32DZFH:       # %bb.0:
129*228f88fdSSam Elliott; RV32DZFH-NEXT:    addi sp, sp, -16
130*228f88fdSSam Elliott; RV32DZFH-NEXT:    fsd fs0, 8(sp) # 8-byte Folded Spill
131*228f88fdSSam Elliott; RV32DZFH-NEXT:    lui a0, %hi(gh)
132*228f88fdSSam Elliott; RV32DZFH-NEXT:    flh fs0, %lo(gh)(a0)
133*228f88fdSSam Elliott; RV32DZFH-NEXT:    #APP
134*228f88fdSSam Elliott; RV32DZFH-NEXT:    .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20)
135*228f88fdSSam Elliott; RV32DZFH-NEXT:    #NO_APP
136*228f88fdSSam Elliott; RV32DZFH-NEXT:    fmv.h fa0, ft0
137*228f88fdSSam Elliott; RV32DZFH-NEXT:    fld fs0, 8(sp) # 8-byte Folded Reload
138*228f88fdSSam Elliott; RV32DZFH-NEXT:    addi sp, sp, 16
139*228f88fdSSam Elliott; RV32DZFH-NEXT:    ret
140*228f88fdSSam Elliott;
141*228f88fdSSam Elliott; RV64DZFH-LABEL: constraint_f_half_abi_name:
142*228f88fdSSam Elliott; RV64DZFH:       # %bb.0:
143*228f88fdSSam Elliott; RV64DZFH-NEXT:    addi sp, sp, -16
144*228f88fdSSam Elliott; RV64DZFH-NEXT:    fsd fs0, 8(sp) # 8-byte Folded Spill
145*228f88fdSSam Elliott; RV64DZFH-NEXT:    lui a0, %hi(gh)
146*228f88fdSSam Elliott; RV64DZFH-NEXT:    flh fs0, %lo(gh)(a0)
147*228f88fdSSam Elliott; RV64DZFH-NEXT:    #APP
148*228f88fdSSam Elliott; RV64DZFH-NEXT:    .insn 0x4, 0x04000053 | (0 << 7) | (10 << 15) | (8 << 20)
149*228f88fdSSam Elliott; RV64DZFH-NEXT:    #NO_APP
150*228f88fdSSam Elliott; RV64DZFH-NEXT:    fmv.h fa0, ft0
151*228f88fdSSam Elliott; RV64DZFH-NEXT:    fld fs0, 8(sp) # 8-byte Folded Reload
152*228f88fdSSam Elliott; RV64DZFH-NEXT:    addi sp, sp, 16
153*228f88fdSSam Elliott; RV64DZFH-NEXT:    ret
154*228f88fdSSam Elliott  %1 = load half, ptr @gh
155*228f88fdSSam Elliott  %2 = tail call half asm ".insn 0x4, 0x04000053 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "={ft0},{fa0},{fs0}"(half %a, half %1)
156*228f88fdSSam Elliott  ret half %2
157*228f88fdSSam Elliott}
158