278 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc --mtriple=loongarch32 --mattr=+lasx < %s | FileCheck %s --check-prefix=LA323; RUN: llc --mtriple=loongarch64 --mattr=+lasx < %s | FileCheck %s --check-prefix=LA644 5declare <8 x float> @llvm.powi.v8f32.i32(<8 x float>, i32)6 7define <8 x float> @powi_v8f32(<8 x float> %va, i32 %b) nounwind {8; LA32-LABEL: powi_v8f32:9; LA32: # %bb.0: # %entry10; LA32-NEXT: addi.w $sp, $sp, -12811; LA32-NEXT: st.w $ra, $sp, 124 # 4-byte Folded Spill12; LA32-NEXT: st.w $fp, $sp, 120 # 4-byte Folded Spill13; LA32-NEXT: move $fp, $a014; LA32-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill15; LA32-NEXT: xvpickve.w $xr0, $xr0, 516; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr017; LA32-NEXT: bl __powisf218; LA32-NEXT: # kill: def $f0 killed $f0 def $vr019; LA32-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill20; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload21; LA32-NEXT: xvpickve.w $xr0, $xr0, 422; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr023; LA32-NEXT: move $a0, $fp24; LA32-NEXT: bl __powisf225; LA32-NEXT: # kill: def $f0 killed $f0 def $xr026; LA32-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload27; LA32-NEXT: vextrins.w $vr0, $vr1, 1628; LA32-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill29; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload30; LA32-NEXT: xvpickve.w $xr0, $xr0, 631; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr032; LA32-NEXT: move $a0, $fp33; LA32-NEXT: bl __powisf234; LA32-NEXT: # kill: def $f0 killed $f0 def $vr035; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload36; LA32-NEXT: vextrins.w $vr1, $vr0, 3237; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill38; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload39; LA32-NEXT: xvpickve.w $xr0, $xr0, 740; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr041; LA32-NEXT: move $a0, $fp42; LA32-NEXT: bl __powisf243; LA32-NEXT: # kill: def $f0 killed $f0 def $vr044; LA32-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload45; LA32-NEXT: vextrins.w $vr1, $vr0, 4846; LA32-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill47; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload48; LA32-NEXT: xvpickve.w $xr0, $xr0, 149; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr050; LA32-NEXT: move $a0, $fp51; LA32-NEXT: bl __powisf252; LA32-NEXT: # kill: def $f0 killed $f0 def $vr053; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill54; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload55; LA32-NEXT: xvpickve.w $xr0, $xr0, 056; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr057; LA32-NEXT: move $a0, $fp58; LA32-NEXT: bl __powisf259; LA32-NEXT: # kill: def $f0 killed $f0 def $xr060; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload61; LA32-NEXT: vextrins.w $vr0, $vr1, 1662; LA32-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill63; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload64; LA32-NEXT: xvpickve.w $xr0, $xr0, 265; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr066; LA32-NEXT: move $a0, $fp67; LA32-NEXT: bl __powisf268; LA32-NEXT: # kill: def $f0 killed $f0 def $vr069; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload70; LA32-NEXT: vextrins.w $vr1, $vr0, 3271; LA32-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill72; LA32-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload73; LA32-NEXT: xvpickve.w $xr0, $xr0, 374; LA32-NEXT: # kill: def $f0 killed $f0 killed $xr075; LA32-NEXT: move $a0, $fp76; LA32-NEXT: bl __powisf277; LA32-NEXT: # kill: def $f0 killed $f0 def $vr078; LA32-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload79; LA32-NEXT: vextrins.w $vr1, $vr0, 4880; LA32-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload81; LA32-NEXT: xvpermi.q $xr1, $xr0, 282; LA32-NEXT: xvori.b $xr0, $xr1, 083; LA32-NEXT: ld.w $fp, $sp, 120 # 4-byte Folded Reload84; LA32-NEXT: ld.w $ra, $sp, 124 # 4-byte Folded Reload85; LA32-NEXT: addi.w $sp, $sp, 12886; LA32-NEXT: ret87;88; LA64-LABEL: powi_v8f32:89; LA64: # %bb.0: # %entry90; LA64-NEXT: addi.d $sp, $sp, -12891; LA64-NEXT: st.d $ra, $sp, 120 # 8-byte Folded Spill92; LA64-NEXT: st.d $fp, $sp, 112 # 8-byte Folded Spill93; LA64-NEXT: xvst $xr0, $sp, 80 # 32-byte Folded Spill94; LA64-NEXT: addi.w $fp, $a0, 095; LA64-NEXT: xvpickve.w $xr0, $xr0, 596; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr097; LA64-NEXT: move $a0, $fp98; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)99; LA64-NEXT: jirl $ra, $ra, 0100; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0101; LA64-NEXT: vst $vr0, $sp, 48 # 16-byte Folded Spill102; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload103; LA64-NEXT: xvpickve.w $xr0, $xr0, 4104; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0105; LA64-NEXT: move $a0, $fp106; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)107; LA64-NEXT: jirl $ra, $ra, 0108; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0109; LA64-NEXT: vld $vr1, $sp, 48 # 16-byte Folded Reload110; LA64-NEXT: vextrins.w $vr0, $vr1, 16111; LA64-NEXT: xvst $xr0, $sp, 48 # 32-byte Folded Spill112; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload113; LA64-NEXT: xvpickve.w $xr0, $xr0, 6114; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0115; LA64-NEXT: move $a0, $fp116; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)117; LA64-NEXT: jirl $ra, $ra, 0118; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0119; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload120; LA64-NEXT: vextrins.w $vr1, $vr0, 32121; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill122; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload123; LA64-NEXT: xvpickve.w $xr0, $xr0, 7124; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0125; LA64-NEXT: move $a0, $fp126; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)127; LA64-NEXT: jirl $ra, $ra, 0128; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0129; LA64-NEXT: xvld $xr1, $sp, 48 # 32-byte Folded Reload130; LA64-NEXT: vextrins.w $vr1, $vr0, 48131; LA64-NEXT: xvst $xr1, $sp, 48 # 32-byte Folded Spill132; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload133; LA64-NEXT: xvpickve.w $xr0, $xr0, 1134; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0135; LA64-NEXT: move $a0, $fp136; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)137; LA64-NEXT: jirl $ra, $ra, 0138; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0139; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill140; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload141; LA64-NEXT: xvpickve.w $xr0, $xr0, 0142; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0143; LA64-NEXT: move $a0, $fp144; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)145; LA64-NEXT: jirl $ra, $ra, 0146; LA64-NEXT: # kill: def $f0 killed $f0 def $xr0147; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload148; LA64-NEXT: vextrins.w $vr0, $vr1, 16149; LA64-NEXT: xvst $xr0, $sp, 16 # 32-byte Folded Spill150; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload151; LA64-NEXT: xvpickve.w $xr0, $xr0, 2152; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0153; LA64-NEXT: move $a0, $fp154; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)155; LA64-NEXT: jirl $ra, $ra, 0156; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0157; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload158; LA64-NEXT: vextrins.w $vr1, $vr0, 32159; LA64-NEXT: xvst $xr1, $sp, 16 # 32-byte Folded Spill160; LA64-NEXT: xvld $xr0, $sp, 80 # 32-byte Folded Reload161; LA64-NEXT: xvpickve.w $xr0, $xr0, 3162; LA64-NEXT: # kill: def $f0 killed $f0 killed $xr0163; LA64-NEXT: move $a0, $fp164; LA64-NEXT: pcaddu18i $ra, %call36(__powisf2)165; LA64-NEXT: jirl $ra, $ra, 0166; LA64-NEXT: # kill: def $f0 killed $f0 def $vr0167; LA64-NEXT: xvld $xr1, $sp, 16 # 32-byte Folded Reload168; LA64-NEXT: vextrins.w $vr1, $vr0, 48169; LA64-NEXT: xvld $xr0, $sp, 48 # 32-byte Folded Reload170; LA64-NEXT: xvpermi.q $xr1, $xr0, 2171; LA64-NEXT: xvori.b $xr0, $xr1, 0172; LA64-NEXT: ld.d $fp, $sp, 112 # 8-byte Folded Reload173; LA64-NEXT: ld.d $ra, $sp, 120 # 8-byte Folded Reload174; LA64-NEXT: addi.d $sp, $sp, 128175; LA64-NEXT: ret176entry:177 %res = call <8 x float> @llvm.powi.v8f32.i32(<8 x float> %va, i32 %b)178 ret <8 x float> %res179}180 181declare <4 x double> @llvm.powi.v4f64.i32(<4 x double>, i32)182 183define <4 x double> @powi_v4f64(<4 x double> %va, i32 %b) nounwind {184; LA32-LABEL: powi_v4f64:185; LA32: # %bb.0: # %entry186; LA32-NEXT: addi.w $sp, $sp, -112187; LA32-NEXT: st.w $ra, $sp, 108 # 4-byte Folded Spill188; LA32-NEXT: st.w $fp, $sp, 104 # 4-byte Folded Spill189; LA32-NEXT: move $fp, $a0190; LA32-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill191; LA32-NEXT: xvpickve.d $xr0, $xr0, 3192; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0193; LA32-NEXT: bl __powidf2194; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0195; LA32-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill196; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload197; LA32-NEXT: xvpickve.d $xr0, $xr0, 2198; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0199; LA32-NEXT: move $a0, $fp200; LA32-NEXT: bl __powidf2201; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0202; LA32-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload203; LA32-NEXT: vextrins.d $vr0, $vr1, 16204; LA32-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill205; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload206; LA32-NEXT: xvpickve.d $xr0, $xr0, 1207; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0208; LA32-NEXT: move $a0, $fp209; LA32-NEXT: bl __powidf2210; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0211; LA32-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill212; LA32-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload213; LA32-NEXT: xvpickve.d $xr0, $xr0, 0214; LA32-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0215; LA32-NEXT: move $a0, $fp216; LA32-NEXT: bl __powidf2217; LA32-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0218; LA32-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload219; LA32-NEXT: vextrins.d $vr0, $vr1, 16220; LA32-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload221; LA32-NEXT: xvpermi.q $xr0, $xr1, 2222; LA32-NEXT: ld.w $fp, $sp, 104 # 4-byte Folded Reload223; LA32-NEXT: ld.w $ra, $sp, 108 # 4-byte Folded Reload224; LA32-NEXT: addi.w $sp, $sp, 112225; LA32-NEXT: ret226;227; LA64-LABEL: powi_v4f64:228; LA64: # %bb.0: # %entry229; LA64-NEXT: addi.d $sp, $sp, -112230; LA64-NEXT: st.d $ra, $sp, 104 # 8-byte Folded Spill231; LA64-NEXT: st.d $fp, $sp, 96 # 8-byte Folded Spill232; LA64-NEXT: xvst $xr0, $sp, 64 # 32-byte Folded Spill233; LA64-NEXT: addi.w $fp, $a0, 0234; LA64-NEXT: xvpickve.d $xr0, $xr0, 3235; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0236; LA64-NEXT: move $a0, $fp237; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)238; LA64-NEXT: jirl $ra, $ra, 0239; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0240; LA64-NEXT: vst $vr0, $sp, 32 # 16-byte Folded Spill241; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload242; LA64-NEXT: xvpickve.d $xr0, $xr0, 2243; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0244; LA64-NEXT: move $a0, $fp245; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)246; LA64-NEXT: jirl $ra, $ra, 0247; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0248; LA64-NEXT: vld $vr1, $sp, 32 # 16-byte Folded Reload249; LA64-NEXT: vextrins.d $vr0, $vr1, 16250; LA64-NEXT: xvst $xr0, $sp, 32 # 32-byte Folded Spill251; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload252; LA64-NEXT: xvpickve.d $xr0, $xr0, 1253; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0254; LA64-NEXT: move $a0, $fp255; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)256; LA64-NEXT: jirl $ra, $ra, 0257; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $vr0258; LA64-NEXT: vst $vr0, $sp, 16 # 16-byte Folded Spill259; LA64-NEXT: xvld $xr0, $sp, 64 # 32-byte Folded Reload260; LA64-NEXT: xvpickve.d $xr0, $xr0, 0261; LA64-NEXT: # kill: def $f0_64 killed $f0_64 killed $xr0262; LA64-NEXT: move $a0, $fp263; LA64-NEXT: pcaddu18i $ra, %call36(__powidf2)264; LA64-NEXT: jirl $ra, $ra, 0265; LA64-NEXT: # kill: def $f0_64 killed $f0_64 def $xr0266; LA64-NEXT: vld $vr1, $sp, 16 # 16-byte Folded Reload267; LA64-NEXT: vextrins.d $vr0, $vr1, 16268; LA64-NEXT: xvld $xr1, $sp, 32 # 32-byte Folded Reload269; LA64-NEXT: xvpermi.q $xr0, $xr1, 2270; LA64-NEXT: ld.d $fp, $sp, 96 # 8-byte Folded Reload271; LA64-NEXT: ld.d $ra, $sp, 104 # 8-byte Folded Reload272; LA64-NEXT: addi.d $sp, $sp, 112273; LA64-NEXT: ret274entry:275 %res = call <4 x double> @llvm.powi.v4f64.i32(<4 x double> %va, i32 %b)276 ret <4 x double> %res277}278