xref: /llvm-project/llvm/test/CodeGen/RISCV/inline-asm-zhinx-constraint-r.ll (revision 1bc1a79a65a93a0224b5e5f69584219f9981bd23)
1228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+zhinx -verify-machineinstrs < %s \
3228f88fdSSam Elliott; RUN:   -target-abi=ilp32 | FileCheck -check-prefix=RV32ZHINX %s
4228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+zhinx -verify-machineinstrs < %s \
5228f88fdSSam Elliott; RUN:   -target-abi=lp64 | FileCheck -check-prefix=RV64ZHINX %s
6228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+zdinx,+zhinx -verify-machineinstrs < %s \
7228f88fdSSam Elliott; RUN:   -target-abi=ilp32 | FileCheck -check-prefix=RV32DINXZHINX %s
8228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+zdinx,+zhinx -verify-machineinstrs < %s \
9228f88fdSSam Elliott; RUN:   -target-abi=lp64 | FileCheck -check-prefix=RV64DINXZHINX %s
10228f88fdSSam Elliott
11228f88fdSSam Elliott@gh = external global half
12228f88fdSSam Elliott
13228f88fdSSam Elliottdefine half @constraint_r_half(half %a) nounwind {
14228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_r_half:
15228f88fdSSam Elliott; RV32ZHINX:       # %bb.0:
16228f88fdSSam Elliott; RV32ZHINX-NEXT:    lui a1, %hi(gh)
17228f88fdSSam Elliott; RV32ZHINX-NEXT:    lh a1, %lo(gh)(a1)
18228f88fdSSam Elliott; RV32ZHINX-NEXT:    #APP
19228f88fdSSam Elliott; RV32ZHINX-NEXT:    fadd.h a0, a0, a1
20228f88fdSSam Elliott; RV32ZHINX-NEXT:    #NO_APP
21228f88fdSSam Elliott; RV32ZHINX-NEXT:    ret
22228f88fdSSam Elliott;
23228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_r_half:
24228f88fdSSam Elliott; RV64ZHINX:       # %bb.0:
25228f88fdSSam Elliott; RV64ZHINX-NEXT:    lui a1, %hi(gh)
26228f88fdSSam Elliott; RV64ZHINX-NEXT:    lh a1, %lo(gh)(a1)
27228f88fdSSam Elliott; RV64ZHINX-NEXT:    #APP
28228f88fdSSam Elliott; RV64ZHINX-NEXT:    fadd.h a0, a0, a1
29228f88fdSSam Elliott; RV64ZHINX-NEXT:    #NO_APP
30228f88fdSSam Elliott; RV64ZHINX-NEXT:    ret
31228f88fdSSam Elliott;
32228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_r_half:
33228f88fdSSam Elliott; RV32DINXZHINX:       # %bb.0:
34228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lui a1, %hi(gh)
35228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
36228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #APP
37228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    fadd.h a0, a0, a1
38228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #NO_APP
39228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    ret
40228f88fdSSam Elliott;
41228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_r_half:
42228f88fdSSam Elliott; RV64DINXZHINX:       # %bb.0:
43228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lui a1, %hi(gh)
44228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
45228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #APP
46228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    fadd.h a0, a0, a1
47228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #NO_APP
48228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    ret
49228f88fdSSam Elliott  %1 = load half, ptr @gh
50228f88fdSSam Elliott  %2 = tail call half asm "fadd.h $0, $1, $2", "=r,r,r"(half %a, half %1)
51228f88fdSSam Elliott  ret half %2
52228f88fdSSam Elliott}
53228f88fdSSam Elliott
54228f88fdSSam Elliottdefine half @constraint_cr_half(half %a) nounwind {
55228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_cr_half:
56228f88fdSSam Elliott; RV32ZHINX:       # %bb.0:
57228f88fdSSam Elliott; RV32ZHINX-NEXT:    lui a1, %hi(gh)
58228f88fdSSam Elliott; RV32ZHINX-NEXT:    lh a1, %lo(gh)(a1)
59228f88fdSSam Elliott; RV32ZHINX-NEXT:    #APP
60228f88fdSSam Elliott; RV32ZHINX-NEXT:    fadd.h a0, a0, a1
61228f88fdSSam Elliott; RV32ZHINX-NEXT:    #NO_APP
62228f88fdSSam Elliott; RV32ZHINX-NEXT:    ret
63228f88fdSSam Elliott;
64228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_cr_half:
65228f88fdSSam Elliott; RV64ZHINX:       # %bb.0:
66228f88fdSSam Elliott; RV64ZHINX-NEXT:    lui a1, %hi(gh)
67228f88fdSSam Elliott; RV64ZHINX-NEXT:    lh a1, %lo(gh)(a1)
68228f88fdSSam Elliott; RV64ZHINX-NEXT:    #APP
69228f88fdSSam Elliott; RV64ZHINX-NEXT:    fadd.h a0, a0, a1
70228f88fdSSam Elliott; RV64ZHINX-NEXT:    #NO_APP
71228f88fdSSam Elliott; RV64ZHINX-NEXT:    ret
72228f88fdSSam Elliott;
73228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_cr_half:
74228f88fdSSam Elliott; RV32DINXZHINX:       # %bb.0:
75228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lui a1, %hi(gh)
76228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
77228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #APP
78228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    fadd.h a0, a0, a1
79228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #NO_APP
80228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    ret
81228f88fdSSam Elliott;
82228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_cr_half:
83228f88fdSSam Elliott; RV64DINXZHINX:       # %bb.0:
84228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lui a1, %hi(gh)
85228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
86228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #APP
87228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    fadd.h a0, a0, a1
88228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #NO_APP
89228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    ret
90228f88fdSSam Elliott  %1 = load half, ptr @gh
91228f88fdSSam Elliott  %2 = tail call half asm "fadd.h $0, $1, $2", "=^cr,^cr,^cr"(half %a, half %1)
92228f88fdSSam Elliott  ret half %2
93228f88fdSSam Elliott}
94228f88fdSSam Elliott
95228f88fdSSam Elliottdefine half @constraint_half_abi_name(half %a) nounwind {
96228f88fdSSam Elliott; RV32ZHINX-LABEL: constraint_half_abi_name:
97228f88fdSSam Elliott; RV32ZHINX:       # %bb.0:
98228f88fdSSam Elliott; RV32ZHINX-NEXT:    addi sp, sp, -16
99228f88fdSSam Elliott; RV32ZHINX-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
100228f88fdSSam Elliott; RV32ZHINX-NEXT:    lui a1, %hi(gh)
101228f88fdSSam Elliott; RV32ZHINX-NEXT:    lh s0, %lo(gh)(a1)
102228f88fdSSam Elliott; RV32ZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
103228f88fdSSam Elliott; RV32ZHINX-NEXT:    #APP
104228f88fdSSam Elliott; RV32ZHINX-NEXT:    fadd.s t0, a0, s0
105228f88fdSSam Elliott; RV32ZHINX-NEXT:    #NO_APP
106228f88fdSSam Elliott; RV32ZHINX-NEXT:    mv a0, t0
107228f88fdSSam Elliott; RV32ZHINX-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
108228f88fdSSam Elliott; RV32ZHINX-NEXT:    addi sp, sp, 16
109228f88fdSSam Elliott; RV32ZHINX-NEXT:    ret
110228f88fdSSam Elliott;
111228f88fdSSam Elliott; RV64ZHINX-LABEL: constraint_half_abi_name:
112228f88fdSSam Elliott; RV64ZHINX:       # %bb.0:
113228f88fdSSam Elliott; RV64ZHINX-NEXT:    addi sp, sp, -16
114228f88fdSSam Elliott; RV64ZHINX-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
115228f88fdSSam Elliott; RV64ZHINX-NEXT:    lui a1, %hi(gh)
116228f88fdSSam Elliott; RV64ZHINX-NEXT:    lh s0, %lo(gh)(a1)
117228f88fdSSam Elliott; RV64ZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
118228f88fdSSam Elliott; RV64ZHINX-NEXT:    #APP
119228f88fdSSam Elliott; RV64ZHINX-NEXT:    fadd.s t0, a0, s0
120228f88fdSSam Elliott; RV64ZHINX-NEXT:    #NO_APP
121228f88fdSSam Elliott; RV64ZHINX-NEXT:    mv a0, t0
122228f88fdSSam Elliott; RV64ZHINX-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
123228f88fdSSam Elliott; RV64ZHINX-NEXT:    addi sp, sp, 16
124228f88fdSSam Elliott; RV64ZHINX-NEXT:    ret
125228f88fdSSam Elliott;
126228f88fdSSam Elliott; RV32DINXZHINX-LABEL: constraint_half_abi_name:
127228f88fdSSam Elliott; RV32DINXZHINX:       # %bb.0:
128228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    addi sp, sp, -16
129228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
130228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lui a1, %hi(gh)
131228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lh s0, %lo(gh)(a1)
132228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
133228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #APP
134228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    fadd.s t0, a0, s0
135228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    #NO_APP
136228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    mv a0, t0
137228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
138228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    addi sp, sp, 16
139228f88fdSSam Elliott; RV32DINXZHINX-NEXT:    ret
140228f88fdSSam Elliott;
141228f88fdSSam Elliott; RV64DINXZHINX-LABEL: constraint_half_abi_name:
142228f88fdSSam Elliott; RV64DINXZHINX:       # %bb.0:
143228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    addi sp, sp, -16
144228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
145228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lui a1, %hi(gh)
146228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    lh s0, %lo(gh)(a1)
147228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    # kill: def $x10_h killed $x10_h def $x10
148228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #APP
149228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    fadd.s t0, a0, s0
150228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    #NO_APP
151228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    mv a0, t0
152228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
153228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    addi sp, sp, 16
154228f88fdSSam Elliott; RV64DINXZHINX-NEXT:    ret
155228f88fdSSam Elliott  %1 = load half, ptr @gh
156228f88fdSSam Elliott  %2 = tail call half asm "fadd.s $0, $1, $2", "={t0},{a0},{s0}"(half %a, half %1)
157228f88fdSSam Elliott  ret half %2
158228f88fdSSam Elliott}
159*1bc1a79aSCraig Topper
160*1bc1a79aSCraig Topperdefine half @constraint_f_half(half %a) nounwind {
161*1bc1a79aSCraig Topper; RV32ZHINX-LABEL: constraint_f_half:
162*1bc1a79aSCraig Topper; RV32ZHINX:       # %bb.0:
163*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    lui a1, %hi(gh)
164*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    lh a1, %lo(gh)(a1)
165*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    #APP
166*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    fadd.h a0, a0, a1
167*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    #NO_APP
168*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    ret
169*1bc1a79aSCraig Topper;
170*1bc1a79aSCraig Topper; RV64ZHINX-LABEL: constraint_f_half:
171*1bc1a79aSCraig Topper; RV64ZHINX:       # %bb.0:
172*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    lui a1, %hi(gh)
173*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    lh a1, %lo(gh)(a1)
174*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    #APP
175*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    fadd.h a0, a0, a1
176*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    #NO_APP
177*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    ret
178*1bc1a79aSCraig Topper;
179*1bc1a79aSCraig Topper; RV32DINXZHINX-LABEL: constraint_f_half:
180*1bc1a79aSCraig Topper; RV32DINXZHINX:       # %bb.0:
181*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    lui a1, %hi(gh)
182*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
183*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    #APP
184*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    fadd.h a0, a0, a1
185*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    #NO_APP
186*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    ret
187*1bc1a79aSCraig Topper;
188*1bc1a79aSCraig Topper; RV64DINXZHINX-LABEL: constraint_f_half:
189*1bc1a79aSCraig Topper; RV64DINXZHINX:       # %bb.0:
190*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    lui a1, %hi(gh)
191*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
192*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    #APP
193*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    fadd.h a0, a0, a1
194*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    #NO_APP
195*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    ret
196*1bc1a79aSCraig Topper  %1 = load half, ptr @gh
197*1bc1a79aSCraig Topper  %2 = tail call half asm "fadd.h $0, $1, $2", "=f,f,f"(half %a, half %1)
198*1bc1a79aSCraig Topper  ret half %2
199*1bc1a79aSCraig Topper}
200*1bc1a79aSCraig Topper
201*1bc1a79aSCraig Topperdefine half @constraint_cf_half(half %a) nounwind {
202*1bc1a79aSCraig Topper; RV32ZHINX-LABEL: constraint_cf_half:
203*1bc1a79aSCraig Topper; RV32ZHINX:       # %bb.0:
204*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    lui a1, %hi(gh)
205*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    lh a1, %lo(gh)(a1)
206*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    #APP
207*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    fadd.h a0, a0, a1
208*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    #NO_APP
209*1bc1a79aSCraig Topper; RV32ZHINX-NEXT:    ret
210*1bc1a79aSCraig Topper;
211*1bc1a79aSCraig Topper; RV64ZHINX-LABEL: constraint_cf_half:
212*1bc1a79aSCraig Topper; RV64ZHINX:       # %bb.0:
213*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    lui a1, %hi(gh)
214*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    lh a1, %lo(gh)(a1)
215*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    #APP
216*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    fadd.h a0, a0, a1
217*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    #NO_APP
218*1bc1a79aSCraig Topper; RV64ZHINX-NEXT:    ret
219*1bc1a79aSCraig Topper;
220*1bc1a79aSCraig Topper; RV32DINXZHINX-LABEL: constraint_cf_half:
221*1bc1a79aSCraig Topper; RV32DINXZHINX:       # %bb.0:
222*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    lui a1, %hi(gh)
223*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
224*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    #APP
225*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    fadd.h a0, a0, a1
226*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    #NO_APP
227*1bc1a79aSCraig Topper; RV32DINXZHINX-NEXT:    ret
228*1bc1a79aSCraig Topper;
229*1bc1a79aSCraig Topper; RV64DINXZHINX-LABEL: constraint_cf_half:
230*1bc1a79aSCraig Topper; RV64DINXZHINX:       # %bb.0:
231*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    lui a1, %hi(gh)
232*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    lh a1, %lo(gh)(a1)
233*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    #APP
234*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    fadd.h a0, a0, a1
235*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    #NO_APP
236*1bc1a79aSCraig Topper; RV64DINXZHINX-NEXT:    ret
237*1bc1a79aSCraig Topper  %1 = load half, ptr @gh
238*1bc1a79aSCraig Topper  %2 = tail call half asm "fadd.h $0, $1, $2", "=^cf,^cf,^cf"(half %a, half %1)
239*1bc1a79aSCraig Topper  ret half %2
240*1bc1a79aSCraig Topper}
241