1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py 2; RUN: llc -mtriple=powerpc64le-unknown-linux-unknown -verify-machineinstrs %s \ 3; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64LE 4; RUN: llc -mtriple=powerpc64-unknown-linux-unknown -verify-machineinstrs %s \ 5; RUN: -ppc-asm-full-reg-names -o - | FileCheck %s --check-prefix=PPC64BE 6 7define dso_local void @ClobberLR() local_unnamed_addr #0 { 8; PPC64LE-LABEL: ClobberLR: 9; PPC64LE: # %bb.0: # %entry 10; PPC64LE-NEXT: mflr r0 11; PPC64LE-NEXT: std r0, 16(r1) 12; PPC64LE-NEXT: stdu r1, -32(r1) 13; PPC64LE-NEXT: #APP 14; PPC64LE-NEXT: #NO_APP 15; PPC64LE-NEXT: addi r1, r1, 32 16; PPC64LE-NEXT: ld r0, 16(r1) 17; PPC64LE-NEXT: mtlr r0 18; PPC64LE-NEXT: blr 19; 20; PPC64BE-LABEL: ClobberLR: 21; PPC64BE: # %bb.0: # %entry 22; PPC64BE-NEXT: mflr r0 23; PPC64BE-NEXT: std r0, 16(r1) 24; PPC64BE-NEXT: stdu r1, -48(r1) 25; PPC64BE-NEXT: #APP 26; PPC64BE-NEXT: #NO_APP 27; PPC64BE-NEXT: addi r1, r1, 48 28; PPC64BE-NEXT: ld r0, 16(r1) 29; PPC64BE-NEXT: mtlr r0 30; PPC64BE-NEXT: blr 31entry: 32 tail call void asm sideeffect "", "~{lr}"() 33 ret void 34} 35 36define dso_local void @ClobberR5() local_unnamed_addr #0 { 37; PPC64LE-LABEL: ClobberR5: 38; PPC64LE: # %bb.0: # %entry 39; PPC64LE-NEXT: #APP 40; PPC64LE-NEXT: #NO_APP 41; PPC64LE-NEXT: blr 42; 43; PPC64BE-LABEL: ClobberR5: 44; PPC64BE: # %bb.0: # %entry 45; PPC64BE-NEXT: #APP 46; PPC64BE-NEXT: #NO_APP 47; PPC64BE-NEXT: blr 48entry: 49 tail call void asm sideeffect "", "~{r5}"() 50 ret void 51} 52 53define dso_local void @ClobberR15() local_unnamed_addr #0 { 54; PPC64LE-LABEL: ClobberR15: 55; PPC64LE: # %bb.0: # %entry 56; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 57; PPC64LE-NEXT: #APP 58; PPC64LE-NEXT: #NO_APP 59; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 60; PPC64LE-NEXT: blr 61; 62; PPC64BE-LABEL: ClobberR15: 63; PPC64BE: # %bb.0: # %entry 64; PPC64BE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 65; PPC64BE-NEXT: #APP 66; PPC64BE-NEXT: #NO_APP 67; PPC64BE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 68; PPC64BE-NEXT: blr 69entry: 70 tail call void asm sideeffect "", "~{r15}"() 71 ret void 72} 73 74;; Test for INLINEASM_BR 75define dso_local signext i32 @ClobberLR_BR(i32 signext %in) #0 { 76; PPC64LE-LABEL: ClobberLR_BR: 77; PPC64LE: # %bb.0: # %entry 78; PPC64LE-NEXT: mflr r0 79; PPC64LE-NEXT: std r0, 16(r1) 80; PPC64LE-NEXT: stdu r1, -32(r1) 81; PPC64LE-NEXT: #APP 82; PPC64LE-NEXT: nop 83; PPC64LE-NEXT: #NO_APP 84; PPC64LE-NEXT: .LBB3_1: # %return 85; PPC64LE-NEXT: extsw r3, r3 86; PPC64LE-NEXT: addi r1, r1, 32 87; PPC64LE-NEXT: ld r0, 16(r1) 88; PPC64LE-NEXT: mtlr r0 89; PPC64LE-NEXT: blr 90; PPC64LE-NEXT: .Ltmp0: # Block address taken 91; PPC64LE-NEXT: .LBB3_2: # %return_early 92; PPC64LE-NEXT: li r3, 0 93; PPC64LE-NEXT: b .LBB3_1 94; 95; PPC64BE-LABEL: ClobberLR_BR: 96; PPC64BE: # %bb.0: # %entry 97; PPC64BE-NEXT: mflr r0 98; PPC64BE-NEXT: std r0, 16(r1) 99; PPC64BE-NEXT: stdu r1, -48(r1) 100; PPC64BE-NEXT: #APP 101; PPC64BE-NEXT: nop 102; PPC64BE-NEXT: #NO_APP 103; PPC64BE-NEXT: .LBB3_1: # %return 104; PPC64BE-NEXT: extsw r3, r3 105; PPC64BE-NEXT: addi r1, r1, 48 106; PPC64BE-NEXT: ld r0, 16(r1) 107; PPC64BE-NEXT: mtlr r0 108; PPC64BE-NEXT: blr 109; PPC64BE-NEXT: .Ltmp0: # Block address taken 110; PPC64BE-NEXT: .LBB3_2: # %return_early 111; PPC64BE-NEXT: li r3, 0 112; PPC64BE-NEXT: b .LBB3_1 113entry: 114 callbr void asm sideeffect "nop", "!i,~{lr}"() 115 to label %return [label %return_early] 116 117return_early: 118 br label %return 119 120return: 121 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ] 122 ret i32 %retval.0 123} 124 125define dso_local signext i32 @ClobberR5_BR(i32 signext %in) #0 { 126; PPC64LE-LABEL: ClobberR5_BR: 127; PPC64LE: # %bb.0: # %entry 128; PPC64LE-NEXT: #APP 129; PPC64LE-NEXT: nop 130; PPC64LE-NEXT: #NO_APP 131; PPC64LE-NEXT: # %bb.1: # %return 132; PPC64LE-NEXT: extsw r3, r3 133; PPC64LE-NEXT: blr 134; PPC64LE-NEXT: .Ltmp1: # Block address taken 135; PPC64LE-NEXT: .LBB4_2: # %return_early 136; PPC64LE-NEXT: li r3, 0 137; PPC64LE-NEXT: extsw r3, r3 138; PPC64LE-NEXT: blr 139; 140; PPC64BE-LABEL: ClobberR5_BR: 141; PPC64BE: # %bb.0: # %entry 142; PPC64BE-NEXT: #APP 143; PPC64BE-NEXT: nop 144; PPC64BE-NEXT: #NO_APP 145; PPC64BE-NEXT: # %bb.1: # %return 146; PPC64BE-NEXT: extsw r3, r3 147; PPC64BE-NEXT: blr 148; PPC64BE-NEXT: .Ltmp1: # Block address taken 149; PPC64BE-NEXT: .LBB4_2: # %return_early 150; PPC64BE-NEXT: li r3, 0 151; PPC64BE-NEXT: extsw r3, r3 152; PPC64BE-NEXT: blr 153entry: 154 callbr void asm sideeffect "nop", "!i,~{r5}"() 155 to label %return [label %return_early] 156 157return_early: 158 br label %return 159 160return: 161 %retval.0 = phi i32 [ 0, %return_early ], [ %in, %entry ] 162 ret i32 %retval.0 163} 164 165 166 167define dso_local void @DefLR() local_unnamed_addr #0 { 168; PPC64LE-LABEL: DefLR: 169; PPC64LE: # %bb.0: # %entry 170; PPC64LE-NEXT: mflr r0 171; PPC64LE-NEXT: std r0, 16(r1) 172; PPC64LE-NEXT: stdu r1, -32(r1) 173; PPC64LE-NEXT: #APP 174; PPC64LE-NEXT: #NO_APP 175; PPC64LE-NEXT: addi r1, r1, 32 176; PPC64LE-NEXT: ld r0, 16(r1) 177; PPC64LE-NEXT: mtlr r0 178; PPC64LE-NEXT: blr 179; 180; PPC64BE-LABEL: DefLR: 181; PPC64BE: # %bb.0: # %entry 182; PPC64BE-NEXT: mflr r0 183; PPC64BE-NEXT: std r0, 16(r1) 184; PPC64BE-NEXT: stdu r1, -48(r1) 185; PPC64BE-NEXT: #APP 186; PPC64BE-NEXT: #NO_APP 187; PPC64BE-NEXT: addi r1, r1, 48 188; PPC64BE-NEXT: ld r0, 16(r1) 189; PPC64BE-NEXT: mtlr r0 190; PPC64BE-NEXT: blr 191entry: 192 tail call i64 asm sideeffect "", "={lr}"() 193 ret void 194} 195 196define dso_local void @EarlyClobberLR() local_unnamed_addr #0 { 197; PPC64LE-LABEL: EarlyClobberLR: 198; PPC64LE: # %bb.0: # %entry 199; PPC64LE-NEXT: mflr r0 200; PPC64LE-NEXT: std r0, 16(r1) 201; PPC64LE-NEXT: stdu r1, -32(r1) 202; PPC64LE-NEXT: #APP 203; PPC64LE-NEXT: #NO_APP 204; PPC64LE-NEXT: addi r1, r1, 32 205; PPC64LE-NEXT: ld r0, 16(r1) 206; PPC64LE-NEXT: mtlr r0 207; PPC64LE-NEXT: blr 208; 209; PPC64BE-LABEL: EarlyClobberLR: 210; PPC64BE: # %bb.0: # %entry 211; PPC64BE-NEXT: mflr r0 212; PPC64BE-NEXT: std r0, 16(r1) 213; PPC64BE-NEXT: stdu r1, -48(r1) 214; PPC64BE-NEXT: #APP 215; PPC64BE-NEXT: #NO_APP 216; PPC64BE-NEXT: addi r1, r1, 48 217; PPC64BE-NEXT: ld r0, 16(r1) 218; PPC64BE-NEXT: mtlr r0 219; PPC64BE-NEXT: blr 220entry: 221 tail call i64 asm sideeffect "", "=&{lr}"() 222 ret void 223} 224 225define dso_local void @ClobberMulti() local_unnamed_addr #0 { 226; PPC64LE-LABEL: ClobberMulti: 227; PPC64LE: # %bb.0: # %entry 228; PPC64LE-NEXT: mflr r0 229; PPC64LE-NEXT: std r15, -136(r1) # 8-byte Folded Spill 230; PPC64LE-NEXT: std r16, -128(r1) # 8-byte Folded Spill 231; PPC64LE-NEXT: std r0, 16(r1) 232; PPC64LE-NEXT: stdu r1, -176(r1) 233; PPC64LE-NEXT: #APP 234; PPC64LE-NEXT: #NO_APP 235; PPC64LE-NEXT: addi r1, r1, 176 236; PPC64LE-NEXT: ld r0, 16(r1) 237; PPC64LE-NEXT: ld r16, -128(r1) # 8-byte Folded Reload 238; PPC64LE-NEXT: ld r15, -136(r1) # 8-byte Folded Reload 239; PPC64LE-NEXT: mtlr r0 240; PPC64LE-NEXT: blr 241; 242; PPC64BE-LABEL: ClobberMulti: 243; PPC64BE: # %bb.0: # %entry 244; PPC64BE-NEXT: mflr r0 245; PPC64BE-NEXT: std r0, 16(r1) 246; PPC64BE-NEXT: stdu r1, -192(r1) 247; PPC64BE-NEXT: std r15, 56(r1) # 8-byte Folded Spill 248; PPC64BE-NEXT: std r16, 64(r1) # 8-byte Folded Spill 249; PPC64BE-NEXT: #APP 250; PPC64BE-NEXT: #NO_APP 251; PPC64BE-NEXT: ld r16, 64(r1) # 8-byte Folded Reload 252; PPC64BE-NEXT: ld r15, 56(r1) # 8-byte Folded Reload 253; PPC64BE-NEXT: addi r1, r1, 192 254; PPC64BE-NEXT: ld r0, 16(r1) 255; PPC64BE-NEXT: mtlr r0 256; PPC64BE-NEXT: blr 257entry: 258 tail call void asm sideeffect "", "~{lr},~{r15},~{r16}"() 259 ret void 260} 261 262attributes #0 = { nounwind } 263