xref: /llvm-project/llvm/test/CodeGen/RISCV/inline-asm-zdinx-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=+zdinx -target-abi=ilp32 -verify-machineinstrs < %s \
3228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV32FINX %s
4228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+zdinx -target-abi=lp64 -verify-machineinstrs < %s \
5228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV64FINX %s
6228f88fdSSam Elliott
7228f88fdSSam Elliott@gd = external global double
8228f88fdSSam Elliott
9228f88fdSSam Elliottdefine double @constraint_r_double(double %a) nounwind {
10228f88fdSSam Elliott; RV32FINX-LABEL: constraint_r_double:
11228f88fdSSam Elliott; RV32FINX:       # %bb.0:
12228f88fdSSam Elliott; RV32FINX-NEXT:    lui a2, %hi(gd)
13228f88fdSSam Elliott; RV32FINX-NEXT:    lw a3, %lo(gd+4)(a2)
14228f88fdSSam Elliott; RV32FINX-NEXT:    lw a2, %lo(gd)(a2)
15228f88fdSSam Elliott; RV32FINX-NEXT:    #APP
16228f88fdSSam Elliott; RV32FINX-NEXT:    fadd.d a0, a0, a2
17228f88fdSSam Elliott; RV32FINX-NEXT:    #NO_APP
18228f88fdSSam Elliott; RV32FINX-NEXT:    ret
19228f88fdSSam Elliott;
20228f88fdSSam Elliott; RV64FINX-LABEL: constraint_r_double:
21228f88fdSSam Elliott; RV64FINX:       # %bb.0:
22228f88fdSSam Elliott; RV64FINX-NEXT:    lui a1, %hi(gd)
23228f88fdSSam Elliott; RV64FINX-NEXT:    ld a1, %lo(gd)(a1)
24228f88fdSSam Elliott; RV64FINX-NEXT:    #APP
25228f88fdSSam Elliott; RV64FINX-NEXT:    fadd.d a0, a0, a1
26228f88fdSSam Elliott; RV64FINX-NEXT:    #NO_APP
27228f88fdSSam Elliott; RV64FINX-NEXT:    ret
28228f88fdSSam Elliott  %1 = load double, ptr @gd
29228f88fdSSam Elliott  %2 = tail call double asm "fadd.d $0, $1, $2", "=r,r,r"(double %a, double %1)
30228f88fdSSam Elliott  ret double %2
31228f88fdSSam Elliott}
32228f88fdSSam Elliott
33228f88fdSSam Elliottdefine double @constraint_cr_double(double %a) nounwind {
34228f88fdSSam Elliott; RV32FINX-LABEL: constraint_cr_double:
35228f88fdSSam Elliott; RV32FINX:       # %bb.0:
36228f88fdSSam Elliott; RV32FINX-NEXT:    lui a2, %hi(gd)
37228f88fdSSam Elliott; RV32FINX-NEXT:    lw a3, %lo(gd+4)(a2)
38228f88fdSSam Elliott; RV32FINX-NEXT:    lw a2, %lo(gd)(a2)
39228f88fdSSam Elliott; RV32FINX-NEXT:    #APP
40228f88fdSSam Elliott; RV32FINX-NEXT:    fadd.d a0, a0, a2
41228f88fdSSam Elliott; RV32FINX-NEXT:    #NO_APP
42228f88fdSSam Elliott; RV32FINX-NEXT:    ret
43228f88fdSSam Elliott;
44228f88fdSSam Elliott; RV64FINX-LABEL: constraint_cr_double:
45228f88fdSSam Elliott; RV64FINX:       # %bb.0:
46228f88fdSSam Elliott; RV64FINX-NEXT:    lui a1, %hi(gd)
47228f88fdSSam Elliott; RV64FINX-NEXT:    ld a1, %lo(gd)(a1)
48228f88fdSSam Elliott; RV64FINX-NEXT:    #APP
49228f88fdSSam Elliott; RV64FINX-NEXT:    fadd.d a0, a0, a1
50228f88fdSSam Elliott; RV64FINX-NEXT:    #NO_APP
51228f88fdSSam Elliott; RV64FINX-NEXT:    ret
52228f88fdSSam Elliott  %1 = load double, ptr @gd
53228f88fdSSam Elliott  %2 = tail call double asm "fadd.d $0, $1, $2", "=^cr,^cr,^cr"(double %a, double %1)
54228f88fdSSam Elliott  ret double %2
55228f88fdSSam Elliott}
56228f88fdSSam Elliott
57228f88fdSSam Elliottdefine double @constraint_double_abi_name(double %a) nounwind {
58228f88fdSSam Elliott; RV32FINX-LABEL: constraint_double_abi_name:
59228f88fdSSam Elliott; RV32FINX:       # %bb.0:
60228f88fdSSam Elliott; RV32FINX-NEXT:    addi sp, sp, -16
61228f88fdSSam Elliott; RV32FINX-NEXT:    sw s0, 12(sp) # 4-byte Folded Spill
62228f88fdSSam Elliott; RV32FINX-NEXT:    sw s1, 8(sp) # 4-byte Folded Spill
63228f88fdSSam Elliott; RV32FINX-NEXT:    lui a2, %hi(gd)
64228f88fdSSam Elliott; RV32FINX-NEXT:    lw s0, %lo(gd)(a2)
65228f88fdSSam Elliott; RV32FINX-NEXT:    lw s1, %lo(gd+4)(a2)
66228f88fdSSam Elliott; RV32FINX-NEXT:    #APP
67228f88fdSSam Elliott; RV32FINX-NEXT:    fadd.d t1, a0, s0
68228f88fdSSam Elliott; RV32FINX-NEXT:    #NO_APP
69228f88fdSSam Elliott; RV32FINX-NEXT:    mv a0, t1
70228f88fdSSam Elliott; RV32FINX-NEXT:    mv a1, t2
71228f88fdSSam Elliott; RV32FINX-NEXT:    lw s0, 12(sp) # 4-byte Folded Reload
72228f88fdSSam Elliott; RV32FINX-NEXT:    lw s1, 8(sp) # 4-byte Folded Reload
73228f88fdSSam Elliott; RV32FINX-NEXT:    addi sp, sp, 16
74228f88fdSSam Elliott; RV32FINX-NEXT:    ret
75228f88fdSSam Elliott;
76228f88fdSSam Elliott; RV64FINX-LABEL: constraint_double_abi_name:
77228f88fdSSam Elliott; RV64FINX:       # %bb.0:
78228f88fdSSam Elliott; RV64FINX-NEXT:    addi sp, sp, -16
79228f88fdSSam Elliott; RV64FINX-NEXT:    sd s0, 8(sp) # 8-byte Folded Spill
80228f88fdSSam Elliott; RV64FINX-NEXT:    lui a1, %hi(gd)
81228f88fdSSam Elliott; RV64FINX-NEXT:    ld s0, %lo(gd)(a1)
82228f88fdSSam Elliott; RV64FINX-NEXT:    #APP
83228f88fdSSam Elliott; RV64FINX-NEXT:    fadd.d t1, a0, s0
84228f88fdSSam Elliott; RV64FINX-NEXT:    #NO_APP
85228f88fdSSam Elliott; RV64FINX-NEXT:    mv a0, t1
86228f88fdSSam Elliott; RV64FINX-NEXT:    ld s0, 8(sp) # 8-byte Folded Reload
87228f88fdSSam Elliott; RV64FINX-NEXT:    addi sp, sp, 16
88228f88fdSSam Elliott; RV64FINX-NEXT:    ret
89228f88fdSSam Elliott  %1 = load double, ptr @gd
90228f88fdSSam Elliott  %2 = tail call double asm "fadd.d $0, $1, $2", "={t1},{a0},{s0}"(double %a, double %1)
91228f88fdSSam Elliott  ret double %2
92228f88fdSSam Elliott}
93*1bc1a79aSCraig Topper
94*1bc1a79aSCraig Topperdefine double @constraint_f_double(double %a) nounwind {
95*1bc1a79aSCraig Topper; RV32FINX-LABEL: constraint_f_double:
96*1bc1a79aSCraig Topper; RV32FINX:       # %bb.0:
97*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lui a2, %hi(gd)
98*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lw a3, %lo(gd+4)(a2)
99*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lw a2, %lo(gd)(a2)
100*1bc1a79aSCraig Topper; RV32FINX-NEXT:    #APP
101*1bc1a79aSCraig Topper; RV32FINX-NEXT:    fadd.d a0, a0, a2
102*1bc1a79aSCraig Topper; RV32FINX-NEXT:    #NO_APP
103*1bc1a79aSCraig Topper; RV32FINX-NEXT:    ret
104*1bc1a79aSCraig Topper;
105*1bc1a79aSCraig Topper; RV64FINX-LABEL: constraint_f_double:
106*1bc1a79aSCraig Topper; RV64FINX:       # %bb.0:
107*1bc1a79aSCraig Topper; RV64FINX-NEXT:    lui a1, %hi(gd)
108*1bc1a79aSCraig Topper; RV64FINX-NEXT:    ld a1, %lo(gd)(a1)
109*1bc1a79aSCraig Topper; RV64FINX-NEXT:    #APP
110*1bc1a79aSCraig Topper; RV64FINX-NEXT:    fadd.d a0, a0, a1
111*1bc1a79aSCraig Topper; RV64FINX-NEXT:    #NO_APP
112*1bc1a79aSCraig Topper; RV64FINX-NEXT:    ret
113*1bc1a79aSCraig Topper  %1 = load double, ptr @gd
114*1bc1a79aSCraig Topper  %2 = tail call double asm "fadd.d $0, $1, $2", "=f,f,f"(double %a, double %1)
115*1bc1a79aSCraig Topper  ret double %2
116*1bc1a79aSCraig Topper}
117*1bc1a79aSCraig Topper
118*1bc1a79aSCraig Topperdefine double @constraint_cf_double(double %a) nounwind {
119*1bc1a79aSCraig Topper; RV32FINX-LABEL: constraint_cf_double:
120*1bc1a79aSCraig Topper; RV32FINX:       # %bb.0:
121*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lui a2, %hi(gd)
122*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lw a3, %lo(gd+4)(a2)
123*1bc1a79aSCraig Topper; RV32FINX-NEXT:    lw a2, %lo(gd)(a2)
124*1bc1a79aSCraig Topper; RV32FINX-NEXT:    #APP
125*1bc1a79aSCraig Topper; RV32FINX-NEXT:    fadd.d a0, a0, a2
126*1bc1a79aSCraig Topper; RV32FINX-NEXT:    #NO_APP
127*1bc1a79aSCraig Topper; RV32FINX-NEXT:    ret
128*1bc1a79aSCraig Topper;
129*1bc1a79aSCraig Topper; RV64FINX-LABEL: constraint_cf_double:
130*1bc1a79aSCraig Topper; RV64FINX:       # %bb.0:
131*1bc1a79aSCraig Topper; RV64FINX-NEXT:    lui a1, %hi(gd)
132*1bc1a79aSCraig Topper; RV64FINX-NEXT:    ld a1, %lo(gd)(a1)
133*1bc1a79aSCraig Topper; RV64FINX-NEXT:    #APP
134*1bc1a79aSCraig Topper; RV64FINX-NEXT:    fadd.d a0, a0, a1
135*1bc1a79aSCraig Topper; RV64FINX-NEXT:    #NO_APP
136*1bc1a79aSCraig Topper; RV64FINX-NEXT:    ret
137*1bc1a79aSCraig Topper  %1 = load double, ptr @gd
138*1bc1a79aSCraig Topper  %2 = tail call double asm "fadd.d $0, $1, $2", "=^cf,^cf,^cf"(double %a, double %1)
139*1bc1a79aSCraig Topper  ret double %2
140*1bc1a79aSCraig Topper}
141