261 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=powerpc64le-unknown-linux-unknown -verify-machineinstrs %s \3; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64LE4; RUN: llc -mtriple=powerpc64-unknown-linux-unknown -verify-machineinstrs %s \5; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64BE6 7define dso_local void @ClobberLR() local_unnamed_addr #0 {8; PPC64LE-LABEL: ClobberLR:9; PPC64LE: # %bb.0: # %entry10; PPC64LE-NEXT: mflr r011; PPC64LE-NEXT: stdu r1, -32(r1)12; PPC64LE-NEXT: std r0, 48(r1)13; PPC64LE-NEXT: #APP14; PPC64LE-NEXT: #NO_APP15; PPC64LE-NEXT: addi r1, r1, 3216; PPC64LE-NEXT: ld r0, 16(r1)17; PPC64LE-NEXT: mtlr r018; PPC64LE-NEXT: blr19;20; PPC64BE-LABEL: ClobberLR:21; PPC64BE: # %bb.0: # %entry22; PPC64BE-NEXT: mflr r023; PPC64BE-NEXT: stdu r1, -48(r1)24; PPC64BE-NEXT: std r0, 64(r1)25; PPC64BE-NEXT: #APP26; PPC64BE-NEXT: #NO_APP27; PPC64BE-NEXT: addi r1, r1, 4828; PPC64BE-NEXT: ld r0, 16(r1)29; PPC64BE-NEXT: mtlr r030; PPC64BE-NEXT: blr31entry:32 tail call void asm sideeffect "", "~{lr}"()33 ret void34}35 36define dso_local void @ClobberR5() local_unnamed_addr #0 {37; PPC64LE-LABEL: ClobberR5:38; PPC64LE: # %bb.0: # %entry39; PPC64LE-NEXT: #APP40; PPC64LE-NEXT: #NO_APP41; PPC64LE-NEXT: blr42;43; PPC64BE-LABEL: ClobberR5:44; PPC64BE: # %bb.0: # %entry45; PPC64BE-NEXT: #APP46; PPC64BE-NEXT: #NO_APP47; PPC64BE-NEXT: blr48entry:49 tail call void asm sideeffect "", "~{r5}"()50 ret void51}52 53define dso_local void @ClobberR15() local_unnamed_addr #0 {54; PPC64LE-LABEL: ClobberR15:55; PPC64LE: # %bb.0: # %entry56; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill57; PPC64LE-NEXT: #APP58; PPC64LE-NEXT: #NO_APP59; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload60; PPC64LE-NEXT: blr61;62; PPC64BE-LABEL: ClobberR15:63; PPC64BE: # %bb.0: # %entry64; PPC64BE-NEXT: std r15, -136(r1) # 8-byte Folded Spill65; PPC64BE-NEXT: #APP66; PPC64BE-NEXT: #NO_APP67; PPC64BE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload68; PPC64BE-NEXT: blr69entry:70 tail call void asm sideeffect "", "~{r15}"()71 ret void72}73 74;; Test for INLINEASM_BR75define dso_local signext i32 @ClobberLR_BR(i32 signext %in) #0 {76; PPC64LE-LABEL: ClobberLR_BR:77; PPC64LE: # %bb.0: # %entry78; PPC64LE-NEXT: mflr r079; PPC64LE-NEXT: stdu r1, -32(r1)80; PPC64LE-NEXT: std r0, 48(r1)81; PPC64LE-NEXT: #APP82; PPC64LE-NEXT: nop83; PPC64LE-NEXT: #NO_APP84; PPC64LE-NEXT: .LBB3_1: # %return85; PPC64LE-NEXT: addi r1, r1, 3286; PPC64LE-NEXT: ld r0, 16(r1)87; PPC64LE-NEXT: mtlr r088; PPC64LE-NEXT: blr89; PPC64LE-NEXT: .LBB3_2: # Inline asm indirect target90; PPC64LE-NEXT: # %return_early91; PPC64LE-NEXT: # Label of block must be emitted92; PPC64LE-NEXT: li r3, 093; PPC64LE-NEXT: b .LBB3_194;95; PPC64BE-LABEL: ClobberLR_BR:96; PPC64BE: # %bb.0: # %entry97; PPC64BE-NEXT: mflr r098; PPC64BE-NEXT: stdu r1, -48(r1)99; PPC64BE-NEXT: std r0, 64(r1)100; PPC64BE-NEXT: #APP101; PPC64BE-NEXT: nop102; PPC64BE-NEXT: #NO_APP103; PPC64BE-NEXT: .LBB3_1: # %return104; PPC64BE-NEXT: addi r1, r1, 48105; PPC64BE-NEXT: ld r0, 16(r1)106; PPC64BE-NEXT: mtlr r0107; PPC64BE-NEXT: blr108; PPC64BE-NEXT: .LBB3_2: # Inline asm indirect target109; PPC64BE-NEXT: # %return_early110; PPC64BE-NEXT: # Label of block must be emitted111; PPC64BE-NEXT: li r3, 0112; PPC64BE-NEXT: b .LBB3_1113entry:114 callbr void asm sideeffect "nop", "!i,~{lr}"()115 to label %return [label %return_early]116 117return_early:118 br label %return119 120return:121 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ]122 ret i32 %retval.0123}124 125define dso_local signext i32 @ClobberR5_BR(i32 signext %in) #0 {126; PPC64LE-LABEL: ClobberR5_BR:127; PPC64LE: # %bb.0: # %entry128; PPC64LE-NEXT: #APP129; PPC64LE-NEXT: nop130; PPC64LE-NEXT: #NO_APP131; PPC64LE-NEXT: # %bb.1: # %return132; PPC64LE-NEXT: blr133; PPC64LE-NEXT: .LBB4_2: # Inline asm indirect target134; PPC64LE-NEXT: # %return_early135; PPC64LE-NEXT: # Label of block must be emitted136; PPC64LE-NEXT: li r3, 0137; PPC64LE-NEXT: blr138;139; PPC64BE-LABEL: ClobberR5_BR:140; PPC64BE: # %bb.0: # %entry141; PPC64BE-NEXT: #APP142; PPC64BE-NEXT: nop143; PPC64BE-NEXT: #NO_APP144; PPC64BE-NEXT: # %bb.1: # %return145; PPC64BE-NEXT: blr146; PPC64BE-NEXT: .LBB4_2: # Inline asm indirect target147; PPC64BE-NEXT: # %return_early148; PPC64BE-NEXT: # Label of block must be emitted149; PPC64BE-NEXT: li r3, 0150; PPC64BE-NEXT: blr151entry:152 callbr void asm sideeffect "nop", "!i,~{r5}"()153 to label %return [label %return_early]154 155return_early:156 br label %return157 158return:159 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ]160 ret i32 %retval.0161}162 163 164 165define dso_local void @DefLR() local_unnamed_addr #0 {166; PPC64LE-LABEL: DefLR:167; PPC64LE: # %bb.0: # %entry168; PPC64LE-NEXT: mflr r0169; PPC64LE-NEXT: stdu r1, -32(r1)170; PPC64LE-NEXT: std r0, 48(r1)171; PPC64LE-NEXT: #APP172; PPC64LE-NEXT: #NO_APP173; PPC64LE-NEXT: addi r1, r1, 32174; PPC64LE-NEXT: ld r0, 16(r1)175; PPC64LE-NEXT: mtlr r0176; PPC64LE-NEXT: blr177;178; PPC64BE-LABEL: DefLR:179; PPC64BE: # %bb.0: # %entry180; PPC64BE-NEXT: mflr r0181; PPC64BE-NEXT: stdu r1, -48(r1)182; PPC64BE-NEXT: std r0, 64(r1)183; PPC64BE-NEXT: #APP184; PPC64BE-NEXT: #NO_APP185; PPC64BE-NEXT: addi r1, r1, 48186; PPC64BE-NEXT: ld r0, 16(r1)187; PPC64BE-NEXT: mtlr r0188; PPC64BE-NEXT: blr189entry:190 tail call i64 asm sideeffect "", "={lr}"()191 ret void192}193 194define dso_local void @EarlyClobberLR() local_unnamed_addr #0 {195; PPC64LE-LABEL: EarlyClobberLR:196; PPC64LE: # %bb.0: # %entry197; PPC64LE-NEXT: mflr r0198; PPC64LE-NEXT: stdu r1, -32(r1)199; PPC64LE-NEXT: std r0, 48(r1)200; PPC64LE-NEXT: #APP201; PPC64LE-NEXT: #NO_APP202; PPC64LE-NEXT: addi r1, r1, 32203; PPC64LE-NEXT: ld r0, 16(r1)204; PPC64LE-NEXT: mtlr r0205; PPC64LE-NEXT: blr206;207; PPC64BE-LABEL: EarlyClobberLR:208; PPC64BE: # %bb.0: # %entry209; PPC64BE-NEXT: mflr r0210; PPC64BE-NEXT: stdu r1, -48(r1)211; PPC64BE-NEXT: std r0, 64(r1)212; PPC64BE-NEXT: #APP213; PPC64BE-NEXT: #NO_APP214; PPC64BE-NEXT: addi r1, r1, 48215; PPC64BE-NEXT: ld r0, 16(r1)216; PPC64BE-NEXT: mtlr r0217; PPC64BE-NEXT: blr218entry:219 tail call i64 asm sideeffect "", "=&{lr}"()220 ret void221}222 223define dso_local void @ClobberMulti() local_unnamed_addr #0 {224; PPC64LE-LABEL: ClobberMulti:225; PPC64LE: # %bb.0: # %entry226; PPC64LE-NEXT: mflr r0227; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill228; PPC64LE-NEXT: std r16, -128(r1) # 8-byte Folded Spill229; PPC64LE-NEXT: stdu r1, -176(r1)230; PPC64LE-NEXT: std r0, 192(r1)231; PPC64LE-NEXT: #APP232; PPC64LE-NEXT: #NO_APP233; PPC64LE-NEXT: addi r1, r1, 176234; PPC64LE-NEXT: ld r0, 16(r1)235; PPC64LE-NEXT: ld r16, -128(r1) # 8-byte Folded Reload236; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload237; PPC64LE-NEXT: mtlr r0238; PPC64LE-NEXT: blr239;240; PPC64BE-LABEL: ClobberMulti:241; PPC64BE: # %bb.0: # %entry242; PPC64BE-NEXT: mflr r0243; PPC64BE-NEXT: stdu r1, -192(r1)244; PPC64BE-NEXT: std r0, 208(r1)245; PPC64BE-NEXT: std r15, 56(r1) # 8-byte Folded Spill246; PPC64BE-NEXT: std r16, 64(r1) # 8-byte Folded Spill247; PPC64BE-NEXT: #APP248; PPC64BE-NEXT: #NO_APP249; PPC64BE-NEXT: ld r16, 64(r1) # 8-byte Folded Reload250; PPC64BE-NEXT: ld r15, 56(r1) # 8-byte Folded Reload251; PPC64BE-NEXT: addi r1, r1, 192252; PPC64BE-NEXT: ld r0, 16(r1)253; PPC64BE-NEXT: mtlr r0254; PPC64BE-NEXT: blr255entry:256 tail call void asm sideeffect "", "~{lr},~{r15},~{r16}"()257 ret void258}259 260attributes #0 = { nounwind }261