361 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- | FileCheck %s \3; RUN: -check-prefix=PPC324; RUN: llc -verify-machineinstrs < %s -mcpu=ppc -mtriple=powerpc64 | FileCheck %s \5; RUN: -check-prefix=PPC646; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le -mattr=-direct-move \7; RUN: | FileCheck %s -check-prefix=PPC64LE8; RUN: llc -verify-machineinstrs < %s -mtriple=ppc32-- -mcpu=pwr9 \9; RUN: | FileCheck %s -check-prefix=P9_3210; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le -mcpu=pwr9 \11; RUN: | FileCheck %s -check-prefix=P912; RUN: llc -verify-machineinstrs < %s -mtriple=powerpc64le | FileCheck %s \13; RUN: -check-prefix=DM14 15define i32 @foo() #0 {16; PPC32-LABEL: foo:17; PPC32: # %bb.0: # %entry18; PPC32-NEXT: stwu 1, -32(1)19; PPC32-NEXT: mffs 020; PPC32-NEXT: stfd 0, 16(1)21; PPC32-NEXT: lwz 3, 20(1)22; PPC32-NEXT: clrlwi 4, 3, 3023; PPC32-NEXT: not 3, 324; PPC32-NEXT: rlwinm 3, 3, 31, 31, 3125; PPC32-NEXT: xor 3, 4, 326; PPC32-NEXT: stw 3, 24(1)27; PPC32-NEXT: stw 3, 28(1)28; PPC32-NEXT: addi 1, 1, 3229; PPC32-NEXT: blr30;31; PPC64-LABEL: foo:32; PPC64: # %bb.0: # %entry33; PPC64-NEXT: mffs 034; PPC64-NEXT: stfd 0, -16(1)35; PPC64-NEXT: lwz 3, -12(1)36; PPC64-NEXT: clrlwi 4, 3, 3037; PPC64-NEXT: not 3, 338; PPC64-NEXT: rlwinm 3, 3, 31, 31, 3139; PPC64-NEXT: xor 3, 4, 340; PPC64-NEXT: stw 3, -8(1)41; PPC64-NEXT: stw 3, -4(1)42; PPC64-NEXT: blr43;44; PPC64LE-LABEL: foo:45; PPC64LE: # %bb.0: # %entry46; PPC64LE-NEXT: mffs 047; PPC64LE-NEXT: stfd 0, -16(1)48; PPC64LE-NEXT: lwz 3, -16(1)49; PPC64LE-NEXT: clrlwi 4, 3, 3050; PPC64LE-NEXT: not 3, 351; PPC64LE-NEXT: rlwinm 3, 3, 31, 31, 3152; PPC64LE-NEXT: xor 3, 4, 353; PPC64LE-NEXT: stw 3, -8(1)54; PPC64LE-NEXT: stw 3, -4(1)55; PPC64LE-NEXT: blr56;57; P9_32-LABEL: foo:58; P9_32: # %bb.0: # %entry59; P9_32-NEXT: stwu 1, -32(1)60; P9_32-NEXT: mffs 061; P9_32-NEXT: stfd 0, 16(1)62; P9_32-NEXT: lwz 3, 20(1)63; P9_32-NEXT: clrlwi 4, 3, 3064; P9_32-NEXT: not 3, 365; P9_32-NEXT: rlwinm 3, 3, 31, 31, 3166; P9_32-NEXT: xor 3, 4, 367; P9_32-NEXT: stw 3, 24(1)68; P9_32-NEXT: stw 3, 28(1)69; P9_32-NEXT: addi 1, 1, 3270; P9_32-NEXT: blr71;72; P9-LABEL: foo:73; P9: # %bb.0: # %entry74; P9-NEXT: mffs 075; P9-NEXT: mffprd 3, 076; P9-NEXT: clrlwi 4, 3, 3077; P9-NEXT: not 3, 378; P9-NEXT: rlwinm 3, 3, 31, 31, 3179; P9-NEXT: xor 3, 4, 380; P9-NEXT: stw 3, -8(1)81; P9-NEXT: stw 3, -4(1)82; P9-NEXT: blr83;84; DM-LABEL: foo:85; DM: # %bb.0: # %entry86; DM-NEXT: mffs 087; DM-NEXT: mffprd 3, 088; DM-NEXT: clrlwi 4, 3, 3089; DM-NEXT: not 3, 390; DM-NEXT: rlwinm 3, 3, 31, 31, 3191; DM-NEXT: xor 3, 4, 392; DM-NEXT: stw 3, -8(1)93; DM-NEXT: stw 3, -4(1)94; DM-NEXT: blr95entry:96 %retval = alloca i32 ; <ptr> [#uses=2]97 %tmp = alloca i32 ; <ptr> [#uses=2]98 %"alloca point" = bitcast i32 0 to i32 ; <i32> [#uses=0]99 %tmp1 = call i32 @llvm.get.rounding( ) ; <i32> [#uses=1]100 store i32 %tmp1, ptr %tmp, align 4101 %tmp2 = load i32, ptr %tmp, align 4 ; <i32> [#uses=1]102 store i32 %tmp2, ptr %retval, align 4103 br label %return104 105return: ; preds = %entry106 %retval3 = load i32, ptr %retval ; <i32> [#uses=1]107 ret i32 %retval3108}109 110define void @setrnd_tozero() #0 {111; PPC32-LABEL: setrnd_tozero:112; PPC32: # %bb.0: # %entry113; PPC32-NEXT: mtfsb0 30114; PPC32-NEXT: mtfsb1 31115; PPC32-NEXT: blr116;117; PPC64-LABEL: setrnd_tozero:118; PPC64: # %bb.0: # %entry119; PPC64-NEXT: mtfsb0 30120; PPC64-NEXT: mtfsb1 31121; PPC64-NEXT: blr122;123; PPC64LE-LABEL: setrnd_tozero:124; PPC64LE: # %bb.0: # %entry125; PPC64LE-NEXT: mtfsb0 30126; PPC64LE-NEXT: mtfsb1 31127; PPC64LE-NEXT: blr128;129; P9_32-LABEL: setrnd_tozero:130; P9_32: # %bb.0: # %entry131; P9_32-NEXT: mffscrni 0, 1132; P9_32-NEXT: blr133;134; P9-LABEL: setrnd_tozero:135; P9: # %bb.0: # %entry136; P9-NEXT: mffscrni 0, 1137; P9-NEXT: blr138;139; DM-LABEL: setrnd_tozero:140; DM: # %bb.0: # %entry141; DM-NEXT: mtfsb0 30142; DM-NEXT: mtfsb1 31143; DM-NEXT: blr144entry:145 call void @llvm.set.rounding(i32 0)146 ret void147}148 149define void @setrnd_tonearest_tieeven() #0 {150; PPC32-LABEL: setrnd_tonearest_tieeven:151; PPC32: # %bb.0: # %entry152; PPC32-NEXT: mtfsb0 30153; PPC32-NEXT: mtfsb0 31154; PPC32-NEXT: blr155;156; PPC64-LABEL: setrnd_tonearest_tieeven:157; PPC64: # %bb.0: # %entry158; PPC64-NEXT: mtfsb0 30159; PPC64-NEXT: mtfsb0 31160; PPC64-NEXT: blr161;162; PPC64LE-LABEL: setrnd_tonearest_tieeven:163; PPC64LE: # %bb.0: # %entry164; PPC64LE-NEXT: mtfsb0 30165; PPC64LE-NEXT: mtfsb0 31166; PPC64LE-NEXT: blr167;168; P9_32-LABEL: setrnd_tonearest_tieeven:169; P9_32: # %bb.0: # %entry170; P9_32-NEXT: mffscrni 0, 0171; P9_32-NEXT: blr172;173; P9-LABEL: setrnd_tonearest_tieeven:174; P9: # %bb.0: # %entry175; P9-NEXT: mffscrni 0, 0176; P9-NEXT: blr177;178; DM-LABEL: setrnd_tonearest_tieeven:179; DM: # %bb.0: # %entry180; DM-NEXT: mtfsb0 30181; DM-NEXT: mtfsb0 31182; DM-NEXT: blr183entry:184 call void @llvm.set.rounding(i32 1)185 ret void186}187 188define void @setrnd_toposinf() #0 {189; PPC32-LABEL: setrnd_toposinf:190; PPC32: # %bb.0: # %entry191; PPC32-NEXT: mtfsb1 30192; PPC32-NEXT: mtfsb0 31193; PPC32-NEXT: blr194;195; PPC64-LABEL: setrnd_toposinf:196; PPC64: # %bb.0: # %entry197; PPC64-NEXT: mtfsb1 30198; PPC64-NEXT: mtfsb0 31199; PPC64-NEXT: blr200;201; PPC64LE-LABEL: setrnd_toposinf:202; PPC64LE: # %bb.0: # %entry203; PPC64LE-NEXT: mtfsb1 30204; PPC64LE-NEXT: mtfsb0 31205; PPC64LE-NEXT: blr206;207; P9_32-LABEL: setrnd_toposinf:208; P9_32: # %bb.0: # %entry209; P9_32-NEXT: mffscrni 0, 2210; P9_32-NEXT: blr211;212; P9-LABEL: setrnd_toposinf:213; P9: # %bb.0: # %entry214; P9-NEXT: mffscrni 0, 2215; P9-NEXT: blr216;217; DM-LABEL: setrnd_toposinf:218; DM: # %bb.0: # %entry219; DM-NEXT: mtfsb1 30220; DM-NEXT: mtfsb0 31221; DM-NEXT: blr222entry:223 call void @llvm.set.rounding(i32 2)224 ret void225}226 227define void @setrnd_toneginf() #0 {228; PPC32-LABEL: setrnd_toneginf:229; PPC32: # %bb.0: # %entry230; PPC32-NEXT: mtfsb1 30231; PPC32-NEXT: mtfsb1 31232; PPC32-NEXT: blr233;234; PPC64-LABEL: setrnd_toneginf:235; PPC64: # %bb.0: # %entry236; PPC64-NEXT: mtfsb1 30237; PPC64-NEXT: mtfsb1 31238; PPC64-NEXT: blr239;240; PPC64LE-LABEL: setrnd_toneginf:241; PPC64LE: # %bb.0: # %entry242; PPC64LE-NEXT: mtfsb1 30243; PPC64LE-NEXT: mtfsb1 31244; PPC64LE-NEXT: blr245;246; P9_32-LABEL: setrnd_toneginf:247; P9_32: # %bb.0: # %entry248; P9_32-NEXT: mffscrni 0, 3249; P9_32-NEXT: blr250;251; P9-LABEL: setrnd_toneginf:252; P9: # %bb.0: # %entry253; P9-NEXT: mffscrni 0, 3254; P9-NEXT: blr255;256; DM-LABEL: setrnd_toneginf:257; DM: # %bb.0: # %entry258; DM-NEXT: mtfsb1 30259; DM-NEXT: mtfsb1 31260; DM-NEXT: blr261entry:262 call void @llvm.set.rounding(i32 3)263 ret void264}265 266define void @setrnd_var(i32 %x) #0 {267; PPC32-LABEL: setrnd_var:268; PPC32: # %bb.0: # %entry269; PPC32-NEXT: stwu 1, -16(1)270; PPC32-NEXT: mffs 0271; PPC32-NEXT: stfd 0, 8(1)272; PPC32-NEXT: clrlwi 4, 3, 30273; PPC32-NEXT: lwz 5, 12(1)274; PPC32-NEXT: rlwinm 3, 3, 31, 31, 31275; PPC32-NEXT: xor 3, 3, 4276; PPC32-NEXT: xori 3, 3, 1277; PPC32-NEXT: rlwimi 5, 3, 0, 30, 31278; PPC32-NEXT: stw 5, 12(1)279; PPC32-NEXT: lfd 0, 8(1)280; PPC32-NEXT: mtfsf 255, 0281; PPC32-NEXT: addi 1, 1, 16282; PPC32-NEXT: blr283;284; PPC64-LABEL: setrnd_var:285; PPC64: # %bb.0: # %entry286; PPC64-NEXT: mffs 0287; PPC64-NEXT: stfd 0, -16(1)288; PPC64-NEXT: clrlwi 4, 3, 30289; PPC64-NEXT: rlwinm 3, 3, 31, 31, 31290; PPC64-NEXT: ld 5, -16(1)291; PPC64-NEXT: xor 3, 3, 4292; PPC64-NEXT: xori 3, 3, 1293; PPC64-NEXT: clrldi 3, 3, 32294; PPC64-NEXT: rldimi 5, 3, 0, 62295; PPC64-NEXT: std 5, -8(1)296; PPC64-NEXT: lfd 0, -8(1)297; PPC64-NEXT: mtfsf 255, 0298; PPC64-NEXT: blr299;300; PPC64LE-LABEL: setrnd_var:301; PPC64LE: # %bb.0: # %entry302; PPC64LE-NEXT: mffs 0303; PPC64LE-NEXT: clrlwi 4, 3, 30304; PPC64LE-NEXT: rlwinm 3, 3, 31, 31, 31305; PPC64LE-NEXT: stfd 0, -16(1)306; PPC64LE-NEXT: xor 3, 3, 4307; PPC64LE-NEXT: ld 4, -16(1)308; PPC64LE-NEXT: xori 3, 3, 1309; PPC64LE-NEXT: clrldi 3, 3, 32310; PPC64LE-NEXT: rldimi 4, 3, 0, 62311; PPC64LE-NEXT: std 4, -8(1)312; PPC64LE-NEXT: lfd 0, -8(1)313; PPC64LE-NEXT: mtfsf 255, 0314; PPC64LE-NEXT: blr315;316; P9_32-LABEL: setrnd_var:317; P9_32: # %bb.0: # %entry318; P9_32-NEXT: stwu 1, -16(1)319; P9_32-NEXT: clrlwi 4, 3, 30320; P9_32-NEXT: rlwinm 3, 3, 31, 31, 31321; P9_32-NEXT: xor 3, 3, 4322; P9_32-NEXT: xori 3, 3, 1323; P9_32-NEXT: stw 3, 12(1)324; P9_32-NEXT: lfd 0, 8(1)325; P9_32-NEXT: mffscrn 0, 0326; P9_32-NEXT: addi 1, 1, 16327; P9_32-NEXT: blr328;329; P9-LABEL: setrnd_var:330; P9: # %bb.0: # %entry331; P9-NEXT: clrlwi 4, 3, 30332; P9-NEXT: rlwinm 3, 3, 31, 31, 31333; P9-NEXT: xor 3, 3, 4334; P9-NEXT: xori 3, 3, 1335; P9-NEXT: mtfprd 0, 3336; P9-NEXT: mffscrn 0, 0337; P9-NEXT: blr338;339; DM-LABEL: setrnd_var:340; DM: # %bb.0: # %entry341; DM-NEXT: clrlwi 4, 3, 30342; DM-NEXT: rlwinm 3, 3, 31, 31, 31343; DM-NEXT: xor 3, 3, 4344; DM-NEXT: xori 3, 3, 1345; DM-NEXT: clrldi 3, 3, 32346; DM-NEXT: mffs 0347; DM-NEXT: mffprd 4, 0348; DM-NEXT: rldimi 4, 3, 0, 62349; DM-NEXT: mtfprd 0, 4350; DM-NEXT: mtfsf 255, 0351; DM-NEXT: blr352entry:353 call void @llvm.set.rounding(i32 %x)354 ret void355}356 357declare i32 @llvm.get.rounding() #0358declare void @llvm.set.rounding(i32) #0359 360attributes #0 = { nounwind }361