1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 2; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=32BIT 3; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=64BIT 4 5define void @i64_join(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j) #0 { 6; 32BIT-LABEL: i64_join: 7; 32BIT: # %bb.0: # %entry 8; 32BIT-NEXT: mflr 0 9; 32BIT-NEXT: stwu 1, -64(1) 10; 32BIT-NEXT: stw 0, 72(1) 11; 32BIT-NEXT: stw 10, 116(1) 12; 32BIT-NEXT: stw 9, 112(1) 13; 32BIT-NEXT: stw 8, 108(1) 14; 32BIT-NEXT: stw 7, 104(1) 15; 32BIT-NEXT: stw 6, 100(1) 16; 32BIT-NEXT: stw 5, 96(1) 17; 32BIT-NEXT: stw 4, 92(1) 18; 32BIT-NEXT: stw 3, 88(1) 19; 32BIT-NEXT: bl .foo[PR] 20; 32BIT-NEXT: nop 21; 32BIT-NEXT: addi 1, 1, 64 22; 32BIT-NEXT: lwz 0, 8(1) 23; 32BIT-NEXT: mtlr 0 24; 32BIT-NEXT: blr 25; 26; 64BIT-LABEL: i64_join: 27; 64BIT: # %bb.0: # %entry 28; 64BIT-NEXT: mflr 0 29; 64BIT-NEXT: stdu 1, -112(1) 30; 64BIT-NEXT: std 0, 128(1) 31; 64BIT-NEXT: std 10, 216(1) 32; 64BIT-NEXT: std 9, 208(1) 33; 64BIT-NEXT: std 8, 200(1) 34; 64BIT-NEXT: std 7, 192(1) 35; 64BIT-NEXT: std 6, 184(1) 36; 64BIT-NEXT: std 5, 176(1) 37; 64BIT-NEXT: std 4, 168(1) 38; 64BIT-NEXT: std 3, 160(1) 39; 64BIT-NEXT: bl .foo[PR] 40; 64BIT-NEXT: nop 41; 64BIT-NEXT: addi 1, 1, 112 42; 64BIT-NEXT: ld 0, 16(1) 43; 64BIT-NEXT: mtlr 0 44; 64BIT-NEXT: blr 45entry: 46 %add = add nsw i64 %b, %a 47 %add1 = add nsw i64 %add, %c 48 %add2 = add nsw i64 %add1, %d 49 %add3 = add nsw i64 %add2, %e 50 %add4 = add nsw i64 %add3, %f 51 %add5 = add nsw i64 %add4, %g 52 %add6 = add nsw i64 %add5, %h 53 %add7 = add nsw i64 %add6, %i 54 %add8 = add nsw i64 %add7, %j 55 tail call void @foo() 56 ret void 57} 58 59define void @i64_join_missing(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j) #0 { 60; 32BIT-LABEL: i64_join_missing: 61; 32BIT: # %bb.0: # %entry 62; 32BIT-NEXT: mflr 0 63; 32BIT-NEXT: stwu 1, -64(1) 64; 32BIT-NEXT: stw 0, 72(1) 65; 32BIT-NEXT: stw 10, 116(1) 66; 32BIT-NEXT: stw 9, 112(1) 67; 32BIT-NEXT: stw 8, 108(1) 68; 32BIT-NEXT: stw 7, 104(1) 69; 32BIT-NEXT: stw 6, 100(1) 70; 32BIT-NEXT: stw 5, 96(1) 71; 32BIT-NEXT: stw 4, 92(1) 72; 32BIT-NEXT: stw 3, 88(1) 73; 32BIT-NEXT: bl .foo[PR] 74; 32BIT-NEXT: nop 75; 32BIT-NEXT: addi 1, 1, 64 76; 32BIT-NEXT: lwz 0, 8(1) 77; 32BIT-NEXT: mtlr 0 78; 32BIT-NEXT: blr 79; 80; 64BIT-LABEL: i64_join_missing: 81; 64BIT: # %bb.0: # %entry 82; 64BIT-NEXT: mflr 0 83; 64BIT-NEXT: stdu 1, -112(1) 84; 64BIT-NEXT: std 0, 128(1) 85; 64BIT-NEXT: std 10, 216(1) 86; 64BIT-NEXT: std 9, 208(1) 87; 64BIT-NEXT: std 8, 200(1) 88; 64BIT-NEXT: std 7, 192(1) 89; 64BIT-NEXT: std 6, 184(1) 90; 64BIT-NEXT: std 5, 176(1) 91; 64BIT-NEXT: std 4, 168(1) 92; 64BIT-NEXT: std 3, 160(1) 93; 64BIT-NEXT: bl .foo[PR] 94; 64BIT-NEXT: nop 95; 64BIT-NEXT: addi 1, 1, 112 96; 64BIT-NEXT: ld 0, 16(1) 97; 64BIT-NEXT: mtlr 0 98; 64BIT-NEXT: blr 99entry: 100 %add1 = mul nsw i64 %a, 3 101 %add2 = add nsw i64 %add1, %d 102 %add3 = add nsw i64 %add2, %e 103 %add4 = add nsw i64 %add3, %f 104 %add5 = add nsw i64 %add4, %g 105 %add6 = add nsw i64 %add5, %h 106 %add7 = add nsw i64 %add6, %i 107 %add8 = add nsw i64 %add7, %j 108 tail call void @foo() 109 ret void 110} 111 112define void @i32_join(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i32 signext %i, i32 signext %j) #0 { 113; 32BIT-LABEL: i32_join: 114; 32BIT: # %bb.0: # %entry 115; 32BIT-NEXT: mflr 0 116; 32BIT-NEXT: stwu 1, -64(1) 117; 32BIT-NEXT: stw 0, 72(1) 118; 32BIT-NEXT: stw 10, 116(1) 119; 32BIT-NEXT: stw 9, 112(1) 120; 32BIT-NEXT: stw 8, 108(1) 121; 32BIT-NEXT: stw 7, 104(1) 122; 32BIT-NEXT: stw 6, 100(1) 123; 32BIT-NEXT: stw 5, 96(1) 124; 32BIT-NEXT: stw 4, 92(1) 125; 32BIT-NEXT: stw 3, 88(1) 126; 32BIT-NEXT: bl .foo[PR] 127; 32BIT-NEXT: nop 128; 32BIT-NEXT: addi 1, 1, 64 129; 32BIT-NEXT: lwz 0, 8(1) 130; 32BIT-NEXT: mtlr 0 131; 32BIT-NEXT: blr 132; 133; 64BIT-LABEL: i32_join: 134; 64BIT: # %bb.0: # %entry 135; 64BIT-NEXT: mflr 0 136; 64BIT-NEXT: stdu 1, -112(1) 137; 64BIT-NEXT: std 0, 128(1) 138; 64BIT-NEXT: std 10, 216(1) 139; 64BIT-NEXT: std 9, 208(1) 140; 64BIT-NEXT: std 8, 200(1) 141; 64BIT-NEXT: std 7, 192(1) 142; 64BIT-NEXT: std 6, 184(1) 143; 64BIT-NEXT: std 5, 176(1) 144; 64BIT-NEXT: std 4, 168(1) 145; 64BIT-NEXT: std 3, 160(1) 146; 64BIT-NEXT: bl .foo[PR] 147; 64BIT-NEXT: nop 148; 64BIT-NEXT: addi 1, 1, 112 149; 64BIT-NEXT: ld 0, 16(1) 150; 64BIT-NEXT: mtlr 0 151; 64BIT-NEXT: blr 152entry: 153 %add = add nsw i32 %b, %a 154 %add1 = add nsw i32 %add, %c 155 %add2 = add nsw i32 %add1, %d 156 %add3 = add nsw i32 %add2, %e 157 %add4 = add nsw i32 %add3, %f 158 %add5 = add nsw i32 %add4, %g 159 %add6 = add nsw i32 %add5, %h 160 %add7 = add nsw i32 %add6, %i 161 %add8 = add nsw i32 %add7, %j 162 tail call void @foo() 163 ret void 164} 165 166define void @i32_join_missing(i32 signext %a, i32 signext %b, i32 signext %c, i32 signext %d, i32 signext %e, i32 signext %f, i32 signext %g, i32 signext %h, i32 signext %i, i32 signext %j) #0 { 167; 32BIT-LABEL: i32_join_missing: 168; 32BIT: # %bb.0: # %entry 169; 32BIT-NEXT: mflr 0 170; 32BIT-NEXT: stwu 1, -64(1) 171; 32BIT-NEXT: stw 0, 72(1) 172; 32BIT-NEXT: stw 10, 116(1) 173; 32BIT-NEXT: stw 9, 112(1) 174; 32BIT-NEXT: stw 8, 108(1) 175; 32BIT-NEXT: stw 7, 104(1) 176; 32BIT-NEXT: stw 6, 100(1) 177; 32BIT-NEXT: stw 5, 96(1) 178; 32BIT-NEXT: stw 4, 92(1) 179; 32BIT-NEXT: stw 3, 88(1) 180; 32BIT-NEXT: bl .foo[PR] 181; 32BIT-NEXT: nop 182; 32BIT-NEXT: addi 1, 1, 64 183; 32BIT-NEXT: lwz 0, 8(1) 184; 32BIT-NEXT: mtlr 0 185; 32BIT-NEXT: blr 186; 187; 64BIT-LABEL: i32_join_missing: 188; 64BIT: # %bb.0: # %entry 189; 64BIT-NEXT: mflr 0 190; 64BIT-NEXT: stdu 1, -112(1) 191; 64BIT-NEXT: std 0, 128(1) 192; 64BIT-NEXT: std 10, 216(1) 193; 64BIT-NEXT: std 9, 208(1) 194; 64BIT-NEXT: std 8, 200(1) 195; 64BIT-NEXT: std 7, 192(1) 196; 64BIT-NEXT: std 6, 184(1) 197; 64BIT-NEXT: std 5, 176(1) 198; 64BIT-NEXT: std 4, 168(1) 199; 64BIT-NEXT: std 3, 160(1) 200; 64BIT-NEXT: bl .foo[PR] 201; 64BIT-NEXT: nop 202; 64BIT-NEXT: addi 1, 1, 112 203; 64BIT-NEXT: ld 0, 16(1) 204; 64BIT-NEXT: mtlr 0 205; 64BIT-NEXT: blr 206entry: 207 %add1 = mul nsw i32 %a, 3 208 %add2 = add nsw i32 %add1, %d 209 %add3 = add nsw i32 %add2, %e 210 %add4 = add nsw i32 %add3, %f 211 %add5 = add nsw i32 %add4, %g 212 %add6 = add nsw i32 %add5, %h 213 %add7 = add nsw i32 %add6, %i 214 %add8 = add nsw i32 %add7, %j 215 tail call void @foo() 216 ret void 217} 218 219define void @f32_join(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 { 220; 32BIT-LABEL: f32_join: 221; 32BIT: # %bb.0: # %entry 222; 32BIT-NEXT: mflr 0 223; 32BIT-NEXT: stwu 1, -64(1) 224; 32BIT-NEXT: stw 0, 72(1) 225; 32BIT-NEXT: stfs 10, 124(1) 226; 32BIT-NEXT: stfs 9, 120(1) 227; 32BIT-NEXT: stfs 8, 116(1) 228; 32BIT-NEXT: stfs 7, 112(1) 229; 32BIT-NEXT: stfs 6, 108(1) 230; 32BIT-NEXT: stfs 5, 104(1) 231; 32BIT-NEXT: stfs 4, 100(1) 232; 32BIT-NEXT: stfs 3, 96(1) 233; 32BIT-NEXT: stfs 2, 92(1) 234; 32BIT-NEXT: stfs 1, 88(1) 235; 32BIT-NEXT: bl .foo[PR] 236; 32BIT-NEXT: nop 237; 32BIT-NEXT: addi 1, 1, 64 238; 32BIT-NEXT: lwz 0, 8(1) 239; 32BIT-NEXT: mtlr 0 240; 32BIT-NEXT: blr 241; 242; 64BIT-LABEL: f32_join: 243; 64BIT: # %bb.0: # %entry 244; 64BIT-NEXT: mflr 0 245; 64BIT-NEXT: stdu 1, -112(1) 246; 64BIT-NEXT: std 0, 128(1) 247; 64BIT-NEXT: stfs 10, 232(1) 248; 64BIT-NEXT: stfs 9, 224(1) 249; 64BIT-NEXT: stfs 8, 216(1) 250; 64BIT-NEXT: stfs 7, 208(1) 251; 64BIT-NEXT: stfs 6, 200(1) 252; 64BIT-NEXT: stfs 5, 192(1) 253; 64BIT-NEXT: stfs 4, 184(1) 254; 64BIT-NEXT: stfs 3, 176(1) 255; 64BIT-NEXT: stfs 2, 168(1) 256; 64BIT-NEXT: stfs 1, 160(1) 257; 64BIT-NEXT: bl .foo[PR] 258; 64BIT-NEXT: nop 259; 64BIT-NEXT: addi 1, 1, 112 260; 64BIT-NEXT: ld 0, 16(1) 261; 64BIT-NEXT: mtlr 0 262; 64BIT-NEXT: blr 263entry: 264 %add = fadd float %a, %b 265 %add1 = fadd float %add, %c 266 %add2 = fadd float %add1, %d 267 %add3 = fadd float %add2, %e 268 %add4 = fadd float %add3, %f 269 %add5 = fadd float %add4, %g 270 %add6 = fadd float %add5, %h 271 %add7 = fadd float %add6, %i 272 %add8 = fadd float %add7, %j 273 tail call void @foo() 274 ret void 275} 276 277define void @f32_join_missing(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 { 278; 32BIT-LABEL: f32_join_missing: 279; 32BIT: # %bb.0: # %entry 280; 32BIT-NEXT: mflr 0 281; 32BIT-NEXT: stwu 1, -64(1) 282; 32BIT-NEXT: stw 0, 72(1) 283; 32BIT-NEXT: stfs 10, 124(1) 284; 32BIT-NEXT: stfs 9, 120(1) 285; 32BIT-NEXT: stfs 8, 116(1) 286; 32BIT-NEXT: stfs 7, 112(1) 287; 32BIT-NEXT: stfs 6, 108(1) 288; 32BIT-NEXT: stfs 5, 104(1) 289; 32BIT-NEXT: stfs 4, 100(1) 290; 32BIT-NEXT: stfs 3, 96(1) 291; 32BIT-NEXT: stfs 2, 92(1) 292; 32BIT-NEXT: stfs 1, 88(1) 293; 32BIT-NEXT: bl .foo[PR] 294; 32BIT-NEXT: nop 295; 32BIT-NEXT: addi 1, 1, 64 296; 32BIT-NEXT: lwz 0, 8(1) 297; 32BIT-NEXT: mtlr 0 298; 32BIT-NEXT: blr 299; 300; 64BIT-LABEL: f32_join_missing: 301; 64BIT: # %bb.0: # %entry 302; 64BIT-NEXT: mflr 0 303; 64BIT-NEXT: stdu 1, -112(1) 304; 64BIT-NEXT: std 0, 128(1) 305; 64BIT-NEXT: stfs 10, 232(1) 306; 64BIT-NEXT: stfs 9, 224(1) 307; 64BIT-NEXT: stfs 8, 216(1) 308; 64BIT-NEXT: stfs 7, 208(1) 309; 64BIT-NEXT: stfs 6, 200(1) 310; 64BIT-NEXT: stfs 5, 192(1) 311; 64BIT-NEXT: stfs 4, 184(1) 312; 64BIT-NEXT: stfs 3, 176(1) 313; 64BIT-NEXT: stfs 2, 168(1) 314; 64BIT-NEXT: stfs 1, 160(1) 315; 64BIT-NEXT: bl .foo[PR] 316; 64BIT-NEXT: nop 317; 64BIT-NEXT: addi 1, 1, 112 318; 64BIT-NEXT: ld 0, 16(1) 319; 64BIT-NEXT: mtlr 0 320; 64BIT-NEXT: blr 321entry: 322 %add = fadd float %a, %a 323 %add1 = fadd float %add, %a 324 %add2 = fadd float %add1, %d 325 %add3 = fadd float %add2, %e 326 %add4 = fadd float %add3, %f 327 %add5 = fadd float %add4, %g 328 %add6 = fadd float %add5, %h 329 %add7 = fadd float %add6, %i 330 %add8 = fadd float %add7, %j 331 tail call void @foo() 332 ret void 333} 334 335define void @f64_join(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 { 336; 32BIT-LABEL: f64_join: 337; 32BIT: # %bb.0: # %entry 338; 32BIT-NEXT: mflr 0 339; 32BIT-NEXT: stwu 1, -64(1) 340; 32BIT-NEXT: stw 0, 72(1) 341; 32BIT-NEXT: stfd 10, 160(1) 342; 32BIT-NEXT: stfd 9, 152(1) 343; 32BIT-NEXT: stfd 8, 144(1) 344; 32BIT-NEXT: stfd 7, 136(1) 345; 32BIT-NEXT: stfd 6, 128(1) 346; 32BIT-NEXT: stfd 5, 120(1) 347; 32BIT-NEXT: stfd 4, 112(1) 348; 32BIT-NEXT: stfd 3, 104(1) 349; 32BIT-NEXT: stfd 2, 96(1) 350; 32BIT-NEXT: stfd 1, 88(1) 351; 32BIT-NEXT: bl .foo[PR] 352; 32BIT-NEXT: nop 353; 32BIT-NEXT: addi 1, 1, 64 354; 32BIT-NEXT: lwz 0, 8(1) 355; 32BIT-NEXT: mtlr 0 356; 32BIT-NEXT: blr 357; 358; 64BIT-LABEL: f64_join: 359; 64BIT: # %bb.0: # %entry 360; 64BIT-NEXT: mflr 0 361; 64BIT-NEXT: stdu 1, -112(1) 362; 64BIT-NEXT: std 0, 128(1) 363; 64BIT-NEXT: stfd 10, 232(1) 364; 64BIT-NEXT: stfd 9, 224(1) 365; 64BIT-NEXT: stfd 8, 216(1) 366; 64BIT-NEXT: stfd 7, 208(1) 367; 64BIT-NEXT: stfd 6, 200(1) 368; 64BIT-NEXT: stfd 5, 192(1) 369; 64BIT-NEXT: stfd 4, 184(1) 370; 64BIT-NEXT: stfd 3, 176(1) 371; 64BIT-NEXT: stfd 2, 168(1) 372; 64BIT-NEXT: stfd 1, 160(1) 373; 64BIT-NEXT: bl .foo[PR] 374; 64BIT-NEXT: nop 375; 64BIT-NEXT: addi 1, 1, 112 376; 64BIT-NEXT: ld 0, 16(1) 377; 64BIT-NEXT: mtlr 0 378; 64BIT-NEXT: blr 379entry: 380 %add = fadd double %a, %b 381 %add1 = fadd double %add, %c 382 %add2 = fadd double %add1, %d 383 %add3 = fadd double %add2, %e 384 %add4 = fadd double %add3, %f 385 %add5 = fadd double %add4, %g 386 %add6 = fadd double %add5, %h 387 %add7 = fadd double %add6, %i 388 %add8 = fadd double %add7, %j 389 tail call void @foo() 390 ret void 391} 392 393define void @f64_missing(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 { 394; 32BIT-LABEL: f64_missing: 395; 32BIT: # %bb.0: # %entry 396; 32BIT-NEXT: mflr 0 397; 32BIT-NEXT: stwu 1, -64(1) 398; 32BIT-NEXT: stw 0, 72(1) 399; 32BIT-NEXT: stfd 10, 160(1) 400; 32BIT-NEXT: stfd 9, 152(1) 401; 32BIT-NEXT: stfd 8, 144(1) 402; 32BIT-NEXT: stfd 7, 136(1) 403; 32BIT-NEXT: stfd 6, 128(1) 404; 32BIT-NEXT: stfd 5, 120(1) 405; 32BIT-NEXT: stfd 4, 112(1) 406; 32BIT-NEXT: stfd 3, 104(1) 407; 32BIT-NEXT: stfd 2, 96(1) 408; 32BIT-NEXT: stfd 1, 88(1) 409; 32BIT-NEXT: bl .foo[PR] 410; 32BIT-NEXT: nop 411; 32BIT-NEXT: addi 1, 1, 64 412; 32BIT-NEXT: lwz 0, 8(1) 413; 32BIT-NEXT: mtlr 0 414; 32BIT-NEXT: blr 415; 416; 64BIT-LABEL: f64_missing: 417; 64BIT: # %bb.0: # %entry 418; 64BIT-NEXT: mflr 0 419; 64BIT-NEXT: stdu 1, -112(1) 420; 64BIT-NEXT: std 0, 128(1) 421; 64BIT-NEXT: stfd 10, 232(1) 422; 64BIT-NEXT: stfd 9, 224(1) 423; 64BIT-NEXT: stfd 8, 216(1) 424; 64BIT-NEXT: stfd 7, 208(1) 425; 64BIT-NEXT: stfd 6, 200(1) 426; 64BIT-NEXT: stfd 5, 192(1) 427; 64BIT-NEXT: stfd 4, 184(1) 428; 64BIT-NEXT: stfd 3, 176(1) 429; 64BIT-NEXT: stfd 2, 168(1) 430; 64BIT-NEXT: stfd 1, 160(1) 431; 64BIT-NEXT: bl .foo[PR] 432; 64BIT-NEXT: nop 433; 64BIT-NEXT: addi 1, 1, 112 434; 64BIT-NEXT: ld 0, 16(1) 435; 64BIT-NEXT: mtlr 0 436; 64BIT-NEXT: blr 437entry: 438 %add = fadd double %a, %a 439 %add1 = fadd double %add, %a 440 %add2 = fadd double %add1, %d 441 %add3 = fadd double %add2, %e 442 %add4 = fadd double %add3, %f 443 %add5 = fadd double %add4, %g 444 %add6 = fadd double %add5, %h 445 %add7 = fadd double %add6, %i 446 %add8 = fadd double %add7, %j 447 tail call void @foo() 448 ret void 449} 450 451define void @mixed_1(double %a, i64 %b, i64 %c, i32 signext %d, i64 %e, float %f, float %g, double %h, i32 signext %i, double %j) #0 { 452; 32BIT-LABEL: mixed_1: 453; 32BIT: # %bb.0: # %entry 454; 32BIT-NEXT: mflr 0 455; 32BIT-NEXT: stwu 1, -112(1) 456; 32BIT-NEXT: stw 0, 120(1) 457; 32BIT-NEXT: stfd 1, 136(1) 458; 32BIT-NEXT: xsadddp 1, 1, 5 459; 32BIT-NEXT: stw 24, 64(1) # 4-byte Folded Spill 460; 32BIT-NEXT: lwz 24, 168(1) 461; 32BIT-NEXT: stw 25, 68(1) # 4-byte Folded Spill 462; 32BIT-NEXT: lwz 25, 188(1) 463; 32BIT-NEXT: stw 26, 72(1) # 4-byte Folded Spill 464; 32BIT-NEXT: stw 27, 76(1) # 4-byte Folded Spill 465; 32BIT-NEXT: stw 28, 80(1) # 4-byte Folded Spill 466; 32BIT-NEXT: stw 29, 84(1) # 4-byte Folded Spill 467; 32BIT-NEXT: stw 30, 88(1) # 4-byte Folded Spill 468; 32BIT-NEXT: stw 31, 92(1) # 4-byte Folded Spill 469; 32BIT-NEXT: stfd 30, 96(1) # 8-byte Folded Spill 470; 32BIT-NEXT: stfd 31, 104(1) # 8-byte Folded Spill 471; 32BIT-NEXT: fmr 31, 3 472; 32BIT-NEXT: fmr 30, 2 473; 32BIT-NEXT: mr 31, 10 474; 32BIT-NEXT: mr 30, 9 475; 32BIT-NEXT: mr 29, 8 476; 32BIT-NEXT: mr 28, 7 477; 32BIT-NEXT: mr 27, 6 478; 32BIT-NEXT: mr 26, 5 479; 32BIT-NEXT: stfd 5, 192(1) 480; 32BIT-NEXT: stfd 4, 180(1) 481; 32BIT-NEXT: stfs 3, 176(1) 482; 32BIT-NEXT: stfs 2, 172(1) 483; 32BIT-NEXT: stw 10, 164(1) 484; 32BIT-NEXT: stw 9, 160(1) 485; 32BIT-NEXT: stw 8, 156(1) 486; 32BIT-NEXT: stw 7, 152(1) 487; 32BIT-NEXT: stw 6, 148(1) 488; 32BIT-NEXT: stw 5, 144(1) 489; 32BIT-NEXT: bl .consume_f64[PR] 490; 32BIT-NEXT: nop 491; 32BIT-NEXT: fadds 1, 30, 31 492; 32BIT-NEXT: bl .consume_f32[PR] 493; 32BIT-NEXT: nop 494; 32BIT-NEXT: addc 3, 29, 27 495; 32BIT-NEXT: adde 4, 28, 26 496; 32BIT-NEXT: srawi 5, 30, 31 497; 32BIT-NEXT: addc 3, 3, 30 498; 32BIT-NEXT: adde 5, 4, 5 499; 32BIT-NEXT: addc 4, 3, 24 500; 32BIT-NEXT: adde 3, 5, 31 501; 32BIT-NEXT: bl .consume_i64[PR] 502; 32BIT-NEXT: nop 503; 32BIT-NEXT: add 3, 25, 30 504; 32BIT-NEXT: bl .consume_i32[PR] 505; 32BIT-NEXT: nop 506; 32BIT-NEXT: lfd 31, 104(1) # 8-byte Folded Reload 507; 32BIT-NEXT: lfd 30, 96(1) # 8-byte Folded Reload 508; 32BIT-NEXT: lwz 31, 92(1) # 4-byte Folded Reload 509; 32BIT-NEXT: lwz 30, 88(1) # 4-byte Folded Reload 510; 32BIT-NEXT: lwz 29, 84(1) # 4-byte Folded Reload 511; 32BIT-NEXT: lwz 28, 80(1) # 4-byte Folded Reload 512; 32BIT-NEXT: lwz 27, 76(1) # 4-byte Folded Reload 513; 32BIT-NEXT: lwz 26, 72(1) # 4-byte Folded Reload 514; 32BIT-NEXT: lwz 25, 68(1) # 4-byte Folded Reload 515; 32BIT-NEXT: lwz 24, 64(1) # 4-byte Folded Reload 516; 32BIT-NEXT: addi 1, 1, 112 517; 32BIT-NEXT: lwz 0, 8(1) 518; 32BIT-NEXT: mtlr 0 519; 32BIT-NEXT: blr 520; 521; 64BIT-LABEL: mixed_1: 522; 64BIT: # %bb.0: # %entry 523; 64BIT-NEXT: mflr 0 524; 64BIT-NEXT: stdu 1, -176(1) 525; 64BIT-NEXT: std 0, 192(1) 526; 64BIT-NEXT: stfd 1, 224(1) 527; 64BIT-NEXT: xsadddp 1, 1, 5 528; 64BIT-NEXT: std 27, 120(1) # 8-byte Folded Spill 529; 64BIT-NEXT: lwz 27, 292(1) 530; 64BIT-NEXT: std 28, 128(1) # 8-byte Folded Spill 531; 64BIT-NEXT: std 29, 136(1) # 8-byte Folded Spill 532; 64BIT-NEXT: std 30, 144(1) # 8-byte Folded Spill 533; 64BIT-NEXT: std 31, 152(1) # 8-byte Folded Spill 534; 64BIT-NEXT: stfd 30, 160(1) # 8-byte Folded Spill 535; 64BIT-NEXT: stfd 31, 168(1) # 8-byte Folded Spill 536; 64BIT-NEXT: fmr 31, 3 537; 64BIT-NEXT: fmr 30, 2 538; 64BIT-NEXT: mr 31, 7 539; 64BIT-NEXT: mr 30, 6 540; 64BIT-NEXT: mr 29, 5 541; 64BIT-NEXT: mr 28, 4 542; 64BIT-NEXT: stfd 5, 296(1) 543; 64BIT-NEXT: stfd 4, 280(1) 544; 64BIT-NEXT: stfs 3, 272(1) 545; 64BIT-NEXT: stfs 2, 264(1) 546; 64BIT-NEXT: std 7, 256(1) 547; 64BIT-NEXT: std 6, 248(1) 548; 64BIT-NEXT: std 5, 240(1) 549; 64BIT-NEXT: std 4, 232(1) 550; 64BIT-NEXT: bl .consume_f64[PR] 551; 64BIT-NEXT: nop 552; 64BIT-NEXT: fadds 1, 30, 31 553; 64BIT-NEXT: bl .consume_f32[PR] 554; 64BIT-NEXT: nop 555; 64BIT-NEXT: add 3, 29, 28 556; 64BIT-NEXT: add 3, 3, 30 557; 64BIT-NEXT: add 3, 3, 31 558; 64BIT-NEXT: bl .consume_i64[PR] 559; 64BIT-NEXT: nop 560; 64BIT-NEXT: add 3, 27, 30 561; 64BIT-NEXT: extsw 3, 3 562; 64BIT-NEXT: bl .consume_i32[PR] 563; 64BIT-NEXT: nop 564; 64BIT-NEXT: lfd 31, 168(1) # 8-byte Folded Reload 565; 64BIT-NEXT: lfd 30, 160(1) # 8-byte Folded Reload 566; 64BIT-NEXT: ld 31, 152(1) # 8-byte Folded Reload 567; 64BIT-NEXT: ld 30, 144(1) # 8-byte Folded Reload 568; 64BIT-NEXT: ld 29, 136(1) # 8-byte Folded Reload 569; 64BIT-NEXT: ld 28, 128(1) # 8-byte Folded Reload 570; 64BIT-NEXT: ld 27, 120(1) # 8-byte Folded Reload 571; 64BIT-NEXT: addi 1, 1, 176 572; 64BIT-NEXT: ld 0, 16(1) 573; 64BIT-NEXT: mtlr 0 574; 64BIT-NEXT: blr 575entry: 576 %add = fadd double %a, %j 577 tail call void @consume_f64(double %add) 578 %add1 = fadd float %f, %g 579 tail call void @consume_f32(float %add1) 580 %add2 = add nsw i64 %c, %b 581 %conv = sext i32 %d to i64 582 %add3 = add nsw i64 %add2, %conv 583 %add4 = add nsw i64 %add3, %e 584 tail call void @consume_i64(i64 %add4) 585 %add5 = add nsw i32 %i, %d 586 tail call void @consume_i32(i32 signext %add5) 587 ret void 588} 589 590define void @mixed_2(<2 x double> %a, <4 x i32> %b, i64 %c) #0 { 591; 32BIT-LABEL: mixed_2: 592; 32BIT: # %bb.0: # %entry 593; 32BIT-NEXT: mflr 0 594; 32BIT-NEXT: stwu 1, -80(1) 595; 32BIT-NEXT: li 5, 64 596; 32BIT-NEXT: stw 0, 88(1) 597; 32BIT-NEXT: stw 4, 140(1) 598; 32BIT-NEXT: stw 3, 136(1) 599; 32BIT-NEXT: stxvd2x 34, 1, 5 # 16-byte Folded Spill 600; 32BIT-NEXT: addi 5, 1, 120 601; 32BIT-NEXT: stxvw4x 35, 0, 5 602; 32BIT-NEXT: addi 5, 1, 104 603; 32BIT-NEXT: stxvd2x 34, 0, 5 604; 32BIT-NEXT: lwz 5, 120(1) 605; 32BIT-NEXT: srawi 6, 5, 31 606; 32BIT-NEXT: addc 4, 5, 4 607; 32BIT-NEXT: adde 3, 6, 3 608; 32BIT-NEXT: bl .consume_i64[PR] 609; 32BIT-NEXT: nop 610; 32BIT-NEXT: li 3, 64 611; 32BIT-NEXT: lxvd2x 1, 1, 3 # 16-byte Folded Reload 612; 32BIT-NEXT: bl .consume_f64[PR] 613; 32BIT-NEXT: nop 614; 32BIT-NEXT: addi 1, 1, 80 615; 32BIT-NEXT: lwz 0, 8(1) 616; 32BIT-NEXT: mtlr 0 617; 32BIT-NEXT: blr 618; 619; 64BIT-LABEL: mixed_2: 620; 64BIT: # %bb.0: # %entry 621; 64BIT-NEXT: mflr 0 622; 64BIT-NEXT: stdu 1, -144(1) 623; 64BIT-NEXT: li 4, 128 624; 64BIT-NEXT: std 0, 160(1) 625; 64BIT-NEXT: std 3, 224(1) 626; 64BIT-NEXT: stxvd2x 34, 1, 4 # 16-byte Folded Spill 627; 64BIT-NEXT: addi 4, 1, 208 628; 64BIT-NEXT: stxvw4x 35, 0, 4 629; 64BIT-NEXT: addi 4, 1, 192 630; 64BIT-NEXT: stxvd2x 34, 0, 4 631; 64BIT-NEXT: lwa 4, 208(1) 632; 64BIT-NEXT: add 3, 4, 3 633; 64BIT-NEXT: bl .consume_i64[PR] 634; 64BIT-NEXT: nop 635; 64BIT-NEXT: li 3, 128 636; 64BIT-NEXT: lxvd2x 1, 1, 3 # 16-byte Folded Reload 637; 64BIT-NEXT: bl .consume_f64[PR] 638; 64BIT-NEXT: nop 639; 64BIT-NEXT: addi 1, 1, 144 640; 64BIT-NEXT: ld 0, 16(1) 641; 64BIT-NEXT: mtlr 0 642; 64BIT-NEXT: blr 643entry: 644 %vecext = extractelement <4 x i32> %b, i64 0 645 %conv = sext i32 %vecext to i64 646 %add = add nsw i64 %conv, %c 647 tail call void @consume_i64(i64 %add) 648 %vecext1 = extractelement <2 x double> %a, i64 0 649 tail call void @consume_f64(double %vecext1) 650 ret void 651} 652 653%struct.foo = type <{ [3 x i32], double, [12 x i8], <4 x i32> }> 654 655define void @mixed_3(<2 x double> %a, i64 %b, double %c, float %d, i32 signext %e, double %f, ...) #0 { 656; 32BIT-LABEL: mixed_3: 657; 32BIT: # %bb.0: # %entry 658; 32BIT-NEXT: mflr 0 659; 32BIT-NEXT: stwu 1, -80(1) 660; 32BIT-NEXT: xsadddp 0, 34, 3 661; 32BIT-NEXT: stw 0, 88(1) 662; 32BIT-NEXT: stfd 1, 128(1) 663; 32BIT-NEXT: stw 29, 60(1) # 4-byte Folded Spill 664; 32BIT-NEXT: addi 3, 1, 104 665; 32BIT-NEXT: lwz 29, 148(1) 666; 32BIT-NEXT: stw 30, 64(1) # 4-byte Folded Spill 667; 32BIT-NEXT: stw 31, 68(1) # 4-byte Folded Spill 668; 32BIT-NEXT: stfd 31, 72(1) # 8-byte Folded Spill 669; 32BIT-NEXT: fmr 31, 2 670; 32BIT-NEXT: mr 31, 10 671; 32BIT-NEXT: mr 30, 9 672; 32BIT-NEXT: xsadddp 1, 0, 1 673; 32BIT-NEXT: stxvd2x 34, 0, 3 674; 32BIT-NEXT: stfd 3, 144(1) 675; 32BIT-NEXT: stfs 2, 136(1) 676; 32BIT-NEXT: stw 10, 124(1) 677; 32BIT-NEXT: stw 9, 120(1) 678; 32BIT-NEXT: bl .consume_f64[PR] 679; 32BIT-NEXT: nop 680; 32BIT-NEXT: mr 3, 30 681; 32BIT-NEXT: mr 4, 31 682; 32BIT-NEXT: bl .consume_i64[PR] 683; 32BIT-NEXT: nop 684; 32BIT-NEXT: fmr 1, 31 685; 32BIT-NEXT: bl .consume_f32[PR] 686; 32BIT-NEXT: nop 687; 32BIT-NEXT: mr 3, 29 688; 32BIT-NEXT: bl .consume_i32[PR] 689; 32BIT-NEXT: nop 690; 32BIT-NEXT: lfd 31, 72(1) # 8-byte Folded Reload 691; 32BIT-NEXT: lwz 31, 68(1) # 4-byte Folded Reload 692; 32BIT-NEXT: lwz 30, 64(1) # 4-byte Folded Reload 693; 32BIT-NEXT: lwz 29, 60(1) # 4-byte Folded Reload 694; 32BIT-NEXT: addi 1, 1, 80 695; 32BIT-NEXT: lwz 0, 8(1) 696; 32BIT-NEXT: mtlr 0 697; 32BIT-NEXT: blr 698; 32BIT: NumOfGPRsSaved = 3 699; 700; 64BIT-LABEL: mixed_3: 701; 64BIT: # %bb.0: # %entry 702; 64BIT-NEXT: mflr 0 703; 64BIT-NEXT: stdu 1, -144(1) 704; 64BIT-NEXT: xsadddp 0, 34, 3 705; 64BIT-NEXT: std 0, 160(1) 706; 64BIT-NEXT: stfd 1, 216(1) 707; 64BIT-NEXT: addi 3, 1, 192 708; 64BIT-NEXT: std 30, 120(1) # 8-byte Folded Spill 709; 64BIT-NEXT: std 31, 128(1) # 8-byte Folded Spill 710; 64BIT-NEXT: stfd 31, 136(1) # 8-byte Folded Spill 711; 64BIT-NEXT: mr 31, 8 712; 64BIT-NEXT: fmr 31, 2 713; 64BIT-NEXT: mr 30, 5 714; 64BIT-NEXT: stxvd2x 34, 0, 3 715; 64BIT-NEXT: xsadddp 1, 0, 1 716; 64BIT-NEXT: std 10, 248(1) 717; 64BIT-NEXT: stfd 3, 240(1) 718; 64BIT-NEXT: std 8, 232(1) 719; 64BIT-NEXT: stfs 2, 224(1) 720; 64BIT-NEXT: std 5, 208(1) 721; 64BIT-NEXT: bl .consume_f64[PR] 722; 64BIT-NEXT: nop 723; 64BIT-NEXT: mr 3, 30 724; 64BIT-NEXT: bl .consume_i64[PR] 725; 64BIT-NEXT: nop 726; 64BIT-NEXT: fmr 1, 31 727; 64BIT-NEXT: bl .consume_f32[PR] 728; 64BIT-NEXT: nop 729; 64BIT-NEXT: mr 3, 31 730; 64BIT-NEXT: bl .consume_i32[PR] 731; 64BIT-NEXT: nop 732; 64BIT-NEXT: lfd 31, 136(1) # 8-byte Folded Reload 733; 64BIT-NEXT: ld 31, 128(1) # 8-byte Folded Reload 734; 64BIT-NEXT: ld 30, 120(1) # 8-byte Folded Reload 735; 64BIT-NEXT: addi 1, 1, 144 736; 64BIT-NEXT: ld 0, 16(1) 737; 64BIT-NEXT: mtlr 0 738; 64BIT-NEXT: blr 739; 64BIT: NumOfGPRsSaved = 2 740entry: 741 %vecext = extractelement <2 x double> %a, i64 0 742 %add = fadd double %vecext, %f 743 %add1 = fadd double %add, %c 744 tail call void @consume_f64(double %add1) 745 tail call void @consume_i64(i64 %b) 746 tail call void @consume_f32(float %d) 747 tail call void @consume_i32(i32 signext %e) 748 ret void 749} 750 751define signext i32 @mixed_4(ptr byval(%struct.foo) align 16 %foo, i32 %sec) #0 { 752; 32BIT-LABEL: mixed_4: 753; 32BIT: # %bb.0: # %entry 754; 32BIT-NEXT: stw 9, 48(1) 755; 32BIT-NEXT: stw 8, 44(1) 756; 32BIT-NEXT: lfd 0, 44(1) 757; 32BIT-NEXT: addi 3, 1, -4 758; 32BIT-NEXT: xscvdpsxws 0, 0 759; 32BIT-NEXT: stw 5, 32(1) 760; 32BIT-NEXT: stw 6, 36(1) 761; 32BIT-NEXT: stw 7, 40(1) 762; 32BIT-NEXT: stw 10, 52(1) 763; 32BIT-NEXT: stfiwx 0, 0, 3 764; 32BIT-NEXT: lwz 3, -4(1) 765; 32BIT-NEXT: lwz 4, 76(1) 766; 32BIT-NEXT: add 3, 5, 3 767; 32BIT-NEXT: add 3, 3, 4 768; 32BIT-NEXT: blr 769; 770; 64BIT-LABEL: mixed_4: 771; 64BIT: # %bb.0: # %entry 772; 64BIT-NEXT: std 5, 64(1) 773; 64BIT-NEXT: std 4, 56(1) 774; 64BIT-NEXT: lfd 0, 60(1) 775; 64BIT-NEXT: addi 4, 1, -4 776; 64BIT-NEXT: xscvdpsxws 0, 0 777; 64BIT-NEXT: std 3, 48(1) 778; 64BIT-NEXT: std 6, 72(1) 779; 64BIT-NEXT: std 7, 80(1) 780; 64BIT-NEXT: std 8, 88(1) 781; 64BIT-NEXT: std 9, 96(1) 782; 64BIT-NEXT: rldicl 3, 3, 32, 32 783; 64BIT-NEXT: stfiwx 0, 0, 4 784; 64BIT-NEXT: lwz 4, -4(1) 785; 64BIT-NEXT: add 3, 3, 4 786; 64BIT-NEXT: add 3, 3, 8 787; 64BIT-NEXT: extsw 3, 3 788; 64BIT-NEXT: blr 789entry: 790 %0 = load i32, ptr %foo, align 16 791 %x = getelementptr inbounds i8, ptr %foo, i64 12 792 %1 = load double, ptr %x, align 4 793 %conv = fptosi double %1 to i32 794 %add = add nsw i32 %0, %conv 795 %2 = getelementptr inbounds i8, ptr %foo, i64 44 796 %vecext = load i32, ptr %2, align 4 797 %add1 = add nsw i32 %add, %vecext 798 ret i32 %add1 799} 800 801%struct.bar = type { i8, i32, <4 x i32>, ptr, i8 } 802 803define void @mixed_5(ptr byref(%struct.bar) align 16 %r, ptr byval(%struct.bar) align 16 %x, i32 signext %y, ptr byval(%struct.foo) align 16 %f) #0 { 804; 32BIT-LABEL: mixed_5: 805; 32BIT: # %bb.0: # %entry 806; 32BIT-NEXT: mflr 0 807; 32BIT-NEXT: stwu 1, -64(1) 808; 32BIT-NEXT: stw 0, 72(1) 809; 32BIT-NEXT: stw 5, 96(1) 810; 32BIT-NEXT: lfd 1, 172(1) 811; 32BIT-NEXT: stw 6, 100(1) 812; 32BIT-NEXT: stw 7, 104(1) 813; 32BIT-NEXT: stw 8, 108(1) 814; 32BIT-NEXT: stw 9, 112(1) 815; 32BIT-NEXT: stw 10, 116(1) 816; 32BIT-NEXT: stw 3, 88(1) 817; 32BIT-NEXT: bl .consume_f64[PR] 818; 32BIT-NEXT: nop 819; 32BIT-NEXT: lwz 3, 100(1) 820; 32BIT-NEXT: bl .consume_i32[PR] 821; 32BIT-NEXT: nop 822; 32BIT-NEXT: addi 1, 1, 64 823; 32BIT-NEXT: lwz 0, 8(1) 824; 32BIT-NEXT: mtlr 0 825; 32BIT-NEXT: blr 826; 827; 64BIT-LABEL: mixed_5: 828; 64BIT: # %bb.0: # %entry 829; 64BIT-NEXT: mflr 0 830; 64BIT-NEXT: stdu 1, -112(1) 831; 64BIT-NEXT: std 0, 128(1) 832; 64BIT-NEXT: std 5, 176(1) 833; 64BIT-NEXT: lfd 1, 252(1) 834; 64BIT-NEXT: std 6, 184(1) 835; 64BIT-NEXT: std 7, 192(1) 836; 64BIT-NEXT: std 8, 200(1) 837; 64BIT-NEXT: std 9, 208(1) 838; 64BIT-NEXT: std 10, 216(1) 839; 64BIT-NEXT: std 3, 160(1) 840; 64BIT-NEXT: bl .consume_f64[PR] 841; 64BIT-NEXT: nop 842; 64BIT-NEXT: lwa 3, 180(1) 843; 64BIT-NEXT: bl .consume_i32[PR] 844; 64BIT-NEXT: nop 845; 64BIT-NEXT: addi 1, 1, 112 846; 64BIT-NEXT: ld 0, 16(1) 847; 64BIT-NEXT: mtlr 0 848; 64BIT-NEXT: blr 849entry: 850 %d = getelementptr inbounds i8, ptr %f, i64 12 851 %0 = load double, ptr %d, align 4 852 tail call void @consume_f64(double %0) 853 %i = getelementptr inbounds i8, ptr %x, i64 4 854 %1 = load i32, ptr %i, align 4 855 tail call void @consume_i32(i32 signext %1) 856 ret void 857} 858 859declare void @foo() 860declare void @consume_f64(double) 861declare void @consume_f32(float) 862declare void @consume_i64(i64) 863declare void @consume_i32(i32 signext) 864 865attributes #0 = { nofree noinline nounwind "save-reg-params" } 866