xref: /llvm-project/llvm/test/CodeGen/LoongArch/lsx/fpowi.ll (revision f334db92be168876b618db72dc93078ce23ffa89)
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
2; RUN: llc --mtriple=loongarch64 --mattr=+lsx < %s | FileCheck %s
3
4declare <4 x float> @llvm.powi.v4f32.i32(<4 x float>, i32)
5
6define <4 x float> @powi_v4f32(<4 x float> %va, i32 %b) nounwind {
7; CHECK-LABEL: powi_v4f32:
8; CHECK:       # %bb.0: # %entry
9; CHECK-NEXT:    addi.d $sp, $sp, -48
10; CHECK-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
11; CHECK-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
12; CHECK-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill
13; CHECK-NEXT:    addi.w $fp, $a0, 0
14; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 0
15; CHECK-NEXT:    # kill: def $f0 killed $f0 killed $vr0
16; CHECK-NEXT:    move $a0, $fp
17; CHECK-NEXT:    bl %plt(__powisf2)
18; CHECK-NEXT:    movfr2gr.s $a0, $fa0
19; CHECK-NEXT:    vinsgr2vr.w $vr0, $a0, 0
20; CHECK-NEXT:    vst $vr0, $sp, 16 # 16-byte Folded Spill
21; CHECK-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload
22; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 1
23; CHECK-NEXT:    # kill: def $f0 killed $f0 killed $vr0
24; CHECK-NEXT:    move $a0, $fp
25; CHECK-NEXT:    bl %plt(__powisf2)
26; CHECK-NEXT:    movfr2gr.s $a0, $fa0
27; CHECK-NEXT:    vld $vr0, $sp, 16 # 16-byte Folded Reload
28; CHECK-NEXT:    vinsgr2vr.w $vr0, $a0, 1
29; CHECK-NEXT:    vst $vr0, $sp, 16 # 16-byte Folded Spill
30; CHECK-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload
31; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 2
32; CHECK-NEXT:    # kill: def $f0 killed $f0 killed $vr0
33; CHECK-NEXT:    move $a0, $fp
34; CHECK-NEXT:    bl %plt(__powisf2)
35; CHECK-NEXT:    movfr2gr.s $a0, $fa0
36; CHECK-NEXT:    vld $vr0, $sp, 16 # 16-byte Folded Reload
37; CHECK-NEXT:    vinsgr2vr.w $vr0, $a0, 2
38; CHECK-NEXT:    vst $vr0, $sp, 16 # 16-byte Folded Spill
39; CHECK-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload
40; CHECK-NEXT:    vreplvei.w $vr0, $vr0, 3
41; CHECK-NEXT:    # kill: def $f0 killed $f0 killed $vr0
42; CHECK-NEXT:    move $a0, $fp
43; CHECK-NEXT:    bl %plt(__powisf2)
44; CHECK-NEXT:    movfr2gr.s $a0, $fa0
45; CHECK-NEXT:    vld $vr0, $sp, 16 # 16-byte Folded Reload
46; CHECK-NEXT:    vinsgr2vr.w $vr0, $a0, 3
47; CHECK-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
48; CHECK-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
49; CHECK-NEXT:    addi.d $sp, $sp, 48
50; CHECK-NEXT:    ret
51entry:
52  %res = call <4 x float> @llvm.powi.v4f32.i32(<4 x float> %va, i32 %b)
53  ret <4 x float> %res
54}
55
56declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32)
57
58define <2 x double> @powi_v2f64(<2 x double> %va, i32 %b) nounwind {
59; CHECK-LABEL: powi_v2f64:
60; CHECK:       # %bb.0: # %entry
61; CHECK-NEXT:    addi.d $sp, $sp, -48
62; CHECK-NEXT:    st.d $ra, $sp, 40 # 8-byte Folded Spill
63; CHECK-NEXT:    st.d $fp, $sp, 32 # 8-byte Folded Spill
64; CHECK-NEXT:    vst $vr0, $sp, 0 # 16-byte Folded Spill
65; CHECK-NEXT:    addi.w $fp, $a0, 0
66; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 0
67; CHECK-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
68; CHECK-NEXT:    move $a0, $fp
69; CHECK-NEXT:    bl %plt(__powidf2)
70; CHECK-NEXT:    movfr2gr.d $a0, $fa0
71; CHECK-NEXT:    vinsgr2vr.d $vr0, $a0, 0
72; CHECK-NEXT:    vst $vr0, $sp, 16 # 16-byte Folded Spill
73; CHECK-NEXT:    vld $vr0, $sp, 0 # 16-byte Folded Reload
74; CHECK-NEXT:    vreplvei.d $vr0, $vr0, 1
75; CHECK-NEXT:    # kill: def $f0_64 killed $f0_64 killed $vr0
76; CHECK-NEXT:    move $a0, $fp
77; CHECK-NEXT:    bl %plt(__powidf2)
78; CHECK-NEXT:    movfr2gr.d $a0, $fa0
79; CHECK-NEXT:    vld $vr0, $sp, 16 # 16-byte Folded Reload
80; CHECK-NEXT:    vinsgr2vr.d $vr0, $a0, 1
81; CHECK-NEXT:    ld.d $fp, $sp, 32 # 8-byte Folded Reload
82; CHECK-NEXT:    ld.d $ra, $sp, 40 # 8-byte Folded Reload
83; CHECK-NEXT:    addi.d $sp, $sp, 48
84; CHECK-NEXT:    ret
85entry:
86  %res = call <2 x double> @llvm.powi.v2f64.i32(<2 x double> %va, i32 %b)
87  ret <2 x double> %res
88}
89