xref: /llvm-project/llvm/test/CodeGen/RISCV/inline-asm-f-modifier-N.ll (revision 228f88fdc8e92789e0562f8a47493493da843145)
1*228f88fdSSam Elliott; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+f -target-abi=ilp32 -verify-machineinstrs -no-integrated-as < %s \
3*228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV32F %s
4*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+f -target-abi=lp64 -verify-machineinstrs -no-integrated-as < %s \
5*228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV64F %s
6*228f88fdSSam Elliott; RUN: llc -mtriple=riscv32 -mattr=+d -target-abi=ilp32 -verify-machineinstrs -no-integrated-as < %s \
7*228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV32F %s
8*228f88fdSSam Elliott; RUN: llc -mtriple=riscv64 -mattr=+d -target-abi=lp64 -verify-machineinstrs -no-integrated-as < %s \
9*228f88fdSSam Elliott; RUN:   | FileCheck -check-prefix=RV64F %s
10*228f88fdSSam Elliott
11*228f88fdSSam Elliott;; `.insn 0x4, 0x53 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)` is
12*228f88fdSSam Elliott;; the raw encoding for `fadd.s`
13*228f88fdSSam Elliott
14*228f88fdSSam Elliott@gf = external global float
15*228f88fdSSam Elliott
16*228f88fdSSam Elliottdefine float @constraint_f_modifier_N_float(float %a) nounwind {
17*228f88fdSSam Elliott; RV32F-LABEL: constraint_f_modifier_N_float:
18*228f88fdSSam Elliott; RV32F:       # %bb.0:
19*228f88fdSSam Elliott; RV32F-NEXT:    lui a1, %hi(gf)
20*228f88fdSSam Elliott; RV32F-NEXT:    flw fa5, %lo(gf)(a1)
21*228f88fdSSam Elliott; RV32F-NEXT:    fmv.w.x fa4, a0
22*228f88fdSSam Elliott; RV32F-NEXT:    #APP
23*228f88fdSSam Elliott; RV32F-NEXT:    .insn 0x4, 0x53 | (15 << 7) | (14 << 15) | (15 << 20)
24*228f88fdSSam Elliott; RV32F-NEXT:    #NO_APP
25*228f88fdSSam Elliott; RV32F-NEXT:    fmv.x.w a0, fa5
26*228f88fdSSam Elliott; RV32F-NEXT:    ret
27*228f88fdSSam Elliott;
28*228f88fdSSam Elliott; RV64F-LABEL: constraint_f_modifier_N_float:
29*228f88fdSSam Elliott; RV64F:       # %bb.0:
30*228f88fdSSam Elliott; RV64F-NEXT:    lui a1, %hi(gf)
31*228f88fdSSam Elliott; RV64F-NEXT:    flw fa5, %lo(gf)(a1)
32*228f88fdSSam Elliott; RV64F-NEXT:    fmv.w.x fa4, a0
33*228f88fdSSam Elliott; RV64F-NEXT:    #APP
34*228f88fdSSam Elliott; RV64F-NEXT:    .insn 0x4, 0x53 | (15 << 7) | (14 << 15) | (15 << 20)
35*228f88fdSSam Elliott; RV64F-NEXT:    #NO_APP
36*228f88fdSSam Elliott; RV64F-NEXT:    fmv.x.w a0, fa5
37*228f88fdSSam Elliott; RV64F-NEXT:    ret
38*228f88fdSSam Elliott  %1 = load float, ptr @gf
39*228f88fdSSam Elliott  %2 = tail call float asm ".insn 0x4, 0x53 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=f,f,f"(float %a, float %1)
40*228f88fdSSam Elliott  ret float %2
41*228f88fdSSam Elliott}
42*228f88fdSSam Elliott
43*228f88fdSSam Elliott
44*228f88fdSSam Elliottdefine float @constraint_cf_modifier_N_float(float %a) nounwind {
45*228f88fdSSam Elliott; RV32F-LABEL: constraint_cf_modifier_N_float:
46*228f88fdSSam Elliott; RV32F:       # %bb.0:
47*228f88fdSSam Elliott; RV32F-NEXT:    lui a1, %hi(gf)
48*228f88fdSSam Elliott; RV32F-NEXT:    flw fa5, %lo(gf)(a1)
49*228f88fdSSam Elliott; RV32F-NEXT:    fmv.w.x fa4, a0
50*228f88fdSSam Elliott; RV32F-NEXT:    #APP
51*228f88fdSSam Elliott; RV32F-NEXT:    .insn 0x4, 0x53 | (15 << 7) | (14 << 15) | (15 << 20)
52*228f88fdSSam Elliott; RV32F-NEXT:    #NO_APP
53*228f88fdSSam Elliott; RV32F-NEXT:    fmv.x.w a0, fa5
54*228f88fdSSam Elliott; RV32F-NEXT:    ret
55*228f88fdSSam Elliott;
56*228f88fdSSam Elliott; RV64F-LABEL: constraint_cf_modifier_N_float:
57*228f88fdSSam Elliott; RV64F:       # %bb.0:
58*228f88fdSSam Elliott; RV64F-NEXT:    lui a1, %hi(gf)
59*228f88fdSSam Elliott; RV64F-NEXT:    flw fa5, %lo(gf)(a1)
60*228f88fdSSam Elliott; RV64F-NEXT:    fmv.w.x fa4, a0
61*228f88fdSSam Elliott; RV64F-NEXT:    #APP
62*228f88fdSSam Elliott; RV64F-NEXT:    .insn 0x4, 0x53 | (15 << 7) | (14 << 15) | (15 << 20)
63*228f88fdSSam Elliott; RV64F-NEXT:    #NO_APP
64*228f88fdSSam Elliott; RV64F-NEXT:    fmv.x.w a0, fa5
65*228f88fdSSam Elliott; RV64F-NEXT:    ret
66*228f88fdSSam Elliott  %1 = load float, ptr @gf
67*228f88fdSSam Elliott  %2 = tail call float asm ".insn 0x4, 0x53 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "=^cf,^cf,^cf"(float %a, float %1)
68*228f88fdSSam Elliott  ret float %2
69*228f88fdSSam Elliott}
70*228f88fdSSam Elliott
71*228f88fdSSam Elliottdefine float @modifier_N_float_abi_name(float %a) nounwind {
72*228f88fdSSam Elliott; RV32F-LABEL: modifier_N_float_abi_name:
73*228f88fdSSam Elliott; RV32F:       # %bb.0:
74*228f88fdSSam Elliott; RV32F-NEXT:    lui a1, %hi(gf)
75*228f88fdSSam Elliott; RV32F-NEXT:    flw fs0, %lo(gf)(a1)
76*228f88fdSSam Elliott; RV32F-NEXT:    fmv.w.x fa0, a0
77*228f88fdSSam Elliott; RV32F-NEXT:    #APP
78*228f88fdSSam Elliott; RV32F-NEXT:    .insn 0x4, 0x53 | (0 << 7) | (10 << 15) | (8 << 20)
79*228f88fdSSam Elliott; RV32F-NEXT:    #NO_APP
80*228f88fdSSam Elliott; RV32F-NEXT:    fmv.x.w a0, ft0
81*228f88fdSSam Elliott; RV32F-NEXT:    ret
82*228f88fdSSam Elliott;
83*228f88fdSSam Elliott; RV64F-LABEL: modifier_N_float_abi_name:
84*228f88fdSSam Elliott; RV64F:       # %bb.0:
85*228f88fdSSam Elliott; RV64F-NEXT:    lui a1, %hi(gf)
86*228f88fdSSam Elliott; RV64F-NEXT:    flw fs0, %lo(gf)(a1)
87*228f88fdSSam Elliott; RV64F-NEXT:    fmv.w.x fa0, a0
88*228f88fdSSam Elliott; RV64F-NEXT:    #APP
89*228f88fdSSam Elliott; RV64F-NEXT:    .insn 0x4, 0x53 | (0 << 7) | (10 << 15) | (8 << 20)
90*228f88fdSSam Elliott; RV64F-NEXT:    #NO_APP
91*228f88fdSSam Elliott; RV64F-NEXT:    fmv.x.w a0, ft0
92*228f88fdSSam Elliott; RV64F-NEXT:    ret
93*228f88fdSSam Elliott  %1 = load float, ptr @gf
94*228f88fdSSam Elliott  %2 = tail call float asm ".insn 0x4, 0x53 | (${0:N} << 7) | (${1:N} << 15) | (${2:N} << 20)", "={ft0},{fa0},{fs0}"(float %a, float %1)
95*228f88fdSSam Elliott  ret float %2
96*228f88fdSSam Elliott}
97