xref: /llvm-project/llvm/test/CodeGen/LoongArch/fsqrt.ll (revision c2ee21cf3f863dbe48bd6decf896b41891808647)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc --mtriple=loongarch32 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA32F
3; RUN: llc --mtriple=loongarch32 --mattr=+d < %s | FileCheck %s --check-prefix=LA32D
4; RUN: llc --mtriple=loongarch64 --mattr=+f,-d < %s | FileCheck %s --check-prefix=LA64F
5; RUN: llc --mtriple=loongarch64 --mattr=+d < %s | FileCheck %s --check-prefix=LA64D
6
7declare float @llvm.sqrt.f32(float)
8declare double @llvm.sqrt.f64(double)
9
10define float @fsqrt_f32(float %a) nounwind {
11; LA32F-LABEL: fsqrt_f32:
12; LA32F:       # %bb.0:
13; LA32F-NEXT:    fsqrt.s $fa0, $fa0
14; LA32F-NEXT:    ret
15;
16; LA32D-LABEL: fsqrt_f32:
17; LA32D:       # %bb.0:
18; LA32D-NEXT:    fsqrt.s $fa0, $fa0
19; LA32D-NEXT:    ret
20;
21; LA64F-LABEL: fsqrt_f32:
22; LA64F:       # %bb.0:
23; LA64F-NEXT:    fsqrt.s $fa0, $fa0
24; LA64F-NEXT:    ret
25;
26; LA64D-LABEL: fsqrt_f32:
27; LA64D:       # %bb.0:
28; LA64D-NEXT:    fsqrt.s $fa0, $fa0
29; LA64D-NEXT:    ret
30  %1 = call float @llvm.sqrt.f32(float %a)
31  ret float %1
32}
33
34define double @fsqrt_f64(double %a) nounwind {
35; LA32F-LABEL: fsqrt_f64:
36; LA32F:       # %bb.0:
37; LA32F-NEXT:    addi.w $sp, $sp, -16
38; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
39; LA32F-NEXT:    bl %plt(sqrt)
40; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
41; LA32F-NEXT:    addi.w $sp, $sp, 16
42; LA32F-NEXT:    ret
43;
44; LA32D-LABEL: fsqrt_f64:
45; LA32D:       # %bb.0:
46; LA32D-NEXT:    fsqrt.d $fa0, $fa0
47; LA32D-NEXT:    ret
48;
49; LA64F-LABEL: fsqrt_f64:
50; LA64F:       # %bb.0:
51; LA64F-NEXT:    addi.d $sp, $sp, -16
52; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
53; LA64F-NEXT:    bl %plt(sqrt)
54; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
55; LA64F-NEXT:    addi.d $sp, $sp, 16
56; LA64F-NEXT:    ret
57;
58; LA64D-LABEL: fsqrt_f64:
59; LA64D:       # %bb.0:
60; LA64D-NEXT:    fsqrt.d $fa0, $fa0
61; LA64D-NEXT:    ret
62  %1 = call double @llvm.sqrt.f64(double %a)
63  ret double %1
64}
65
66define float @frsqrt_f32(float %a) nounwind {
67; LA32F-LABEL: frsqrt_f32:
68; LA32F:       # %bb.0:
69; LA32F-NEXT:    frsqrt.s $fa0, $fa0
70; LA32F-NEXT:    ret
71;
72; LA32D-LABEL: frsqrt_f32:
73; LA32D:       # %bb.0:
74; LA32D-NEXT:    frsqrt.s $fa0, $fa0
75; LA32D-NEXT:    ret
76;
77; LA64F-LABEL: frsqrt_f32:
78; LA64F:       # %bb.0:
79; LA64F-NEXT:    frsqrt.s $fa0, $fa0
80; LA64F-NEXT:    ret
81;
82; LA64D-LABEL: frsqrt_f32:
83; LA64D:       # %bb.0:
84; LA64D-NEXT:    frsqrt.s $fa0, $fa0
85; LA64D-NEXT:    ret
86  %1 = call float @llvm.sqrt.f32(float %a)
87  %2 = fdiv float 1.0, %1
88  ret float %2
89}
90
91define double @frsqrt_f64(double %a) nounwind {
92; LA32F-LABEL: frsqrt_f64:
93; LA32F:       # %bb.0:
94; LA32F-NEXT:    addi.w $sp, $sp, -16
95; LA32F-NEXT:    st.w $ra, $sp, 12 # 4-byte Folded Spill
96; LA32F-NEXT:    bl %plt(sqrt)
97; LA32F-NEXT:    move $a2, $a0
98; LA32F-NEXT:    move $a3, $a1
99; LA32F-NEXT:    lu12i.w $a1, 261888
100; LA32F-NEXT:    move $a0, $zero
101; LA32F-NEXT:    bl %plt(__divdf3)
102; LA32F-NEXT:    ld.w $ra, $sp, 12 # 4-byte Folded Reload
103; LA32F-NEXT:    addi.w $sp, $sp, 16
104; LA32F-NEXT:    ret
105;
106; LA32D-LABEL: frsqrt_f64:
107; LA32D:       # %bb.0:
108; LA32D-NEXT:    frsqrt.d $fa0, $fa0
109; LA32D-NEXT:    ret
110;
111; LA64F-LABEL: frsqrt_f64:
112; LA64F:       # %bb.0:
113; LA64F-NEXT:    addi.d $sp, $sp, -16
114; LA64F-NEXT:    st.d $ra, $sp, 8 # 8-byte Folded Spill
115; LA64F-NEXT:    bl %plt(sqrt)
116; LA64F-NEXT:    move $a1, $a0
117; LA64F-NEXT:    lu52i.d $a0, $zero, 1023
118; LA64F-NEXT:    bl %plt(__divdf3)
119; LA64F-NEXT:    ld.d $ra, $sp, 8 # 8-byte Folded Reload
120; LA64F-NEXT:    addi.d $sp, $sp, 16
121; LA64F-NEXT:    ret
122;
123; LA64D-LABEL: frsqrt_f64:
124; LA64D:       # %bb.0:
125; LA64D-NEXT:    frsqrt.d $fa0, $fa0
126; LA64D-NEXT:    ret
127  %1 = call double @llvm.sqrt.f64(double %a)
128  %2 = fdiv double 1.0, %1
129  ret double %2
130}
131