436 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 22; RUN: llc -mcpu=pwr9 -mtriple=powerpc64le-unknown-unknown \3; RUN: -ppc-vsr-nums-as-vr -ppc-asm-full-reg-names < %s | FileCheck %s4 5define { half, half } @test_modf_f16(half %a) {6; CHECK-LABEL: test_modf_f16:7; CHECK: # %bb.0:8; CHECK-NEXT: mflr r09; CHECK-NEXT: stdu r1, -48(r1)10; CHECK-NEXT: std r0, 64(r1)11; CHECK-NEXT: .cfi_def_cfa_offset 4812; CHECK-NEXT: .cfi_offset lr, 1613; CHECK-NEXT: xscvdphp f0, f114; CHECK-NEXT: addi r4, r1, 4415; CHECK-NEXT: mffprwz r3, f016; CHECK-NEXT: clrlwi r3, r3, 1617; CHECK-NEXT: mtfprwz f0, r318; CHECK-NEXT: xscvhpdp f1, f019; CHECK-NEXT: bl modff20; CHECK-NEXT: nop21; CHECK-NEXT: lfs f2, 44(r1)22; CHECK-NEXT: addi r1, r1, 4823; CHECK-NEXT: ld r0, 16(r1)24; CHECK-NEXT: mtlr r025; CHECK-NEXT: blr26 %result = call { half, half } @llvm.modf.f16(half %a)27 ret { half, half } %result28}29 30define half @test_modf_f16_only_use_fractional_part(half %a) {31; CHECK-LABEL: test_modf_f16_only_use_fractional_part:32; CHECK: # %bb.0:33; CHECK-NEXT: mflr r034; CHECK-NEXT: stdu r1, -48(r1)35; CHECK-NEXT: std r0, 64(r1)36; CHECK-NEXT: .cfi_def_cfa_offset 4837; CHECK-NEXT: .cfi_offset lr, 1638; CHECK-NEXT: xscvdphp f0, f139; CHECK-NEXT: addi r4, r1, 4440; CHECK-NEXT: mffprwz r3, f041; CHECK-NEXT: clrlwi r3, r3, 1642; CHECK-NEXT: mtfprwz f0, r343; CHECK-NEXT: xscvhpdp f1, f044; CHECK-NEXT: bl modff45; CHECK-NEXT: nop46; CHECK-NEXT: addi r1, r1, 4847; CHECK-NEXT: ld r0, 16(r1)48; CHECK-NEXT: mtlr r049; CHECK-NEXT: blr50 %result = call { half, half } @llvm.modf.f16(half %a)51 %result.0 = extractvalue { half, half } %result, 052 ret half %result.053}54 55define half @test_modf_f16_only_use_integral_part(half %a) {56; CHECK-LABEL: test_modf_f16_only_use_integral_part:57; CHECK: # %bb.0:58; CHECK-NEXT: mflr r059; CHECK-NEXT: stdu r1, -48(r1)60; CHECK-NEXT: std r0, 64(r1)61; CHECK-NEXT: .cfi_def_cfa_offset 4862; CHECK-NEXT: .cfi_offset lr, 1663; CHECK-NEXT: xscvdphp f0, f164; CHECK-NEXT: addi r4, r1, 4465; CHECK-NEXT: mffprwz r3, f066; CHECK-NEXT: clrlwi r3, r3, 1667; CHECK-NEXT: mtfprwz f0, r368; CHECK-NEXT: xscvhpdp f1, f069; CHECK-NEXT: bl modff70; CHECK-NEXT: nop71; CHECK-NEXT: lfs f1, 44(r1)72; CHECK-NEXT: addi r1, r1, 4873; CHECK-NEXT: ld r0, 16(r1)74; CHECK-NEXT: mtlr r075; CHECK-NEXT: blr76 %result = call { half, half } @llvm.modf.f16(half %a)77 %result.1 = extractvalue { half, half } %result, 178 ret half %result.179}80 81define { <2 x half>, <2 x half> } @test_modf_v2f16(<2 x half> %a) {82; CHECK-LABEL: test_modf_v2f16:83; CHECK: # %bb.0:84; CHECK-NEXT: mflr r085; CHECK-NEXT: .cfi_def_cfa_offset 6486; CHECK-NEXT: .cfi_offset lr, 1687; CHECK-NEXT: .cfi_offset f30, -1688; CHECK-NEXT: .cfi_offset f31, -889; CHECK-NEXT: stfd f30, -16(r1) # 8-byte Folded Spill90; CHECK-NEXT: stfd f31, -8(r1) # 8-byte Folded Spill91; CHECK-NEXT: stdu r1, -64(r1)92; CHECK-NEXT: std r0, 80(r1)93; CHECK-NEXT: xscvdphp f0, f294; CHECK-NEXT: addi r4, r1, 4095; CHECK-NEXT: mffprwz r3, f096; CHECK-NEXT: clrlwi r3, r3, 1697; CHECK-NEXT: mtfprwz f0, r398; CHECK-NEXT: xscvhpdp f31, f099; CHECK-NEXT: xscvdphp f0, f1100; CHECK-NEXT: mffprwz r3, f0101; CHECK-NEXT: clrlwi r3, r3, 16102; CHECK-NEXT: mtfprwz f0, r3103; CHECK-NEXT: xscvhpdp f1, f0104; CHECK-NEXT: bl modff105; CHECK-NEXT: nop106; CHECK-NEXT: addi r4, r1, 44107; CHECK-NEXT: fmr f30, f1108; CHECK-NEXT: fmr f1, f31109; CHECK-NEXT: bl modff110; CHECK-NEXT: nop111; CHECK-NEXT: lfs f3, 40(r1)112; CHECK-NEXT: fmr f2, f1113; CHECK-NEXT: fmr f1, f30114; CHECK-NEXT: lfs f4, 44(r1)115; CHECK-NEXT: addi r1, r1, 64116; CHECK-NEXT: ld r0, 16(r1)117; CHECK-NEXT: lfd f31, -8(r1) # 8-byte Folded Reload118; CHECK-NEXT: lfd f30, -16(r1) # 8-byte Folded Reload119; CHECK-NEXT: mtlr r0120; CHECK-NEXT: blr121 %result = call { <2 x half>, <2 x half> } @llvm.modf.v2f16(<2 x half> %a)122 ret { <2 x half>, <2 x half> } %result123}124 125define { float, float } @test_modf_f32(float %a) {126; CHECK-LABEL: test_modf_f32:127; CHECK: # %bb.0:128; CHECK-NEXT: mflr r0129; CHECK-NEXT: stdu r1, -48(r1)130; CHECK-NEXT: std r0, 64(r1)131; CHECK-NEXT: .cfi_def_cfa_offset 48132; CHECK-NEXT: .cfi_offset lr, 16133; CHECK-NEXT: addi r4, r1, 44134; CHECK-NEXT: bl modff135; CHECK-NEXT: nop136; CHECK-NEXT: lfs f2, 44(r1)137; CHECK-NEXT: addi r1, r1, 48138; CHECK-NEXT: ld r0, 16(r1)139; CHECK-NEXT: mtlr r0140; CHECK-NEXT: blr141 %result = call { float, float } @llvm.modf.f32(float %a)142 ret { float, float } %result143}144 145define { <3 x float>, <3 x float> } @test_modf_v3f32(<3 x float> %a) {146; CHECK-LABEL: test_modf_v3f32:147; CHECK: # %bb.0:148; CHECK-NEXT: mflr r0149; CHECK-NEXT: stdu r1, -112(r1)150; CHECK-NEXT: std r0, 128(r1)151; CHECK-NEXT: .cfi_def_cfa_offset 112152; CHECK-NEXT: .cfi_offset lr, 16153; CHECK-NEXT: .cfi_offset r28, -32154; CHECK-NEXT: .cfi_offset r29, -24155; CHECK-NEXT: .cfi_offset r30, -16156; CHECK-NEXT: .cfi_offset v30, -64157; CHECK-NEXT: .cfi_offset v31, -48158; CHECK-NEXT: xxsldwi vs0, v2, v2, 3159; CHECK-NEXT: std r30, 96(r1) # 8-byte Folded Spill160; CHECK-NEXT: addi r30, r1, 36161; CHECK-NEXT: std r28, 80(r1) # 8-byte Folded Spill162; CHECK-NEXT: stxv v30, 48(r1) # 16-byte Folded Spill163; CHECK-NEXT: std r29, 88(r1) # 8-byte Folded Spill164; CHECK-NEXT: stxv v31, 64(r1) # 16-byte Folded Spill165; CHECK-NEXT: mr r4, r30166; CHECK-NEXT: vmr v31, v2167; CHECK-NEXT: xscvspdpn f1, vs0168; CHECK-NEXT: bl modff169; CHECK-NEXT: nop170; CHECK-NEXT: xxswapd vs0, v31171; CHECK-NEXT: addi r29, r1, 40172; CHECK-NEXT: xscvdpspn v30, f1173; CHECK-NEXT: mr r4, r29174; CHECK-NEXT: xscvspdpn f1, vs0175; CHECK-NEXT: bl modff176; CHECK-NEXT: nop177; CHECK-NEXT: xscvdpspn vs0, f1178; CHECK-NEXT: addi r28, r1, 44179; CHECK-NEXT: mr r4, r28180; CHECK-NEXT: xxmrghw v30, vs0, v30181; CHECK-NEXT: xxsldwi vs0, v31, v31, 1182; CHECK-NEXT: xscvspdpn f1, vs0183; CHECK-NEXT: bl modff184; CHECK-NEXT: nop185; CHECK-NEXT: addis r3, r2, .LCPI5_0@toc@ha186; CHECK-NEXT: xscvdpspn v2, f1187; CHECK-NEXT: lfiwzx f1, 0, r30188; CHECK-NEXT: lfiwzx f2, 0, r29189; CHECK-NEXT: lxsiwzx v3, 0, r28190; CHECK-NEXT: lxv v31, 64(r1) # 16-byte Folded Reload191; CHECK-NEXT: ld r30, 96(r1) # 8-byte Folded Reload192; CHECK-NEXT: ld r29, 88(r1) # 8-byte Folded Reload193; CHECK-NEXT: ld r28, 80(r1) # 8-byte Folded Reload194; CHECK-NEXT: addi r3, r3, .LCPI5_0@toc@l195; CHECK-NEXT: lxv vs0, 0(r3)196; CHECK-NEXT: xxmrghw v4, vs2, vs1197; CHECK-NEXT: xxperm v2, v30, vs0198; CHECK-NEXT: lxv v30, 48(r1) # 16-byte Folded Reload199; CHECK-NEXT: xxperm v3, v4, vs0200; CHECK-NEXT: addi r1, r1, 112201; CHECK-NEXT: ld r0, 16(r1)202; CHECK-NEXT: mtlr r0203; CHECK-NEXT: blr204 %result = call { <3 x float>, <3 x float> } @llvm.modf.v3f32(<3 x float> %a)205 ret { <3 x float>, <3 x float> } %result206}207 208define { <2 x float>, <2 x float> } @test_modf_v2f32(<2 x float> %a) {209; CHECK-LABEL: test_modf_v2f32:210; CHECK: # %bb.0:211; CHECK-NEXT: mflr r0212; CHECK-NEXT: stdu r1, -112(r1)213; CHECK-NEXT: std r0, 128(r1)214; CHECK-NEXT: .cfi_def_cfa_offset 112215; CHECK-NEXT: .cfi_offset lr, 16216; CHECK-NEXT: .cfi_offset r29, -24217; CHECK-NEXT: .cfi_offset r30, -16218; CHECK-NEXT: .cfi_offset v30, -64219; CHECK-NEXT: .cfi_offset v31, -48220; CHECK-NEXT: xxsldwi vs0, v2, v2, 3221; CHECK-NEXT: std r30, 96(r1) # 8-byte Folded Spill222; CHECK-NEXT: addi r30, r1, 40223; CHECK-NEXT: std r29, 88(r1) # 8-byte Folded Spill224; CHECK-NEXT: stxv v30, 48(r1) # 16-byte Folded Spill225; CHECK-NEXT: mr r4, r30226; CHECK-NEXT: stxv v31, 64(r1) # 16-byte Folded Spill227; CHECK-NEXT: xscvspdpn f1, vs0228; CHECK-NEXT: vmr v31, v2229; CHECK-NEXT: bl modff230; CHECK-NEXT: nop231; CHECK-NEXT: xxswapd vs0, v31232; CHECK-NEXT: addi r29, r1, 44233; CHECK-NEXT: xscvdpspn v30, f1234; CHECK-NEXT: mr r4, r29235; CHECK-NEXT: xscvspdpn f1, vs0236; CHECK-NEXT: bl modff237; CHECK-NEXT: nop238; CHECK-NEXT: xscvdpspn vs0, f1239; CHECK-NEXT: lfiwzx f1, 0, r29240; CHECK-NEXT: lxv v31, 64(r1) # 16-byte Folded Reload241; CHECK-NEXT: ld r29, 88(r1) # 8-byte Folded Reload242; CHECK-NEXT: xxmrghw v2, vs0, v30243; CHECK-NEXT: lfiwzx f0, 0, r30244; CHECK-NEXT: lxv v30, 48(r1) # 16-byte Folded Reload245; CHECK-NEXT: ld r30, 96(r1) # 8-byte Folded Reload246; CHECK-NEXT: xxmrghw v3, vs1, vs0247; CHECK-NEXT: addi r1, r1, 112248; CHECK-NEXT: ld r0, 16(r1)249; CHECK-NEXT: mtlr r0250; CHECK-NEXT: blr251 %result = call { <2 x float>, <2 x float> } @llvm.modf.v2f32(<2 x float> %a)252 ret { <2 x float>, <2 x float> } %result253}254 255define { double, double } @test_modf_f64(double %a) {256; CHECK-LABEL: test_modf_f64:257; CHECK: # %bb.0:258; CHECK-NEXT: mflr r0259; CHECK-NEXT: stdu r1, -48(r1)260; CHECK-NEXT: std r0, 64(r1)261; CHECK-NEXT: .cfi_def_cfa_offset 48262; CHECK-NEXT: .cfi_offset lr, 16263; CHECK-NEXT: addi r4, r1, 40264; CHECK-NEXT: bl modf265; CHECK-NEXT: nop266; CHECK-NEXT: lfd f2, 40(r1)267; CHECK-NEXT: addi r1, r1, 48268; CHECK-NEXT: ld r0, 16(r1)269; CHECK-NEXT: mtlr r0270; CHECK-NEXT: blr271 %result = call { double, double } @llvm.modf.f64(double %a)272 ret { double, double } %result273}274 275define { <2 x double>, <2 x double> } @test_modf_v2f64(<2 x double> %a) {276; CHECK-LABEL: test_modf_v2f64:277; CHECK: # %bb.0:278; CHECK-NEXT: mflr r0279; CHECK-NEXT: stdu r1, -80(r1)280; CHECK-NEXT: std r0, 96(r1)281; CHECK-NEXT: .cfi_def_cfa_offset 80282; CHECK-NEXT: .cfi_offset lr, 16283; CHECK-NEXT: .cfi_offset v30, -32284; CHECK-NEXT: .cfi_offset v31, -16285; CHECK-NEXT: stxv v31, 64(r1) # 16-byte Folded Spill286; CHECK-NEXT: vmr v31, v2287; CHECK-NEXT: addi r4, r1, 32288; CHECK-NEXT: xscpsgndp f1, v31, v31289; CHECK-NEXT: stxv v30, 48(r1) # 16-byte Folded Spill290; CHECK-NEXT: bl modf291; CHECK-NEXT: nop292; CHECK-NEXT: xscpsgndp v30, f1, f1293; CHECK-NEXT: xxswapd vs1, v31294; CHECK-NEXT: addi r4, r1, 40295; CHECK-NEXT: bl modf296; CHECK-NEXT: nop297; CHECK-NEXT: xxmrghd v2, v30, vs1298; CHECK-NEXT: lfd f0, 32(r1)299; CHECK-NEXT: lfd f1, 40(r1)300; CHECK-NEXT: lxv v31, 64(r1) # 16-byte Folded Reload301; CHECK-NEXT: lxv v30, 48(r1) # 16-byte Folded Reload302; CHECK-NEXT: xxmrghd v3, vs0, vs1303; CHECK-NEXT: addi r1, r1, 80304; CHECK-NEXT: ld r0, 16(r1)305; CHECK-NEXT: mtlr r0306; CHECK-NEXT: blr307 %result = call { <2 x double>, <2 x double> } @llvm.modf.v2f64(<2 x double> %a)308 ret { <2 x double>, <2 x double> } %result309}310 311define { ppc_fp128, ppc_fp128 } @test_modf_ppcf128(ppc_fp128 %a) {312; CHECK-LABEL: test_modf_ppcf128:313; CHECK: # %bb.0:314; CHECK-NEXT: mflr r0315; CHECK-NEXT: stdu r1, -48(r1)316; CHECK-NEXT: std r0, 64(r1)317; CHECK-NEXT: .cfi_def_cfa_offset 48318; CHECK-NEXT: .cfi_offset lr, 16319; CHECK-NEXT: addi r5, r1, 32320; CHECK-NEXT: bl modfl321; CHECK-NEXT: nop322; CHECK-NEXT: lfd f3, 32(r1)323; CHECK-NEXT: lfd f4, 40(r1)324; CHECK-NEXT: addi r1, r1, 48325; CHECK-NEXT: ld r0, 16(r1)326; CHECK-NEXT: mtlr r0327; CHECK-NEXT: blr328 %result = call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)329 ret { ppc_fp128, ppc_fp128 } %result330}331 332define ppc_fp128 @test_modf_ppcf128_only_use_intergral(ppc_fp128 %a) {333; CHECK-LABEL: test_modf_ppcf128_only_use_intergral:334; CHECK: # %bb.0:335; CHECK-NEXT: mflr r0336; CHECK-NEXT: stdu r1, -48(r1)337; CHECK-NEXT: std r0, 64(r1)338; CHECK-NEXT: .cfi_def_cfa_offset 48339; CHECK-NEXT: .cfi_offset lr, 16340; CHECK-NEXT: addi r5, r1, 32341; CHECK-NEXT: bl modfl342; CHECK-NEXT: nop343; CHECK-NEXT: lfd f1, 32(r1)344; CHECK-NEXT: lfd f2, 40(r1)345; CHECK-NEXT: addi r1, r1, 48346; CHECK-NEXT: ld r0, 16(r1)347; CHECK-NEXT: mtlr r0348; CHECK-NEXT: blr349 %result = call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)350 %result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 1351 ret ppc_fp128 %result.1352}353 354define ppc_fp128 @test_modf_ppcf128_only_use_fractional(ppc_fp128 %a) {355; CHECK-LABEL: test_modf_ppcf128_only_use_fractional:356; CHECK: # %bb.0:357; CHECK-NEXT: mflr r0358; CHECK-NEXT: stdu r1, -48(r1)359; CHECK-NEXT: std r0, 64(r1)360; CHECK-NEXT: .cfi_def_cfa_offset 48361; CHECK-NEXT: .cfi_offset lr, 16362; CHECK-NEXT: addi r5, r1, 32363; CHECK-NEXT: bl modfl364; CHECK-NEXT: nop365; CHECK-NEXT: addi r1, r1, 48366; CHECK-NEXT: ld r0, 16(r1)367; CHECK-NEXT: mtlr r0368; CHECK-NEXT: blr369 %result = call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)370 %result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 0371 ret ppc_fp128 %result.1372}373 374define { ppc_fp128, ppc_fp128 } @test_modf_ppcf128_tail_call(ppc_fp128 %a) {375; CHECK-LABEL: test_modf_ppcf128_tail_call:376; CHECK: # %bb.0:377; CHECK-NEXT: mflr r0378; CHECK-NEXT: stdu r1, -48(r1)379; CHECK-NEXT: std r0, 64(r1)380; CHECK-NEXT: .cfi_def_cfa_offset 48381; CHECK-NEXT: .cfi_offset lr, 16382; CHECK-NEXT: addi r5, r1, 32383; CHECK-NEXT: bl modfl384; CHECK-NEXT: nop385; CHECK-NEXT: lfd f3, 32(r1)386; CHECK-NEXT: lfd f4, 40(r1)387; CHECK-NEXT: addi r1, r1, 48388; CHECK-NEXT: ld r0, 16(r1)389; CHECK-NEXT: mtlr r0390; CHECK-NEXT: blr391 %result = tail call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)392 ret { ppc_fp128, ppc_fp128 } %result393}394 395define ppc_fp128 @test_modf_ppcf128_only_use_intergral_tail_call(ppc_fp128 %a) {396; CHECK-LABEL: test_modf_ppcf128_only_use_intergral_tail_call:397; CHECK: # %bb.0:398; CHECK-NEXT: mflr r0399; CHECK-NEXT: stdu r1, -48(r1)400; CHECK-NEXT: std r0, 64(r1)401; CHECK-NEXT: .cfi_def_cfa_offset 48402; CHECK-NEXT: .cfi_offset lr, 16403; CHECK-NEXT: addi r5, r1, 32404; CHECK-NEXT: bl modfl405; CHECK-NEXT: nop406; CHECK-NEXT: lfd f1, 32(r1)407; CHECK-NEXT: lfd f2, 40(r1)408; CHECK-NEXT: addi r1, r1, 48409; CHECK-NEXT: ld r0, 16(r1)410; CHECK-NEXT: mtlr r0411; CHECK-NEXT: blr412 %result = tail call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)413 %result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 1414 ret ppc_fp128 %result.1415}416 417define ppc_fp128 @test_modf_ppcf128_only_use_fractional_tail_call(ppc_fp128 %a) {418; CHECK-LABEL: test_modf_ppcf128_only_use_fractional_tail_call:419; CHECK: # %bb.0:420; CHECK-NEXT: mflr r0421; CHECK-NEXT: stdu r1, -48(r1)422; CHECK-NEXT: std r0, 64(r1)423; CHECK-NEXT: .cfi_def_cfa_offset 48424; CHECK-NEXT: .cfi_offset lr, 16425; CHECK-NEXT: addi r5, r1, 32426; CHECK-NEXT: bl modfl427; CHECK-NEXT: nop428; CHECK-NEXT: addi r1, r1, 48429; CHECK-NEXT: ld r0, 16(r1)430; CHECK-NEXT: mtlr r0431; CHECK-NEXT: blr432 %result = tail call { ppc_fp128, ppc_fp128 } @llvm.modf.ppcf128(ppc_fp128 %a)433 %result.1 = extractvalue { ppc_fp128, ppc_fp128 } %result, 0434 ret ppc_fp128 %result.1435}436