380 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc -mtriple=powerpc-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC3; RUN: llc -mcpu=ppc -mtriple=powerpc64-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC644; RUN: llc -mtriple=powerpc64le-unknown-linux-gnu -O0 < %s | FileCheck %s --check-prefix=PPC64LE5 6; Testing operations in soft-float mode7define double @foo() #0 {8; PPC-LABEL: foo:9; PPC: # %bb.0: # %entry10; PPC-NEXT: mflr 011; PPC-NEXT: stwu 1, -32(1)12; PPC-NEXT: stw 0, 36(1)13; PPC-NEXT: lwz 3, 24(1)14; PPC-NEXT: lwz 4, 28(1)15; PPC-NEXT: lwz 5, 16(1)16; PPC-NEXT: lwz 6, 20(1)17; PPC-NEXT: bl __adddf318; PPC-NEXT: lwz 0, 36(1)19; PPC-NEXT: addi 1, 1, 3220; PPC-NEXT: mtlr 021; PPC-NEXT: blr22;23; PPC64-LABEL: foo:24; PPC64: # %bb.0: # %entry25; PPC64-NEXT: mflr 026; PPC64-NEXT: stdu 1, -128(1)27; PPC64-NEXT: std 0, 144(1)28; PPC64-NEXT: ld 3, 120(1)29; PPC64-NEXT: ld 4, 112(1)30; PPC64-NEXT: bl __adddf331; PPC64-NEXT: nop32; PPC64-NEXT: addi 1, 1, 12833; PPC64-NEXT: ld 0, 16(1)34; PPC64-NEXT: mtlr 035; PPC64-NEXT: blr36;37; PPC64LE-LABEL: foo:38; PPC64LE: # %bb.0: # %entry39; PPC64LE-NEXT: mflr 040; PPC64LE-NEXT: stdu 1, -48(1)41; PPC64LE-NEXT: std 0, 64(1)42; PPC64LE-NEXT: ld 3, 40(1)43; PPC64LE-NEXT: ld 4, 32(1)44; PPC64LE-NEXT: bl __adddf345; PPC64LE-NEXT: nop46; PPC64LE-NEXT: addi 1, 1, 4847; PPC64LE-NEXT: ld 0, 16(1)48; PPC64LE-NEXT: mtlr 049; PPC64LE-NEXT: blr50entry:51 %a = alloca double, align 852 %b = alloca double, align 853 %0 = load double, ptr %a, align 854 %1 = load double, ptr %b, align 855 %add = fadd double %0, %156 ret double %add57}58 59define double @foo1() #0 {60; PPC-LABEL: foo1:61; PPC: # %bb.0: # %entry62; PPC-NEXT: mflr 063; PPC-NEXT: stwu 1, -32(1)64; PPC-NEXT: stw 0, 36(1)65; PPC-NEXT: lwz 3, 24(1)66; PPC-NEXT: lwz 4, 28(1)67; PPC-NEXT: lwz 5, 16(1)68; PPC-NEXT: lwz 6, 20(1)69; PPC-NEXT: bl __muldf370; PPC-NEXT: lwz 0, 36(1)71; PPC-NEXT: addi 1, 1, 3272; PPC-NEXT: mtlr 073; PPC-NEXT: blr74;75; PPC64-LABEL: foo1:76; PPC64: # %bb.0: # %entry77; PPC64-NEXT: mflr 078; PPC64-NEXT: stdu 1, -128(1)79; PPC64-NEXT: std 0, 144(1)80; PPC64-NEXT: ld 3, 120(1)81; PPC64-NEXT: ld 4, 112(1)82; PPC64-NEXT: bl __muldf383; PPC64-NEXT: nop84; PPC64-NEXT: addi 1, 1, 12885; PPC64-NEXT: ld 0, 16(1)86; PPC64-NEXT: mtlr 087; PPC64-NEXT: blr88;89; PPC64LE-LABEL: foo1:90; PPC64LE: # %bb.0: # %entry91; PPC64LE-NEXT: mflr 092; PPC64LE-NEXT: stdu 1, -48(1)93; PPC64LE-NEXT: std 0, 64(1)94; PPC64LE-NEXT: ld 3, 40(1)95; PPC64LE-NEXT: ld 4, 32(1)96; PPC64LE-NEXT: bl __muldf397; PPC64LE-NEXT: nop98; PPC64LE-NEXT: addi 1, 1, 4899; PPC64LE-NEXT: ld 0, 16(1)100; PPC64LE-NEXT: mtlr 0101; PPC64LE-NEXT: blr102entry:103 %a = alloca double, align 8104 %b = alloca double, align 8105 %0 = load double, ptr %a, align 8106 %1 = load double, ptr %b, align 8107 %mul = fmul double %0, %1108 ret double %mul109}110 111define double @foo2() #0 {112; PPC-LABEL: foo2:113; PPC: # %bb.0: # %entry114; PPC-NEXT: mflr 0115; PPC-NEXT: stwu 1, -32(1)116; PPC-NEXT: stw 0, 36(1)117; PPC-NEXT: lwz 3, 24(1)118; PPC-NEXT: lwz 4, 28(1)119; PPC-NEXT: lwz 5, 16(1)120; PPC-NEXT: lwz 6, 20(1)121; PPC-NEXT: bl __subdf3122; PPC-NEXT: lwz 0, 36(1)123; PPC-NEXT: addi 1, 1, 32124; PPC-NEXT: mtlr 0125; PPC-NEXT: blr126;127; PPC64-LABEL: foo2:128; PPC64: # %bb.0: # %entry129; PPC64-NEXT: mflr 0130; PPC64-NEXT: stdu 1, -128(1)131; PPC64-NEXT: std 0, 144(1)132; PPC64-NEXT: ld 3, 120(1)133; PPC64-NEXT: ld 4, 112(1)134; PPC64-NEXT: bl __subdf3135; PPC64-NEXT: nop136; PPC64-NEXT: addi 1, 1, 128137; PPC64-NEXT: ld 0, 16(1)138; PPC64-NEXT: mtlr 0139; PPC64-NEXT: blr140;141; PPC64LE-LABEL: foo2:142; PPC64LE: # %bb.0: # %entry143; PPC64LE-NEXT: mflr 0144; PPC64LE-NEXT: stdu 1, -48(1)145; PPC64LE-NEXT: std 0, 64(1)146; PPC64LE-NEXT: ld 3, 40(1)147; PPC64LE-NEXT: ld 4, 32(1)148; PPC64LE-NEXT: bl __subdf3149; PPC64LE-NEXT: nop150; PPC64LE-NEXT: addi 1, 1, 48151; PPC64LE-NEXT: ld 0, 16(1)152; PPC64LE-NEXT: mtlr 0153; PPC64LE-NEXT: blr154entry:155 %a = alloca double, align 8156 %b = alloca double, align 8157 %0 = load double, ptr %a, align 8158 %1 = load double, ptr %b, align 8159 %sub = fsub double %0, %1160 ret double %sub161}162 163define double @foo3() #0 {164; PPC-LABEL: foo3:165; PPC: # %bb.0: # %entry166; PPC-NEXT: mflr 0167; PPC-NEXT: stwu 1, -32(1)168; PPC-NEXT: stw 0, 36(1)169; PPC-NEXT: lwz 3, 24(1)170; PPC-NEXT: lwz 4, 28(1)171; PPC-NEXT: lwz 5, 16(1)172; PPC-NEXT: lwz 6, 20(1)173; PPC-NEXT: bl __divdf3174; PPC-NEXT: lwz 0, 36(1)175; PPC-NEXT: addi 1, 1, 32176; PPC-NEXT: mtlr 0177; PPC-NEXT: blr178;179; PPC64-LABEL: foo3:180; PPC64: # %bb.0: # %entry181; PPC64-NEXT: mflr 0182; PPC64-NEXT: stdu 1, -128(1)183; PPC64-NEXT: std 0, 144(1)184; PPC64-NEXT: ld 3, 120(1)185; PPC64-NEXT: ld 4, 112(1)186; PPC64-NEXT: bl __divdf3187; PPC64-NEXT: nop188; PPC64-NEXT: addi 1, 1, 128189; PPC64-NEXT: ld 0, 16(1)190; PPC64-NEXT: mtlr 0191; PPC64-NEXT: blr192;193; PPC64LE-LABEL: foo3:194; PPC64LE: # %bb.0: # %entry195; PPC64LE-NEXT: mflr 0196; PPC64LE-NEXT: stdu 1, -48(1)197; PPC64LE-NEXT: std 0, 64(1)198; PPC64LE-NEXT: ld 3, 40(1)199; PPC64LE-NEXT: ld 4, 32(1)200; PPC64LE-NEXT: bl __divdf3201; PPC64LE-NEXT: nop202; PPC64LE-NEXT: addi 1, 1, 48203; PPC64LE-NEXT: ld 0, 16(1)204; PPC64LE-NEXT: mtlr 0205; PPC64LE-NEXT: blr206entry:207 %a = alloca double, align 8208 %b = alloca double, align 8209 %0 = load double, ptr %a, align 8210 %1 = load double, ptr %b, align 8211 %div = fdiv double %0, %1212 ret double %div213}214 215; Function Attrs: noinline nounwind optnone uwtable216define dso_local zeroext i32 @func(double noundef %0, double noundef %1) #0 {217; PPC-LABEL: func:218; PPC: # %bb.0:219; PPC-NEXT: mflr 0220; PPC-NEXT: stwu 1, -32(1)221; PPC-NEXT: stw 0, 36(1)222; PPC-NEXT: # kill: def $r7 killed $r6223; PPC-NEXT: # kill: def $r7 killed $r5224; PPC-NEXT: # kill: def $r7 killed $r4225; PPC-NEXT: # kill: def $r7 killed $r3226; PPC-NEXT: stw 4, 28(1)227; PPC-NEXT: stw 3, 24(1)228; PPC-NEXT: stw 6, 20(1)229; PPC-NEXT: stw 5, 16(1)230; PPC-NEXT: lwz 3, 24(1)231; PPC-NEXT: stw 3, 8(1) # 4-byte Folded Spill232; PPC-NEXT: lwz 3, 28(1)233; PPC-NEXT: stw 3, 12(1) # 4-byte Folded Spill234; PPC-NEXT: lwz 3, 16(1)235; PPC-NEXT: lwz 4, 20(1)236; PPC-NEXT: lis 5, -15888237; PPC-NEXT: li 6, 0238; PPC-NEXT: bl __muldf3239; PPC-NEXT: mr 5, 3240; PPC-NEXT: lwz 3, 8(1) # 4-byte Folded Reload241; PPC-NEXT: mr 6, 4242; PPC-NEXT: lwz 4, 12(1) # 4-byte Folded Reload243; PPC-NEXT: bl __adddf3244; PPC-NEXT: bl __fixunsdfsi245; PPC-NEXT: lwz 0, 36(1)246; PPC-NEXT: addi 1, 1, 32247; PPC-NEXT: mtlr 0248; PPC-NEXT: blr249;250; PPC64-LABEL: func:251; PPC64: # %bb.0:252; PPC64-NEXT: mflr 0253; PPC64-NEXT: stdu 1, -144(1)254; PPC64-NEXT: std 0, 160(1)255; PPC64-NEXT: std 3, 136(1)256; PPC64-NEXT: std 4, 128(1)257; PPC64-NEXT: ld 3, 136(1)258; PPC64-NEXT: std 3, 120(1) # 8-byte Folded Spill259; PPC64-NEXT: ld 3, 128(1)260; PPC64-NEXT: li 4, 3103261; PPC64-NEXT: rldic 4, 4, 52, 0262; PPC64-NEXT: bl __muldf3263; PPC64-NEXT: nop264; PPC64-NEXT: mr 4, 3265; PPC64-NEXT: ld 3, 120(1) # 8-byte Folded Reload266; PPC64-NEXT: bl __adddf3267; PPC64-NEXT: nop268; PPC64-NEXT: bl __fixunsdfsi269; PPC64-NEXT: nop270; PPC64-NEXT: # kill: def $r3 killed $r3 killed $x3271; PPC64-NEXT: clrldi 3, 3, 32272; PPC64-NEXT: addi 1, 1, 144273; PPC64-NEXT: ld 0, 16(1)274; PPC64-NEXT: mtlr 0275; PPC64-NEXT: blr276;277; PPC64LE-LABEL: func:278; PPC64LE: # %bb.0:279; PPC64LE-NEXT: mflr 0280; PPC64LE-NEXT: stdu 1, -64(1)281; PPC64LE-NEXT: std 0, 80(1)282; PPC64LE-NEXT: std 3, 56(1)283; PPC64LE-NEXT: std 4, 48(1)284; PPC64LE-NEXT: ld 3, 56(1)285; PPC64LE-NEXT: std 3, 40(1) # 8-byte Folded Spill286; PPC64LE-NEXT: ld 3, 48(1)287; PPC64LE-NEXT: li 4, 3103288; PPC64LE-NEXT: rldic 4, 4, 52, 0289; PPC64LE-NEXT: bl __muldf3290; PPC64LE-NEXT: nop291; PPC64LE-NEXT: mr 4, 3292; PPC64LE-NEXT: ld 3, 40(1) # 8-byte Folded Reload293; PPC64LE-NEXT: bl __adddf3294; PPC64LE-NEXT: nop295; PPC64LE-NEXT: bl __fixunsdfsi296; PPC64LE-NEXT: nop297; PPC64LE-NEXT: # kill: def $r3 killed $r3 killed $x3298; PPC64LE-NEXT: clrldi 3, 3, 32299; PPC64LE-NEXT: addi 1, 1, 64300; PPC64LE-NEXT: ld 0, 16(1)301; PPC64LE-NEXT: mtlr 0302; PPC64LE-NEXT: blr303 %3 = alloca double, align 8304 %4 = alloca double, align 8305 store double %0, ptr %3, align 8306 store double %1, ptr %4, align 8307 %5 = load double, ptr %3, align 8308 %6 = load double, ptr %4, align 8309 %7 = fneg double %6310 %8 = call double @llvm.fmuladd.f64(double %7, double 0x41F0000000000000, double %5)311 %9 = fptoui double %8 to i32312 ret i32 %9313}314 315; To check ppc_fp128 soften without crash316define zeroext i1 @ppcf128_soften(ppc_fp128 %a) #0 {317; PPC-LABEL: ppcf128_soften:318; PPC: # %bb.0: # %entry319; PPC-NEXT: stwu 1, -16(1)320; PPC-NEXT: stw 5, 8(1) # 4-byte Folded Spill321; PPC-NEXT: mr 5, 4322; PPC-NEXT: lwz 4, 8(1) # 4-byte Folded Reload323; PPC-NEXT: stw 5, 12(1) # 4-byte Folded Spill324; PPC-NEXT: mr 5, 3325; PPC-NEXT: lwz 3, 12(1) # 4-byte Folded Reload326; PPC-NEXT: # kill: def $r4 killed $r3327; PPC-NEXT: # kill: def $r4 killed $r5328; PPC-NEXT: xoris 4, 5, 65520329; PPC-NEXT: or 4, 3, 4330; PPC-NEXT: cntlzw 4, 4331; PPC-NEXT: clrlwi 5, 5, 1332; PPC-NEXT: or 3, 3, 5333; PPC-NEXT: cntlzw 3, 3334; PPC-NEXT: or 3, 3, 4335; PPC-NEXT: srwi 3, 3, 5336; PPC-NEXT: addi 1, 1, 16337; PPC-NEXT: blr338;339; PPC64-LABEL: ppcf128_soften:340; PPC64: # %bb.0: # %entry341; PPC64-NEXT: li 4, 4095342; PPC64-NEXT: rldic 4, 4, 52, 0343; PPC64-NEXT: cmpld 7, 3, 4344; PPC64-NEXT: mfcr 4 # cr7345; PPC64-NEXT: rlwinm 4, 4, 31, 31, 31346; PPC64-NEXT: clrldi 3, 3, 1347; PPC64-NEXT: cmpldi 7, 3, 0348; PPC64-NEXT: mfcr 3 # cr7349; PPC64-NEXT: rlwinm 3, 3, 31, 31, 31350; PPC64-NEXT: or 4, 3, 4351; PPC64-NEXT: # implicit-def: $x3352; PPC64-NEXT: mr 3, 4353; PPC64-NEXT: clrldi 3, 3, 32354; PPC64-NEXT: blr355;356; PPC64LE-LABEL: ppcf128_soften:357; PPC64LE: # %bb.0: # %entry358; PPC64LE-NEXT: li 3, 4095359; PPC64LE-NEXT: rldic 3, 3, 52, 0360; PPC64LE-NEXT: cmpd 4, 3361; PPC64LE-NEXT: crmove 21, 2362; PPC64LE-NEXT: clrldi. 3, 4, 1363; PPC64LE-NEXT: crmove 20, 2364; PPC64LE-NEXT: cror 20, 20, 21365; PPC64LE-NEXT: li 4, 0366; PPC64LE-NEXT: li 3, 1367; PPC64LE-NEXT: isel 3, 3, 4, 20368; PPC64LE-NEXT: blr369entry:370 %fpclass = tail call i1 @llvm.is.fpclass.ppcf128(ppc_fp128 %a, i32 100)371 ret i1 %fpclass372}373 374; Function Attrs: nocallback nofree nosync nounwind speculatable willreturn memory(none)375declare double @llvm.fmuladd.f64(double, double, double) #1376declare i1 @llvm.is.fpclass.ppcf128(ppc_fp128, i32 immarg) #1377 378attributes #0 = {"use-soft-float"="true" nounwind }379attributes #1 = { nocallback nofree nosync nounwind speculatable willreturn memory(none) }380