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