; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 4 ; RUN: llc -verify-machineinstrs -mtriple=powerpc-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=32BIT ; RUN: llc -verify-machineinstrs -mtriple=powerpc64-ibm-aix -mcpu=pwr7 < %s | FileCheck %s -check-prefix=64BIT define void @i64_join(i64 %a, i64 %b, i64 %c, i64 %d, i64 %e, i64 %f, i64 %g, i64 %h, i64 %i, i64 %j) #0 { ; 32BIT-LABEL: i64_join: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stw 10, 116(1) ; 32BIT-NEXT: stw 9, 112(1) ; 32BIT-NEXT: stw 8, 108(1) ; 32BIT-NEXT: stw 7, 104(1) ; 32BIT-NEXT: stw 6, 100(1) ; 32BIT-NEXT: stw 5, 96(1) ; 32BIT-NEXT: stw 4, 92(1) ; 32BIT-NEXT: stw 3, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: i64_join: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: std 10, 216(1) ; 64BIT-NEXT: std 9, 208(1) ; 64BIT-NEXT: std 8, 200(1) ; 64BIT-NEXT: std 7, 192(1) ; 64BIT-NEXT: std 6, 184(1) ; 64BIT-NEXT: std 5, 176(1) ; 64BIT-NEXT: std 4, 168(1) ; 64BIT-NEXT: std 3, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = add nsw i64 %b, %a %add1 = add nsw i64 %add, %c %add2 = add nsw i64 %add1, %d %add3 = add nsw i64 %add2, %e %add4 = add nsw i64 %add3, %f %add5 = add nsw i64 %add4, %g %add6 = add nsw i64 %add5, %h %add7 = add nsw i64 %add6, %i %add8 = add nsw i64 %add7, %j tail call void @foo() ret void } define 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 { ; 32BIT-LABEL: i64_join_missing: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stw 10, 116(1) ; 32BIT-NEXT: stw 9, 112(1) ; 32BIT-NEXT: stw 8, 108(1) ; 32BIT-NEXT: stw 7, 104(1) ; 32BIT-NEXT: stw 6, 100(1) ; 32BIT-NEXT: stw 5, 96(1) ; 32BIT-NEXT: stw 4, 92(1) ; 32BIT-NEXT: stw 3, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: i64_join_missing: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: std 10, 216(1) ; 64BIT-NEXT: std 9, 208(1) ; 64BIT-NEXT: std 8, 200(1) ; 64BIT-NEXT: std 7, 192(1) ; 64BIT-NEXT: std 6, 184(1) ; 64BIT-NEXT: std 5, 176(1) ; 64BIT-NEXT: std 4, 168(1) ; 64BIT-NEXT: std 3, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add1 = mul nsw i64 %a, 3 %add2 = add nsw i64 %add1, %d %add3 = add nsw i64 %add2, %e %add4 = add nsw i64 %add3, %f %add5 = add nsw i64 %add4, %g %add6 = add nsw i64 %add5, %h %add7 = add nsw i64 %add6, %i %add8 = add nsw i64 %add7, %j tail call void @foo() ret void } define 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 { ; 32BIT-LABEL: i32_join: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stw 10, 116(1) ; 32BIT-NEXT: stw 9, 112(1) ; 32BIT-NEXT: stw 8, 108(1) ; 32BIT-NEXT: stw 7, 104(1) ; 32BIT-NEXT: stw 6, 100(1) ; 32BIT-NEXT: stw 5, 96(1) ; 32BIT-NEXT: stw 4, 92(1) ; 32BIT-NEXT: stw 3, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: i32_join: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: std 10, 216(1) ; 64BIT-NEXT: std 9, 208(1) ; 64BIT-NEXT: std 8, 200(1) ; 64BIT-NEXT: std 7, 192(1) ; 64BIT-NEXT: std 6, 184(1) ; 64BIT-NEXT: std 5, 176(1) ; 64BIT-NEXT: std 4, 168(1) ; 64BIT-NEXT: std 3, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = add nsw i32 %b, %a %add1 = add nsw i32 %add, %c %add2 = add nsw i32 %add1, %d %add3 = add nsw i32 %add2, %e %add4 = add nsw i32 %add3, %f %add5 = add nsw i32 %add4, %g %add6 = add nsw i32 %add5, %h %add7 = add nsw i32 %add6, %i %add8 = add nsw i32 %add7, %j tail call void @foo() ret void } define 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 { ; 32BIT-LABEL: i32_join_missing: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stw 10, 116(1) ; 32BIT-NEXT: stw 9, 112(1) ; 32BIT-NEXT: stw 8, 108(1) ; 32BIT-NEXT: stw 7, 104(1) ; 32BIT-NEXT: stw 6, 100(1) ; 32BIT-NEXT: stw 5, 96(1) ; 32BIT-NEXT: stw 4, 92(1) ; 32BIT-NEXT: stw 3, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: i32_join_missing: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: std 10, 216(1) ; 64BIT-NEXT: std 9, 208(1) ; 64BIT-NEXT: std 8, 200(1) ; 64BIT-NEXT: std 7, 192(1) ; 64BIT-NEXT: std 6, 184(1) ; 64BIT-NEXT: std 5, 176(1) ; 64BIT-NEXT: std 4, 168(1) ; 64BIT-NEXT: std 3, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add1 = mul nsw i32 %a, 3 %add2 = add nsw i32 %add1, %d %add3 = add nsw i32 %add2, %e %add4 = add nsw i32 %add3, %f %add5 = add nsw i32 %add4, %g %add6 = add nsw i32 %add5, %h %add7 = add nsw i32 %add6, %i %add8 = add nsw i32 %add7, %j tail call void @foo() ret void } define void @f32_join(float %a, float %b, float %c, float %d, float %e, float %f, float %g, float %h, float %i, float %j) #0 { ; 32BIT-LABEL: f32_join: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stfs 10, 124(1) ; 32BIT-NEXT: stfs 9, 120(1) ; 32BIT-NEXT: stfs 8, 116(1) ; 32BIT-NEXT: stfs 7, 112(1) ; 32BIT-NEXT: stfs 6, 108(1) ; 32BIT-NEXT: stfs 5, 104(1) ; 32BIT-NEXT: stfs 4, 100(1) ; 32BIT-NEXT: stfs 3, 96(1) ; 32BIT-NEXT: stfs 2, 92(1) ; 32BIT-NEXT: stfs 1, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: f32_join: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: stfs 10, 232(1) ; 64BIT-NEXT: stfs 9, 224(1) ; 64BIT-NEXT: stfs 8, 216(1) ; 64BIT-NEXT: stfs 7, 208(1) ; 64BIT-NEXT: stfs 6, 200(1) ; 64BIT-NEXT: stfs 5, 192(1) ; 64BIT-NEXT: stfs 4, 184(1) ; 64BIT-NEXT: stfs 3, 176(1) ; 64BIT-NEXT: stfs 2, 168(1) ; 64BIT-NEXT: stfs 1, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = fadd float %a, %b %add1 = fadd float %add, %c %add2 = fadd float %add1, %d %add3 = fadd float %add2, %e %add4 = fadd float %add3, %f %add5 = fadd float %add4, %g %add6 = fadd float %add5, %h %add7 = fadd float %add6, %i %add8 = fadd float %add7, %j tail call void @foo() ret void } define 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 { ; 32BIT-LABEL: f32_join_missing: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stfs 10, 124(1) ; 32BIT-NEXT: stfs 9, 120(1) ; 32BIT-NEXT: stfs 8, 116(1) ; 32BIT-NEXT: stfs 7, 112(1) ; 32BIT-NEXT: stfs 6, 108(1) ; 32BIT-NEXT: stfs 5, 104(1) ; 32BIT-NEXT: stfs 4, 100(1) ; 32BIT-NEXT: stfs 3, 96(1) ; 32BIT-NEXT: stfs 2, 92(1) ; 32BIT-NEXT: stfs 1, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: f32_join_missing: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: stfs 10, 232(1) ; 64BIT-NEXT: stfs 9, 224(1) ; 64BIT-NEXT: stfs 8, 216(1) ; 64BIT-NEXT: stfs 7, 208(1) ; 64BIT-NEXT: stfs 6, 200(1) ; 64BIT-NEXT: stfs 5, 192(1) ; 64BIT-NEXT: stfs 4, 184(1) ; 64BIT-NEXT: stfs 3, 176(1) ; 64BIT-NEXT: stfs 2, 168(1) ; 64BIT-NEXT: stfs 1, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = fadd float %a, %a %add1 = fadd float %add, %a %add2 = fadd float %add1, %d %add3 = fadd float %add2, %e %add4 = fadd float %add3, %f %add5 = fadd float %add4, %g %add6 = fadd float %add5, %h %add7 = fadd float %add6, %i %add8 = fadd float %add7, %j tail call void @foo() ret void } define void @f64_join(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 { ; 32BIT-LABEL: f64_join: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stfd 10, 160(1) ; 32BIT-NEXT: stfd 9, 152(1) ; 32BIT-NEXT: stfd 8, 144(1) ; 32BIT-NEXT: stfd 7, 136(1) ; 32BIT-NEXT: stfd 6, 128(1) ; 32BIT-NEXT: stfd 5, 120(1) ; 32BIT-NEXT: stfd 4, 112(1) ; 32BIT-NEXT: stfd 3, 104(1) ; 32BIT-NEXT: stfd 2, 96(1) ; 32BIT-NEXT: stfd 1, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: f64_join: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: stfd 10, 232(1) ; 64BIT-NEXT: stfd 9, 224(1) ; 64BIT-NEXT: stfd 8, 216(1) ; 64BIT-NEXT: stfd 7, 208(1) ; 64BIT-NEXT: stfd 6, 200(1) ; 64BIT-NEXT: stfd 5, 192(1) ; 64BIT-NEXT: stfd 4, 184(1) ; 64BIT-NEXT: stfd 3, 176(1) ; 64BIT-NEXT: stfd 2, 168(1) ; 64BIT-NEXT: stfd 1, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = fadd double %a, %b %add1 = fadd double %add, %c %add2 = fadd double %add1, %d %add3 = fadd double %add2, %e %add4 = fadd double %add3, %f %add5 = fadd double %add4, %g %add6 = fadd double %add5, %h %add7 = fadd double %add6, %i %add8 = fadd double %add7, %j tail call void @foo() ret void } define void @f64_missing(double %a, double %b, double %c, double %d, double %e, double %f, double %g, double %h, double %i, double %j) #0 { ; 32BIT-LABEL: f64_missing: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stfd 10, 160(1) ; 32BIT-NEXT: stfd 9, 152(1) ; 32BIT-NEXT: stfd 8, 144(1) ; 32BIT-NEXT: stfd 7, 136(1) ; 32BIT-NEXT: stfd 6, 128(1) ; 32BIT-NEXT: stfd 5, 120(1) ; 32BIT-NEXT: stfd 4, 112(1) ; 32BIT-NEXT: stfd 3, 104(1) ; 32BIT-NEXT: stfd 2, 96(1) ; 32BIT-NEXT: stfd 1, 88(1) ; 32BIT-NEXT: bl .foo[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: f64_missing: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: stfd 10, 232(1) ; 64BIT-NEXT: stfd 9, 224(1) ; 64BIT-NEXT: stfd 8, 216(1) ; 64BIT-NEXT: stfd 7, 208(1) ; 64BIT-NEXT: stfd 6, 200(1) ; 64BIT-NEXT: stfd 5, 192(1) ; 64BIT-NEXT: stfd 4, 184(1) ; 64BIT-NEXT: stfd 3, 176(1) ; 64BIT-NEXT: stfd 2, 168(1) ; 64BIT-NEXT: stfd 1, 160(1) ; 64BIT-NEXT: bl .foo[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = fadd double %a, %a %add1 = fadd double %add, %a %add2 = fadd double %add1, %d %add3 = fadd double %add2, %e %add4 = fadd double %add3, %f %add5 = fadd double %add4, %g %add6 = fadd double %add5, %h %add7 = fadd double %add6, %i %add8 = fadd double %add7, %j tail call void @foo() ret void } define 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 { ; 32BIT-LABEL: mixed_1: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -112(1) ; 32BIT-NEXT: stw 0, 120(1) ; 32BIT-NEXT: stfd 1, 136(1) ; 32BIT-NEXT: xsadddp 1, 1, 5 ; 32BIT-NEXT: stw 24, 64(1) # 4-byte Folded Spill ; 32BIT-NEXT: lwz 24, 168(1) ; 32BIT-NEXT: stw 25, 68(1) # 4-byte Folded Spill ; 32BIT-NEXT: lwz 25, 188(1) ; 32BIT-NEXT: stw 26, 72(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 27, 76(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 28, 80(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 29, 84(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 30, 88(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 31, 92(1) # 4-byte Folded Spill ; 32BIT-NEXT: stfd 30, 96(1) # 8-byte Folded Spill ; 32BIT-NEXT: stfd 31, 104(1) # 8-byte Folded Spill ; 32BIT-NEXT: fmr 31, 3 ; 32BIT-NEXT: fmr 30, 2 ; 32BIT-NEXT: mr 31, 10 ; 32BIT-NEXT: mr 30, 9 ; 32BIT-NEXT: mr 29, 8 ; 32BIT-NEXT: mr 28, 7 ; 32BIT-NEXT: mr 27, 6 ; 32BIT-NEXT: mr 26, 5 ; 32BIT-NEXT: stfd 5, 192(1) ; 32BIT-NEXT: stfd 4, 180(1) ; 32BIT-NEXT: stfs 3, 176(1) ; 32BIT-NEXT: stfs 2, 172(1) ; 32BIT-NEXT: stw 10, 164(1) ; 32BIT-NEXT: stw 9, 160(1) ; 32BIT-NEXT: stw 8, 156(1) ; 32BIT-NEXT: stw 7, 152(1) ; 32BIT-NEXT: stw 6, 148(1) ; 32BIT-NEXT: stw 5, 144(1) ; 32BIT-NEXT: bl .consume_f64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: fadds 1, 30, 31 ; 32BIT-NEXT: bl .consume_f32[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addc 3, 29, 27 ; 32BIT-NEXT: adde 4, 28, 26 ; 32BIT-NEXT: srawi 5, 30, 31 ; 32BIT-NEXT: addc 3, 3, 30 ; 32BIT-NEXT: adde 5, 4, 5 ; 32BIT-NEXT: addc 4, 3, 24 ; 32BIT-NEXT: adde 3, 5, 31 ; 32BIT-NEXT: bl .consume_i64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: add 3, 25, 30 ; 32BIT-NEXT: bl .consume_i32[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: lfd 31, 104(1) # 8-byte Folded Reload ; 32BIT-NEXT: lfd 30, 96(1) # 8-byte Folded Reload ; 32BIT-NEXT: lwz 31, 92(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 30, 88(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 29, 84(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 28, 80(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 27, 76(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 26, 72(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 25, 68(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 24, 64(1) # 4-byte Folded Reload ; 32BIT-NEXT: addi 1, 1, 112 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: mixed_1: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -176(1) ; 64BIT-NEXT: std 0, 192(1) ; 64BIT-NEXT: stfd 1, 224(1) ; 64BIT-NEXT: xsadddp 1, 1, 5 ; 64BIT-NEXT: std 27, 120(1) # 8-byte Folded Spill ; 64BIT-NEXT: lwz 27, 292(1) ; 64BIT-NEXT: std 28, 128(1) # 8-byte Folded Spill ; 64BIT-NEXT: std 29, 136(1) # 8-byte Folded Spill ; 64BIT-NEXT: std 30, 144(1) # 8-byte Folded Spill ; 64BIT-NEXT: std 31, 152(1) # 8-byte Folded Spill ; 64BIT-NEXT: stfd 30, 160(1) # 8-byte Folded Spill ; 64BIT-NEXT: stfd 31, 168(1) # 8-byte Folded Spill ; 64BIT-NEXT: fmr 31, 3 ; 64BIT-NEXT: fmr 30, 2 ; 64BIT-NEXT: mr 31, 7 ; 64BIT-NEXT: mr 30, 6 ; 64BIT-NEXT: mr 29, 5 ; 64BIT-NEXT: mr 28, 4 ; 64BIT-NEXT: stfd 5, 296(1) ; 64BIT-NEXT: stfd 4, 280(1) ; 64BIT-NEXT: stfs 3, 272(1) ; 64BIT-NEXT: stfs 2, 264(1) ; 64BIT-NEXT: std 7, 256(1) ; 64BIT-NEXT: std 6, 248(1) ; 64BIT-NEXT: std 5, 240(1) ; 64BIT-NEXT: std 4, 232(1) ; 64BIT-NEXT: bl .consume_f64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: fadds 1, 30, 31 ; 64BIT-NEXT: bl .consume_f32[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: add 3, 29, 28 ; 64BIT-NEXT: add 3, 3, 30 ; 64BIT-NEXT: add 3, 3, 31 ; 64BIT-NEXT: bl .consume_i64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: add 3, 27, 30 ; 64BIT-NEXT: extsw 3, 3 ; 64BIT-NEXT: bl .consume_i32[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: lfd 31, 168(1) # 8-byte Folded Reload ; 64BIT-NEXT: lfd 30, 160(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 31, 152(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 30, 144(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 29, 136(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 28, 128(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 27, 120(1) # 8-byte Folded Reload ; 64BIT-NEXT: addi 1, 1, 176 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %add = fadd double %a, %j tail call void @consume_f64(double %add) %add1 = fadd float %f, %g tail call void @consume_f32(float %add1) %add2 = add nsw i64 %c, %b %conv = sext i32 %d to i64 %add3 = add nsw i64 %add2, %conv %add4 = add nsw i64 %add3, %e tail call void @consume_i64(i64 %add4) %add5 = add nsw i32 %i, %d tail call void @consume_i32(i32 signext %add5) ret void } define void @mixed_2(<2 x double> %a, <4 x i32> %b, i64 %c) #0 { ; 32BIT-LABEL: mixed_2: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -80(1) ; 32BIT-NEXT: li 5, 64 ; 32BIT-NEXT: stw 0, 88(1) ; 32BIT-NEXT: stw 4, 140(1) ; 32BIT-NEXT: stw 3, 136(1) ; 32BIT-NEXT: stxvd2x 34, 1, 5 # 16-byte Folded Spill ; 32BIT-NEXT: addi 5, 1, 120 ; 32BIT-NEXT: stxvw4x 35, 0, 5 ; 32BIT-NEXT: addi 5, 1, 104 ; 32BIT-NEXT: stxvd2x 34, 0, 5 ; 32BIT-NEXT: lwz 5, 120(1) ; 32BIT-NEXT: srawi 6, 5, 31 ; 32BIT-NEXT: addc 4, 5, 4 ; 32BIT-NEXT: adde 3, 6, 3 ; 32BIT-NEXT: bl .consume_i64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: li 3, 64 ; 32BIT-NEXT: lxvd2x 1, 1, 3 # 16-byte Folded Reload ; 32BIT-NEXT: bl .consume_f64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 80 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: mixed_2: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -144(1) ; 64BIT-NEXT: li 4, 128 ; 64BIT-NEXT: std 0, 160(1) ; 64BIT-NEXT: std 3, 224(1) ; 64BIT-NEXT: stxvd2x 34, 1, 4 # 16-byte Folded Spill ; 64BIT-NEXT: addi 4, 1, 208 ; 64BIT-NEXT: stxvw4x 35, 0, 4 ; 64BIT-NEXT: addi 4, 1, 192 ; 64BIT-NEXT: stxvd2x 34, 0, 4 ; 64BIT-NEXT: lwa 4, 208(1) ; 64BIT-NEXT: add 3, 4, 3 ; 64BIT-NEXT: bl .consume_i64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: li 3, 128 ; 64BIT-NEXT: lxvd2x 1, 1, 3 # 16-byte Folded Reload ; 64BIT-NEXT: bl .consume_f64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 144 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %vecext = extractelement <4 x i32> %b, i64 0 %conv = sext i32 %vecext to i64 %add = add nsw i64 %conv, %c tail call void @consume_i64(i64 %add) %vecext1 = extractelement <2 x double> %a, i64 0 tail call void @consume_f64(double %vecext1) ret void } %struct.foo = type <{ [3 x i32], double, [12 x i8], <4 x i32> }> define void @mixed_3(<2 x double> %a, i64 %b, double %c, float %d, i32 signext %e, double %f, ...) #0 { ; 32BIT-LABEL: mixed_3: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -80(1) ; 32BIT-NEXT: xsadddp 0, 34, 3 ; 32BIT-NEXT: stw 0, 88(1) ; 32BIT-NEXT: stfd 1, 128(1) ; 32BIT-NEXT: stw 29, 60(1) # 4-byte Folded Spill ; 32BIT-NEXT: addi 3, 1, 104 ; 32BIT-NEXT: lwz 29, 148(1) ; 32BIT-NEXT: stw 30, 64(1) # 4-byte Folded Spill ; 32BIT-NEXT: stw 31, 68(1) # 4-byte Folded Spill ; 32BIT-NEXT: stfd 31, 72(1) # 8-byte Folded Spill ; 32BIT-NEXT: fmr 31, 2 ; 32BIT-NEXT: mr 31, 10 ; 32BIT-NEXT: mr 30, 9 ; 32BIT-NEXT: xsadddp 1, 0, 1 ; 32BIT-NEXT: stxvd2x 34, 0, 3 ; 32BIT-NEXT: stfd 3, 144(1) ; 32BIT-NEXT: stfs 2, 136(1) ; 32BIT-NEXT: stw 10, 124(1) ; 32BIT-NEXT: stw 9, 120(1) ; 32BIT-NEXT: bl .consume_f64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: mr 3, 30 ; 32BIT-NEXT: mr 4, 31 ; 32BIT-NEXT: bl .consume_i64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: fmr 1, 31 ; 32BIT-NEXT: bl .consume_f32[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: mr 3, 29 ; 32BIT-NEXT: bl .consume_i32[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: lfd 31, 72(1) # 8-byte Folded Reload ; 32BIT-NEXT: lwz 31, 68(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 30, 64(1) # 4-byte Folded Reload ; 32BIT-NEXT: lwz 29, 60(1) # 4-byte Folded Reload ; 32BIT-NEXT: addi 1, 1, 80 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; 32BIT: NumOfGPRsSaved = 3 ; ; 64BIT-LABEL: mixed_3: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -144(1) ; 64BIT-NEXT: xsadddp 0, 34, 3 ; 64BIT-NEXT: std 0, 160(1) ; 64BIT-NEXT: stfd 1, 216(1) ; 64BIT-NEXT: addi 3, 1, 192 ; 64BIT-NEXT: std 30, 120(1) # 8-byte Folded Spill ; 64BIT-NEXT: std 31, 128(1) # 8-byte Folded Spill ; 64BIT-NEXT: stfd 31, 136(1) # 8-byte Folded Spill ; 64BIT-NEXT: mr 31, 8 ; 64BIT-NEXT: fmr 31, 2 ; 64BIT-NEXT: mr 30, 5 ; 64BIT-NEXT: stxvd2x 34, 0, 3 ; 64BIT-NEXT: xsadddp 1, 0, 1 ; 64BIT-NEXT: std 10, 248(1) ; 64BIT-NEXT: stfd 3, 240(1) ; 64BIT-NEXT: std 8, 232(1) ; 64BIT-NEXT: stfs 2, 224(1) ; 64BIT-NEXT: std 5, 208(1) ; 64BIT-NEXT: bl .consume_f64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: mr 3, 30 ; 64BIT-NEXT: bl .consume_i64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: fmr 1, 31 ; 64BIT-NEXT: bl .consume_f32[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: mr 3, 31 ; 64BIT-NEXT: bl .consume_i32[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: lfd 31, 136(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 31, 128(1) # 8-byte Folded Reload ; 64BIT-NEXT: ld 30, 120(1) # 8-byte Folded Reload ; 64BIT-NEXT: addi 1, 1, 144 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr ; 64BIT: NumOfGPRsSaved = 2 entry: %vecext = extractelement <2 x double> %a, i64 0 %add = fadd double %vecext, %f %add1 = fadd double %add, %c tail call void @consume_f64(double %add1) tail call void @consume_i64(i64 %b) tail call void @consume_f32(float %d) tail call void @consume_i32(i32 signext %e) ret void } define signext i32 @mixed_4(ptr byval(%struct.foo) align 16 %foo, i32 %sec) #0 { ; 32BIT-LABEL: mixed_4: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: stw 9, 48(1) ; 32BIT-NEXT: stw 8, 44(1) ; 32BIT-NEXT: lfd 0, 44(1) ; 32BIT-NEXT: addi 3, 1, -4 ; 32BIT-NEXT: xscvdpsxws 0, 0 ; 32BIT-NEXT: stw 5, 32(1) ; 32BIT-NEXT: stw 6, 36(1) ; 32BIT-NEXT: stw 7, 40(1) ; 32BIT-NEXT: stw 10, 52(1) ; 32BIT-NEXT: stfiwx 0, 0, 3 ; 32BIT-NEXT: lwz 3, -4(1) ; 32BIT-NEXT: lwz 4, 76(1) ; 32BIT-NEXT: add 3, 5, 3 ; 32BIT-NEXT: add 3, 3, 4 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: mixed_4: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: std 5, 64(1) ; 64BIT-NEXT: std 4, 56(1) ; 64BIT-NEXT: lfd 0, 60(1) ; 64BIT-NEXT: addi 4, 1, -4 ; 64BIT-NEXT: xscvdpsxws 0, 0 ; 64BIT-NEXT: std 3, 48(1) ; 64BIT-NEXT: std 6, 72(1) ; 64BIT-NEXT: std 7, 80(1) ; 64BIT-NEXT: std 8, 88(1) ; 64BIT-NEXT: std 9, 96(1) ; 64BIT-NEXT: rldicl 3, 3, 32, 32 ; 64BIT-NEXT: stfiwx 0, 0, 4 ; 64BIT-NEXT: lwz 4, -4(1) ; 64BIT-NEXT: add 3, 3, 4 ; 64BIT-NEXT: add 3, 3, 8 ; 64BIT-NEXT: extsw 3, 3 ; 64BIT-NEXT: blr entry: %0 = load i32, ptr %foo, align 16 %x = getelementptr inbounds i8, ptr %foo, i64 12 %1 = load double, ptr %x, align 4 %conv = fptosi double %1 to i32 %add = add nsw i32 %0, %conv %2 = getelementptr inbounds i8, ptr %foo, i64 44 %vecext = load i32, ptr %2, align 4 %add1 = add nsw i32 %add, %vecext ret i32 %add1 } %struct.bar = type { i8, i32, <4 x i32>, ptr, i8 } define 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 { ; 32BIT-LABEL: mixed_5: ; 32BIT: # %bb.0: # %entry ; 32BIT-NEXT: mflr 0 ; 32BIT-NEXT: stwu 1, -64(1) ; 32BIT-NEXT: stw 0, 72(1) ; 32BIT-NEXT: stw 5, 96(1) ; 32BIT-NEXT: lfd 1, 172(1) ; 32BIT-NEXT: stw 6, 100(1) ; 32BIT-NEXT: stw 7, 104(1) ; 32BIT-NEXT: stw 8, 108(1) ; 32BIT-NEXT: stw 9, 112(1) ; 32BIT-NEXT: stw 10, 116(1) ; 32BIT-NEXT: stw 3, 88(1) ; 32BIT-NEXT: bl .consume_f64[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: lwz 3, 100(1) ; 32BIT-NEXT: bl .consume_i32[PR] ; 32BIT-NEXT: nop ; 32BIT-NEXT: addi 1, 1, 64 ; 32BIT-NEXT: lwz 0, 8(1) ; 32BIT-NEXT: mtlr 0 ; 32BIT-NEXT: blr ; ; 64BIT-LABEL: mixed_5: ; 64BIT: # %bb.0: # %entry ; 64BIT-NEXT: mflr 0 ; 64BIT-NEXT: stdu 1, -112(1) ; 64BIT-NEXT: std 0, 128(1) ; 64BIT-NEXT: std 5, 176(1) ; 64BIT-NEXT: lfd 1, 252(1) ; 64BIT-NEXT: std 6, 184(1) ; 64BIT-NEXT: std 7, 192(1) ; 64BIT-NEXT: std 8, 200(1) ; 64BIT-NEXT: std 9, 208(1) ; 64BIT-NEXT: std 10, 216(1) ; 64BIT-NEXT: std 3, 160(1) ; 64BIT-NEXT: bl .consume_f64[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: lwa 3, 180(1) ; 64BIT-NEXT: bl .consume_i32[PR] ; 64BIT-NEXT: nop ; 64BIT-NEXT: addi 1, 1, 112 ; 64BIT-NEXT: ld 0, 16(1) ; 64BIT-NEXT: mtlr 0 ; 64BIT-NEXT: blr entry: %d = getelementptr inbounds i8, ptr %f, i64 12 %0 = load double, ptr %d, align 4 tail call void @consume_f64(double %0) %i = getelementptr inbounds i8, ptr %x, i64 4 %1 = load i32, ptr %i, align 4 tail call void @consume_i32(i32 signext %1) ret void } declare void @foo() declare void @consume_f64(double) declare void @consume_f32(float) declare void @consume_i64(i64) declare void @consume_i32(i32 signext) attributes #0 = { nofree noinline nounwind "save-reg-params" }