xref: /llvm-project/llvm/test/CodeGen/LoongArch/fcopysign.ll (revision a5c90e48b6f11bc6db7344503589648f76b16d80)
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.copysign.f32(float, float)
8declare double @llvm.copysign.f64(double, double)
9
10define float @fcopysign_s(float %a, float %b) nounwind {
11; LA32F-LABEL: fcopysign_s:
12; LA32F:       # %bb.0:
13; LA32F-NEXT:    fcopysign.s $fa0, $fa0, $fa1
14; LA32F-NEXT:    ret
15;
16; LA32D-LABEL: fcopysign_s:
17; LA32D:       # %bb.0:
18; LA32D-NEXT:    fcopysign.s $fa0, $fa0, $fa1
19; LA32D-NEXT:    ret
20;
21; LA64F-LABEL: fcopysign_s:
22; LA64F:       # %bb.0:
23; LA64F-NEXT:    fcopysign.s $fa0, $fa0, $fa1
24; LA64F-NEXT:    ret
25;
26; LA64D-LABEL: fcopysign_s:
27; LA64D:       # %bb.0:
28; LA64D-NEXT:    fcopysign.s $fa0, $fa0, $fa1
29; LA64D-NEXT:    ret
30  %1 = call float @llvm.copysign.f32(float %a, float %b)
31  ret float %1
32}
33
34define double @fcopysign_d(double %a, double %b) nounwind {
35; LA32F-LABEL: fcopysign_d:
36; LA32F:       # %bb.0:
37; LA32F-NEXT:    srli.w $a2, $a3, 31
38; LA32F-NEXT:    bstrins.w $a1, $a2, 31, 31
39; LA32F-NEXT:    ret
40;
41; LA32D-LABEL: fcopysign_d:
42; LA32D:       # %bb.0:
43; LA32D-NEXT:    fcopysign.d $fa0, $fa0, $fa1
44; LA32D-NEXT:    ret
45;
46; LA64F-LABEL: fcopysign_d:
47; LA64F:       # %bb.0:
48; LA64F-NEXT:    srli.d $a1, $a1, 63
49; LA64F-NEXT:    bstrins.d $a0, $a1, 63, 63
50; LA64F-NEXT:    ret
51;
52; LA64D-LABEL: fcopysign_d:
53; LA64D:       # %bb.0:
54; LA64D-NEXT:    fcopysign.d $fa0, $fa0, $fa1
55; LA64D-NEXT:    ret
56  %1 = call double @llvm.copysign.f64(double %a, double %b)
57  ret double %1
58}
59
60define double @fold_promote_d_s(double %a, float %b) nounwind {
61; LA32F-LABEL: fold_promote_d_s:
62; LA32F:       # %bb.0:
63; LA32F-NEXT:    movfr2gr.s $a2, $fa0
64; LA32F-NEXT:    srli.w $a2, $a2, 31
65; LA32F-NEXT:    bstrins.w $a1, $a2, 31, 31
66; LA32F-NEXT:    ret
67;
68; LA32D-LABEL: fold_promote_d_s:
69; LA32D:       # %bb.0:
70; LA32D-NEXT:    fcvt.d.s $fa1, $fa1
71; LA32D-NEXT:    fcopysign.d $fa0, $fa0, $fa1
72; LA32D-NEXT:    ret
73;
74; LA64F-LABEL: fold_promote_d_s:
75; LA64F:       # %bb.0:
76; LA64F-NEXT:    movfr2gr.s $a1, $fa0
77; LA64F-NEXT:    lu12i.w $a2, -524288
78; LA64F-NEXT:    lu32i.d $a2, 0
79; LA64F-NEXT:    and $a1, $a1, $a2
80; LA64F-NEXT:    slli.d $a1, $a1, 32
81; LA64F-NEXT:    bstrins.d $a1, $a0, 62, 0
82; LA64F-NEXT:    move $a0, $a1
83; LA64F-NEXT:    ret
84;
85; LA64D-LABEL: fold_promote_d_s:
86; LA64D:       # %bb.0:
87; LA64D-NEXT:    fcvt.d.s $fa1, $fa1
88; LA64D-NEXT:    fcopysign.d $fa0, $fa0, $fa1
89; LA64D-NEXT:    ret
90  %c = fpext float %b to double
91  %t = call double @llvm.copysign.f64(double %a, double %c)
92  ret double %t
93}
94
95define float @fold_demote_s_d(float %a, double %b) nounwind {
96; LA32F-LABEL: fold_demote_s_d:
97; LA32F:       # %bb.0:
98; LA32F-NEXT:    movgr2fr.w $fa1, $a1
99; LA32F-NEXT:    fcopysign.s $fa0, $fa0, $fa1
100; LA32F-NEXT:    ret
101;
102; LA32D-LABEL: fold_demote_s_d:
103; LA32D:       # %bb.0:
104; LA32D-NEXT:    fcvt.s.d $fa1, $fa1
105; LA32D-NEXT:    fcopysign.s $fa0, $fa0, $fa1
106; LA32D-NEXT:    ret
107;
108; LA64F-LABEL: fold_demote_s_d:
109; LA64F:       # %bb.0:
110; LA64F-NEXT:    srli.d $a0, $a0, 32
111; LA64F-NEXT:    movgr2fr.w $fa1, $a0
112; LA64F-NEXT:    fcopysign.s $fa0, $fa0, $fa1
113; LA64F-NEXT:    ret
114;
115; LA64D-LABEL: fold_demote_s_d:
116; LA64D:       # %bb.0:
117; LA64D-NEXT:    fcvt.s.d $fa1, $fa1
118; LA64D-NEXT:    fcopysign.s $fa0, $fa0, $fa1
119; LA64D-NEXT:    ret
120  %c = fptrunc double %b to float
121  %t = call float @llvm.copysign.f32(float %a, float %c)
122  ret float %t
123}
124