164 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 -mattr=+32s,+lsx < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 -mattr=+lsx < %s | FileCheck %s --check-prefix=LA644 5declare <4 x float> @llvm.powi.v4f32.i32(<4 x float>, i32)6 7define <4 x float> @powi_v4f32(<4 x float> %va, i32 %b) nounwind {8; LA32-LABEL: powi_v4f32:9; LA32: # %bb.0: # %entry10; LA32-NEXT: addi.w $sp, $sp, -4811; LA32-NEXT: st.w $ra, $sp, 44 # 4-byte Folded Spill12; LA32-NEXT: st.w $fp, $sp, 40 # 4-byte Folded Spill13; LA32-NEXT: move $fp, $a014; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill15; LA32-NEXT: vreplvei.w $vr0, $vr0, 116; LA32-NEXT: # kill: def $f0 killed $f0 killed $vr017; LA32-NEXT: bl __powisf218; LA32-NEXT: # kill: def $f0 killed $f0 def $vr019; LA32-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill20; LA32-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload21; LA32-NEXT: vreplvei.w $vr0, $vr0, 022; LA32-NEXT: # kill: def $f0 killed $f0 killed $vr023; LA32-NEXT: move $a0, $fp24; LA32-NEXT: bl __powisf225; LA32-NEXT: # kill: def $f0 killed $f0 def $vr026; LA32-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload27; LA32-NEXT: vextrins.w $vr0, $vr1, 1628; LA32-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill29; LA32-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload30; LA32-NEXT: vreplvei.w $vr0, $vr0, 231; LA32-NEXT: # kill: def $f0 killed $f0 killed $vr032; LA32-NEXT: move $a0, $fp33; LA32-NEXT: bl __powisf234; LA32-NEXT: # kill: def $f0 killed $f0 def $vr035; LA32-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload36; LA32-NEXT: vextrins.w $vr1, $vr0, 3237; LA32-NEXT: vst $vr1, $sp, 0 # 16-byte Folded Spill38; LA32-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload39; LA32-NEXT: vreplvei.w $vr0, $vr0, 340; LA32-NEXT: # kill: def $f0 killed $f0 killed $vr041; LA32-NEXT: move $a0, $fp42; LA32-NEXT: bl __powisf243; LA32-NEXT: # kill: def $f0 killed $f0 def $vr044; LA32-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload45; LA32-NEXT: vextrins.w $vr1, $vr0, 4846; LA32-NEXT: vori.b $vr0, $vr1, 047; LA32-NEXT: ld.w $fp, $sp, 40 # 4-byte Folded Reload48; LA32-NEXT: ld.w $ra, $sp, 44 # 4-byte Folded Reload49; LA32-NEXT: addi.w $sp, $sp, 4850; LA32-NEXT: ret51;52; LA64-LABEL: powi_v4f32:53; LA64: # %bb.0: # %entry54; LA64-NEXT: addi.d $sp, $sp, -4855; LA64-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill56; LA64-NEXT: st.d $fp, $sp, 32 # 8-byte Folded Spill57; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill58; LA64-NEXT: addi.w $fp, $a0, 059; LA64-NEXT: vreplvei.w $vr0, $vr0, 160; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr061; LA64-NEXT: move $a0, $fp62; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)63; LA64-NEXT: jirl $ra, $ra, 064; LA64-NEXT: # kill: def $f0 killed $f0 def $vr065; LA64-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill66; LA64-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload67; LA64-NEXT: vreplvei.w $vr0, $vr0, 068; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr069; LA64-NEXT: move $a0, $fp70; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)71; LA64-NEXT: jirl $ra, $ra, 072; LA64-NEXT: # kill: def $f0 killed $f0 def $vr073; LA64-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload74; LA64-NEXT: vextrins.w $vr0, $vr1, 1675; LA64-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill76; LA64-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload77; LA64-NEXT: vreplvei.w $vr0, $vr0, 278; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr079; LA64-NEXT: move $a0, $fp80; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)81; LA64-NEXT: jirl $ra, $ra, 082; LA64-NEXT: # kill: def $f0 killed $f0 def $vr083; LA64-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload84; LA64-NEXT: vextrins.w $vr1, $vr0, 3285; LA64-NEXT: vst $vr1, $sp, 0 # 16-byte Folded Spill86; LA64-NEXT: vld $vr0, $sp, 16 # 16-byte Folded Reload87; LA64-NEXT: vreplvei.w $vr0, $vr0, 388; LA64-NEXT: # kill: def $f0 killed $f0 killed $vr089; LA64-NEXT: move $a0, $fp90; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)91; LA64-NEXT: jirl $ra, $ra, 092; LA64-NEXT: # kill: def $f0 killed $f0 def $vr093; LA64-NEXT: vld $vr1, $sp, 0 # 16-byte Folded Reload94; LA64-NEXT: vextrins.w $vr1, $vr0, 4895; LA64-NEXT: vori.b $vr0, $vr1, 096; LA64-NEXT: ld.d $fp, $sp, 32 # 8-byte Folded Reload97; LA64-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload98; LA64-NEXT: addi.d $sp, $sp, 4899; LA64-NEXT: ret100entry:101 %res = call <4 x float> @llvm.powi.v4f32.i32(<4 x float> %va, i32 %b)102 ret <4 x float> %res103}104 105declare <2 x double> @llvm.powi.v2f64.i32(<2 x double>, i32)106 107define <2 x double> @powi_v2f64(<2 x double> %va, i32 %b) nounwind {108; LA32-LABEL: powi_v2f64:109; LA32: # %bb.0: # %entry110; LA32-NEXT: addi.w $sp, $sp, -48111; LA32-NEXT: st.w $ra, $sp, 44 # 4-byte Folded Spill112; LA32-NEXT: st.w $fp, $sp, 40 # 4-byte Folded Spill113; LA32-NEXT: move $fp, $a0114; LA32-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill115; LA32-NEXT: vreplvei.d $vr0, $vr0, 1116; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0117; LA32-NEXT: bl __powidf2118; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0119; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill120; LA32-NEXT: vld $vr0, $sp, 0 # 16-byte Folded Reload121; LA32-NEXT: vreplvei.d $vr0, $vr0, 0122; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0123; LA32-NEXT: move $a0, $fp124; LA32-NEXT: bl __powidf2125; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0126; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload127; LA32-NEXT: vextrins.d $vr0, $vr1, 16128; LA32-NEXT: ld.w $fp, $sp, 40 # 4-byte Folded Reload129; LA32-NEXT: ld.w $ra, $sp, 44 # 4-byte Folded Reload130; LA32-NEXT: addi.w $sp, $sp, 48131; LA32-NEXT: ret132;133; LA64-LABEL: powi_v2f64:134; LA64: # %bb.0: # %entry135; LA64-NEXT: addi.d $sp, $sp, -48136; LA64-NEXT: st.d $ra, $sp, 40 # 8-byte Folded Spill137; LA64-NEXT: st.d $fp, $sp, 32 # 8-byte Folded Spill138; LA64-NEXT: vst $vr0, $sp, 0 # 16-byte Folded Spill139; LA64-NEXT: addi.w $fp, $a0, 0140; LA64-NEXT: vreplvei.d $vr0, $vr0, 1141; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0142; LA64-NEXT: move $a0, $fp143; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)144; LA64-NEXT: jirl $ra, $ra, 0145; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0146; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill147; LA64-NEXT: vld $vr0, $sp, 0 # 16-byte Folded Reload148; LA64-NEXT: vreplvei.d $vr0, $vr0, 0149; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $vr0150; LA64-NEXT: move $a0, $fp151; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)152; LA64-NEXT: jirl $ra, $ra, 0153; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0154; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload155; LA64-NEXT: vextrins.d $vr0, $vr1, 16156; LA64-NEXT: ld.d $fp, $sp, 32 # 8-byte Folded Reload157; LA64-NEXT: ld.d $ra, $sp, 40 # 8-byte Folded Reload158; LA64-NEXT: addi.d $sp, $sp, 48159; LA64-NEXT: ret160entry:161 %res = call <2 x double> @llvm.powi.v2f64.i32(<2 x double> %va, i32 %b)162 ret <2 x double> %res163}164