blob: 409b1a1f818abf31ccb132fc5c15c71a19013d82 [file] [log] [blame]
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5
; RUN: llc -mtriple=mips < %s | FileCheck %s -check-prefix=SOFT-FLOAT-32
; RUN: llc -mtriple=mips -mcpu mips32r2 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-32R2
; RUN: llc -mtriple=mips64 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-64
; RUN: llc -mtriple=mips64 -mcpu mips64r2 < %s | FileCheck %s -check-prefix=SOFT-FLOAT-64R2
define float @fmuladd_intrinsic_f32(float %a, float %b, float %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_intrinsic_f32:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: .cfi_offset 16, -8
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $16, $6
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: move $5, $16
; SOFT-FLOAT-32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_intrinsic_f32:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 16, -8
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $16, $6
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: move $5, $16
; SOFT-FLOAT-32R2-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-64-LABEL: fmuladd_intrinsic_f32:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: move $16, $6
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: move $5, $16
; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_intrinsic_f32:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: move $16, $6
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: move $5, $16
; SOFT-FLOAT-64R2-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 16
%result = call float @llvm.fmuladd.f32(float %a, float %b, float %c)
ret float %result
}
define double @fmuladd_intrinsic_f64(double %a, double %b, double %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_intrinsic_f64:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: nop
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $6, 40($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 44($sp)
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_intrinsic_f64:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: nop
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $6, 40($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 44($sp)
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-64-LABEL: fmuladd_intrinsic_f64:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $16, $6
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: move $5, $16
; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_intrinsic_f64:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $16, $6
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: move $5, $16
; SOFT-FLOAT-64R2-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 16
%result = call double @llvm.fmuladd.f64(double %a, double %b, double %c)
ret double %result
}
define float @fmuladd_contract_f32(float %a, float %b, float %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_contract_f32:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: .cfi_offset 16, -8
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $16, $6
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: move $5, $16
; SOFT-FLOAT-32-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_contract_f32:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $16, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 16, -8
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $16, $6
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: move $5, $16
; SOFT-FLOAT-32R2-NEXT: lw $16, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-64-LABEL: fmuladd_contract_f32:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: move $16, $6
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: move $5, $16
; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_contract_f32:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: move $16, $6
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: move $5, $16
; SOFT-FLOAT-64R2-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 16
%product = fmul contract float %a, %b
%result = fadd contract float %product, %c
ret float %result
}
define double @fmuladd_contract_f64(double %a, double %b, double %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_contract_f64:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: nop
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $6, 40($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 44($sp)
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_contract_f64:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 24
; SOFT-FLOAT-32R2-NEXT: sw $ra, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: nop
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $6, 40($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 44($sp)
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: lw $ra, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 24
;
; SOFT-FLOAT-64-LABEL: fmuladd_contract_f64:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $16, $6
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: move $5, $16
; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 16
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_contract_f64:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 16
; SOFT-FLOAT-64R2-NEXT: sd $ra, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -16
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $16, $6
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: move $5, $16
; SOFT-FLOAT-64R2-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 16
%product = fmul contract double %a, %b
%result = fadd contract double %product, %c
ret double %result
}
define <4 x float> @fmuladd_contract_v4f32(<4 x float> %a, <4 x float> %b, <4 x float> %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_contract_v4f32:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -48
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 48
; SOFT-FLOAT-32-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $21, 40($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $20, 36($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $19, 32($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $18, 28($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: .cfi_offset 21, -8
; SOFT-FLOAT-32-NEXT: .cfi_offset 20, -12
; SOFT-FLOAT-32-NEXT: .cfi_offset 19, -16
; SOFT-FLOAT-32-NEXT: .cfi_offset 18, -20
; SOFT-FLOAT-32-NEXT: .cfi_offset 17, -24
; SOFT-FLOAT-32-NEXT: .cfi_offset 16, -28
; SOFT-FLOAT-32-NEXT: move $17, $7
; SOFT-FLOAT-32-NEXT: move $16, $4
; SOFT-FLOAT-32-NEXT: lw $4, 64($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 80($sp)
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $18, $6
; SOFT-FLOAT-32-NEXT: lw $5, 96($sp)
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $4, 68($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 84($sp)
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $19, $2
; SOFT-FLOAT-32-NEXT: lw $5, 100($sp)
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: move $20, $2
; SOFT-FLOAT-32-NEXT: lw $5, 76($sp)
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $4, $17
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $17, 88($sp)
; SOFT-FLOAT-32-NEXT: lw $21, 72($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 92($sp)
; SOFT-FLOAT-32-NEXT: sw $20, 12($16)
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: sw $19, 8($16)
; SOFT-FLOAT-32-NEXT: sw $2, 4($16)
; SOFT-FLOAT-32-NEXT: move $4, $18
; SOFT-FLOAT-32-NEXT: jal __mulsf3
; SOFT-FLOAT-32-NEXT: move $5, $21
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: jal __addsf3
; SOFT-FLOAT-32-NEXT: move $5, $17
; SOFT-FLOAT-32-NEXT: sw $2, 0($16)
; SOFT-FLOAT-32-NEXT: lw $16, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $17, 24($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $18, 28($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $19, 32($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $20, 36($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $21, 40($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 48
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_contract_v4f32:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -48
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 48
; SOFT-FLOAT-32R2-NEXT: sw $ra, 44($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $21, 40($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $20, 36($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $19, 32($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $18, 28($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $17, 24($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $16, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 21, -8
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 20, -12
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 19, -16
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 18, -20
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 17, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 16, -28
; SOFT-FLOAT-32R2-NEXT: move $17, $7
; SOFT-FLOAT-32R2-NEXT: move $16, $4
; SOFT-FLOAT-32R2-NEXT: lw $4, 64($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 80($sp)
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $18, $6
; SOFT-FLOAT-32R2-NEXT: lw $5, 96($sp)
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $4, 68($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 84($sp)
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $19, $2
; SOFT-FLOAT-32R2-NEXT: lw $5, 100($sp)
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: move $20, $2
; SOFT-FLOAT-32R2-NEXT: lw $5, 76($sp)
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $4, $17
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $17, 88($sp)
; SOFT-FLOAT-32R2-NEXT: lw $21, 72($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 92($sp)
; SOFT-FLOAT-32R2-NEXT: sw $20, 12($16)
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: sw $19, 8($16)
; SOFT-FLOAT-32R2-NEXT: sw $2, 4($16)
; SOFT-FLOAT-32R2-NEXT: move $4, $18
; SOFT-FLOAT-32R2-NEXT: jal __mulsf3
; SOFT-FLOAT-32R2-NEXT: move $5, $21
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: jal __addsf3
; SOFT-FLOAT-32R2-NEXT: move $5, $17
; SOFT-FLOAT-32R2-NEXT: sw $2, 0($16)
; SOFT-FLOAT-32R2-NEXT: lw $16, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $17, 24($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $18, 28($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $19, 32($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $20, 36($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $21, 40($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $ra, 44($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 48
;
; SOFT-FLOAT-64-LABEL: fmuladd_contract_v4f32:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -80
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 80
; SOFT-FLOAT-64-NEXT: sd $ra, 72($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $23, 64($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $22, 56($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $21, 48($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $20, 40($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $19, 32($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $18, 24($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $17, 16($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 23, -16
; SOFT-FLOAT-64-NEXT: .cfi_offset 22, -24
; SOFT-FLOAT-64-NEXT: .cfi_offset 21, -32
; SOFT-FLOAT-64-NEXT: .cfi_offset 20, -40
; SOFT-FLOAT-64-NEXT: .cfi_offset 19, -48
; SOFT-FLOAT-64-NEXT: .cfi_offset 18, -56
; SOFT-FLOAT-64-NEXT: .cfi_offset 17, -64
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -72
; SOFT-FLOAT-64-NEXT: move $16, $9
; SOFT-FLOAT-64-NEXT: move $19, $8
; SOFT-FLOAT-64-NEXT: move $17, $7
; SOFT-FLOAT-64-NEXT: move $20, $6
; SOFT-FLOAT-64-NEXT: move $18, $5
; SOFT-FLOAT-64-NEXT: move $21, $4
; SOFT-FLOAT-64-NEXT: sll $4, $21, 0
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: sll $5, $20, 0
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: sll $5, $19, 0
; SOFT-FLOAT-64-NEXT: move $22, $2
; SOFT-FLOAT-64-NEXT: sll $4, $18, 0
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: sll $5, $17, 0
; SOFT-FLOAT-64-NEXT: move $23, $2
; SOFT-FLOAT-64-NEXT: dsrl $1, $21, 32
; SOFT-FLOAT-64-NEXT: sll $4, $1, 0
; SOFT-FLOAT-64-NEXT: dsrl $1, $20, 32
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: dsll $1, $22, 32
; SOFT-FLOAT-64-NEXT: dsrl $2, $19, 32
; SOFT-FLOAT-64-NEXT: sll $5, $2, 0
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: dsrl $19, $1, 32
; SOFT-FLOAT-64-NEXT: # kill: def $v0 killed $v0 def $v0_64
; SOFT-FLOAT-64-NEXT: dsll $1, $2, 32
; SOFT-FLOAT-64-NEXT: sll $5, $16, 0
; SOFT-FLOAT-64-NEXT: or $19, $19, $1
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: move $4, $23
; SOFT-FLOAT-64-NEXT: move $20, $2
; SOFT-FLOAT-64-NEXT: dsrl $1, $18, 32
; SOFT-FLOAT-64-NEXT: sll $4, $1, 0
; SOFT-FLOAT-64-NEXT: dsrl $1, $17, 32
; SOFT-FLOAT-64-NEXT: jal __mulsf3
; SOFT-FLOAT-64-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: dsll $1, $20, 32
; SOFT-FLOAT-64-NEXT: dsrl $17, $1, 32
; SOFT-FLOAT-64-NEXT: dsrl $1, $16, 32
; SOFT-FLOAT-64-NEXT: jal __addsf3
; SOFT-FLOAT-64-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64-NEXT: # kill: def $v0 killed $v0 def $v0_64
; SOFT-FLOAT-64-NEXT: dsll $1, $2, 32
; SOFT-FLOAT-64-NEXT: or $3, $17, $1
; SOFT-FLOAT-64-NEXT: move $2, $19
; SOFT-FLOAT-64-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $17, 16($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $18, 24($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $19, 32($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $20, 40($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $21, 48($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $22, 56($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $23, 64($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 72($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 80
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_contract_v4f32:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -80
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 80
; SOFT-FLOAT-64R2-NEXT: sd $ra, 72($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $23, 64($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $22, 56($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $21, 48($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $20, 40($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $19, 32($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $18, 24($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $17, 16($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 23, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 22, -24
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 21, -32
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 20, -40
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 19, -48
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 18, -56
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 17, -64
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -72
; SOFT-FLOAT-64R2-NEXT: move $16, $9
; SOFT-FLOAT-64R2-NEXT: move $19, $8
; SOFT-FLOAT-64R2-NEXT: move $17, $7
; SOFT-FLOAT-64R2-NEXT: move $20, $6
; SOFT-FLOAT-64R2-NEXT: move $18, $5
; SOFT-FLOAT-64R2-NEXT: move $21, $4
; SOFT-FLOAT-64R2-NEXT: sll $4, $21, 0
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $20, 0
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $19, 0
; SOFT-FLOAT-64R2-NEXT: move $22, $2
; SOFT-FLOAT-64R2-NEXT: sll $4, $18, 0
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $17, 0
; SOFT-FLOAT-64R2-NEXT: move $23, $2
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $21, 32
; SOFT-FLOAT-64R2-NEXT: sll $4, $1, 0
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $20, 32
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $19, 32
; SOFT-FLOAT-64R2-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: dext $19, $22, 0, 32
; SOFT-FLOAT-64R2-NEXT: # kill: def $v0 killed $v0 def $v0_64
; SOFT-FLOAT-64R2-NEXT: dsll $1, $2, 32
; SOFT-FLOAT-64R2-NEXT: sll $5, $16, 0
; SOFT-FLOAT-64R2-NEXT: or $19, $19, $1
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: move $4, $23
; SOFT-FLOAT-64R2-NEXT: move $20, $2
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $18, 32
; SOFT-FLOAT-64R2-NEXT: sll $4, $1, 0
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $17, 32
; SOFT-FLOAT-64R2-NEXT: jal __mulsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: dext $17, $20, 0, 32
; SOFT-FLOAT-64R2-NEXT: dsrl $1, $16, 32
; SOFT-FLOAT-64R2-NEXT: jal __addsf3
; SOFT-FLOAT-64R2-NEXT: sll $5, $1, 0
; SOFT-FLOAT-64R2-NEXT: # kill: def $v0 killed $v0 def $v0_64
; SOFT-FLOAT-64R2-NEXT: dsll $1, $2, 32
; SOFT-FLOAT-64R2-NEXT: or $3, $17, $1
; SOFT-FLOAT-64R2-NEXT: move $2, $19
; SOFT-FLOAT-64R2-NEXT: ld $16, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $17, 16($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $18, 24($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $19, 32($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $20, 40($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $21, 48($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $22, 56($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $23, 64($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 72($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 80
%product = fmul contract <4 x float> %a, %b
%result = fadd contract <4 x float> %product, %c
ret <4 x float> %result
}
define <4 x double> @fmuladd_contract_v4f64(<4 x double> %a, <4 x double> %b, <4 x double> %c) #0 {
; SOFT-FLOAT-32-LABEL: fmuladd_contract_v4f64:
; SOFT-FLOAT-32: # %bb.0:
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, -64
; SOFT-FLOAT-32-NEXT: .cfi_def_cfa_offset 64
; SOFT-FLOAT-32-NEXT: sw $ra, 60($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $fp, 56($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $23, 52($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $22, 48($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $21, 44($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $20, 40($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $19, 36($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $18, 32($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $17, 28($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $16, 24($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32-NEXT: .cfi_offset 30, -8
; SOFT-FLOAT-32-NEXT: .cfi_offset 23, -12
; SOFT-FLOAT-32-NEXT: .cfi_offset 22, -16
; SOFT-FLOAT-32-NEXT: .cfi_offset 21, -20
; SOFT-FLOAT-32-NEXT: .cfi_offset 20, -24
; SOFT-FLOAT-32-NEXT: .cfi_offset 19, -28
; SOFT-FLOAT-32-NEXT: .cfi_offset 18, -32
; SOFT-FLOAT-32-NEXT: .cfi_offset 17, -36
; SOFT-FLOAT-32-NEXT: .cfi_offset 16, -40
; SOFT-FLOAT-32-NEXT: sw $7, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: sw $6, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32-NEXT: move $16, $4
; SOFT-FLOAT-32-NEXT: lw $4, 88($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 92($sp)
; SOFT-FLOAT-32-NEXT: lw $6, 120($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 124($sp)
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: nop
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $6, 152($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 156($sp)
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: move $19, $2
; SOFT-FLOAT-32-NEXT: lw $4, 96($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 100($sp)
; SOFT-FLOAT-32-NEXT: lw $6, 128($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 132($sp)
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: move $20, $3
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: lw $6, 160($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 164($sp)
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: move $21, $2
; SOFT-FLOAT-32-NEXT: lw $4, 80($sp)
; SOFT-FLOAT-32-NEXT: lw $5, 84($sp)
; SOFT-FLOAT-32-NEXT: lw $6, 112($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 116($sp)
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: move $22, $3
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: lw $23, 140($sp)
; SOFT-FLOAT-32-NEXT: lw $fp, 136($sp)
; SOFT-FLOAT-32-NEXT: lw $17, 108($sp)
; SOFT-FLOAT-32-NEXT: lw $18, 104($sp)
; SOFT-FLOAT-32-NEXT: lw $7, 148($sp)
; SOFT-FLOAT-32-NEXT: lw $6, 144($sp)
; SOFT-FLOAT-32-NEXT: sw $22, 28($16)
; SOFT-FLOAT-32-NEXT: sw $21, 24($16)
; SOFT-FLOAT-32-NEXT: sw $20, 20($16)
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: sw $19, 16($16)
; SOFT-FLOAT-32-NEXT: sw $3, 12($16)
; SOFT-FLOAT-32-NEXT: sw $2, 8($16)
; SOFT-FLOAT-32-NEXT: lw $4, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $5, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: move $6, $18
; SOFT-FLOAT-32-NEXT: jal __muldf3
; SOFT-FLOAT-32-NEXT: move $7, $17
; SOFT-FLOAT-32-NEXT: move $4, $2
; SOFT-FLOAT-32-NEXT: move $5, $3
; SOFT-FLOAT-32-NEXT: move $6, $fp
; SOFT-FLOAT-32-NEXT: jal __adddf3
; SOFT-FLOAT-32-NEXT: move $7, $23
; SOFT-FLOAT-32-NEXT: sw $3, 4($16)
; SOFT-FLOAT-32-NEXT: sw $2, 0($16)
; SOFT-FLOAT-32-NEXT: lw $16, 24($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $17, 28($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $18, 32($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $19, 36($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $20, 40($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $21, 44($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $22, 48($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $23, 52($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $fp, 56($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: lw $ra, 60($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32-NEXT: jr $ra
; SOFT-FLOAT-32-NEXT: addiu $sp, $sp, 64
;
; SOFT-FLOAT-32R2-LABEL: fmuladd_contract_v4f64:
; SOFT-FLOAT-32R2: # %bb.0:
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, -64
; SOFT-FLOAT-32R2-NEXT: .cfi_def_cfa_offset 64
; SOFT-FLOAT-32R2-NEXT: sw $ra, 60($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $fp, 56($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $23, 52($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $22, 48($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $21, 44($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $20, 40($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $19, 36($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $18, 32($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $17, 28($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $16, 24($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 31, -4
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 30, -8
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 23, -12
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 22, -16
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 21, -20
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 20, -24
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 19, -28
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 18, -32
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 17, -36
; SOFT-FLOAT-32R2-NEXT: .cfi_offset 16, -40
; SOFT-FLOAT-32R2-NEXT: sw $7, 20($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: sw $6, 16($sp) # 4-byte Folded Spill
; SOFT-FLOAT-32R2-NEXT: move $16, $4
; SOFT-FLOAT-32R2-NEXT: lw $4, 88($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 92($sp)
; SOFT-FLOAT-32R2-NEXT: lw $6, 120($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 124($sp)
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: nop
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $6, 152($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 156($sp)
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: move $19, $2
; SOFT-FLOAT-32R2-NEXT: lw $4, 96($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 100($sp)
; SOFT-FLOAT-32R2-NEXT: lw $6, 128($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 132($sp)
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: move $20, $3
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: lw $6, 160($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 164($sp)
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: move $21, $2
; SOFT-FLOAT-32R2-NEXT: lw $4, 80($sp)
; SOFT-FLOAT-32R2-NEXT: lw $5, 84($sp)
; SOFT-FLOAT-32R2-NEXT: lw $6, 112($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 116($sp)
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: move $22, $3
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: lw $23, 140($sp)
; SOFT-FLOAT-32R2-NEXT: lw $fp, 136($sp)
; SOFT-FLOAT-32R2-NEXT: lw $17, 108($sp)
; SOFT-FLOAT-32R2-NEXT: lw $18, 104($sp)
; SOFT-FLOAT-32R2-NEXT: lw $7, 148($sp)
; SOFT-FLOAT-32R2-NEXT: lw $6, 144($sp)
; SOFT-FLOAT-32R2-NEXT: sw $22, 28($16)
; SOFT-FLOAT-32R2-NEXT: sw $21, 24($16)
; SOFT-FLOAT-32R2-NEXT: sw $20, 20($16)
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: sw $19, 16($16)
; SOFT-FLOAT-32R2-NEXT: sw $3, 12($16)
; SOFT-FLOAT-32R2-NEXT: sw $2, 8($16)
; SOFT-FLOAT-32R2-NEXT: lw $4, 16($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $5, 20($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: move $6, $18
; SOFT-FLOAT-32R2-NEXT: jal __muldf3
; SOFT-FLOAT-32R2-NEXT: move $7, $17
; SOFT-FLOAT-32R2-NEXT: move $4, $2
; SOFT-FLOAT-32R2-NEXT: move $5, $3
; SOFT-FLOAT-32R2-NEXT: move $6, $fp
; SOFT-FLOAT-32R2-NEXT: jal __adddf3
; SOFT-FLOAT-32R2-NEXT: move $7, $23
; SOFT-FLOAT-32R2-NEXT: sw $3, 4($16)
; SOFT-FLOAT-32R2-NEXT: sw $2, 0($16)
; SOFT-FLOAT-32R2-NEXT: lw $16, 24($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $17, 28($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $18, 32($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $19, 36($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $20, 40($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $21, 44($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $22, 48($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $23, 52($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $fp, 56($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: lw $ra, 60($sp) # 4-byte Folded Reload
; SOFT-FLOAT-32R2-NEXT: jr $ra
; SOFT-FLOAT-32R2-NEXT: addiu $sp, $sp, 64
;
; SOFT-FLOAT-64-LABEL: fmuladd_contract_v4f64:
; SOFT-FLOAT-64: # %bb.0:
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, -64
; SOFT-FLOAT-64-NEXT: .cfi_def_cfa_offset 64
; SOFT-FLOAT-64-NEXT: sd $ra, 56($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $22, 48($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $21, 40($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $20, 32($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $19, 24($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $18, 16($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $17, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64-NEXT: .cfi_offset 22, -16
; SOFT-FLOAT-64-NEXT: .cfi_offset 21, -24
; SOFT-FLOAT-64-NEXT: .cfi_offset 20, -32
; SOFT-FLOAT-64-NEXT: .cfi_offset 19, -40
; SOFT-FLOAT-64-NEXT: .cfi_offset 18, -48
; SOFT-FLOAT-64-NEXT: .cfi_offset 17, -56
; SOFT-FLOAT-64-NEXT: .cfi_offset 16, -64
; SOFT-FLOAT-64-NEXT: move $17, $10
; SOFT-FLOAT-64-NEXT: move $18, $9
; SOFT-FLOAT-64-NEXT: move $19, $8
; SOFT-FLOAT-64-NEXT: move $20, $6
; SOFT-FLOAT-64-NEXT: move $21, $5
; SOFT-FLOAT-64-NEXT: move $16, $4
; SOFT-FLOAT-64-NEXT: move $4, $7
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $5, $11
; SOFT-FLOAT-64-NEXT: ld $5, 88($sp)
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: move $22, $2
; SOFT-FLOAT-64-NEXT: ld $5, 64($sp)
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $4, $19
; SOFT-FLOAT-64-NEXT: ld $5, 96($sp)
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: move $19, $2
; SOFT-FLOAT-64-NEXT: move $4, $20
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $5, $17
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: ld $17, 72($sp)
; SOFT-FLOAT-64-NEXT: ld $5, 80($sp)
; SOFT-FLOAT-64-NEXT: sd $19, 24($16)
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: sd $22, 16($16)
; SOFT-FLOAT-64-NEXT: sd $2, 8($16)
; SOFT-FLOAT-64-NEXT: move $4, $21
; SOFT-FLOAT-64-NEXT: jal __muldf3
; SOFT-FLOAT-64-NEXT: move $5, $18
; SOFT-FLOAT-64-NEXT: move $4, $2
; SOFT-FLOAT-64-NEXT: jal __adddf3
; SOFT-FLOAT-64-NEXT: move $5, $17
; SOFT-FLOAT-64-NEXT: sd $2, 0($16)
; SOFT-FLOAT-64-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $17, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $18, 16($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $19, 24($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $20, 32($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $21, 40($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $22, 48($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: ld $ra, 56($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64-NEXT: jr $ra
; SOFT-FLOAT-64-NEXT: daddiu $sp, $sp, 64
;
; SOFT-FLOAT-64R2-LABEL: fmuladd_contract_v4f64:
; SOFT-FLOAT-64R2: # %bb.0:
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, -64
; SOFT-FLOAT-64R2-NEXT: .cfi_def_cfa_offset 64
; SOFT-FLOAT-64R2-NEXT: sd $ra, 56($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $22, 48($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $21, 40($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $20, 32($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $19, 24($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $18, 16($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $17, 8($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: sd $16, 0($sp) # 8-byte Folded Spill
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 31, -8
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 22, -16
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 21, -24
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 20, -32
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 19, -40
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 18, -48
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 17, -56
; SOFT-FLOAT-64R2-NEXT: .cfi_offset 16, -64
; SOFT-FLOAT-64R2-NEXT: move $17, $10
; SOFT-FLOAT-64R2-NEXT: move $18, $9
; SOFT-FLOAT-64R2-NEXT: move $19, $8
; SOFT-FLOAT-64R2-NEXT: move $20, $6
; SOFT-FLOAT-64R2-NEXT: move $21, $5
; SOFT-FLOAT-64R2-NEXT: move $16, $4
; SOFT-FLOAT-64R2-NEXT: move $4, $7
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $5, $11
; SOFT-FLOAT-64R2-NEXT: ld $5, 88($sp)
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: move $22, $2
; SOFT-FLOAT-64R2-NEXT: ld $5, 64($sp)
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $4, $19
; SOFT-FLOAT-64R2-NEXT: ld $5, 96($sp)
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: move $19, $2
; SOFT-FLOAT-64R2-NEXT: move $4, $20
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $5, $17
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: ld $17, 72($sp)
; SOFT-FLOAT-64R2-NEXT: ld $5, 80($sp)
; SOFT-FLOAT-64R2-NEXT: sd $19, 24($16)
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: sd $22, 16($16)
; SOFT-FLOAT-64R2-NEXT: sd $2, 8($16)
; SOFT-FLOAT-64R2-NEXT: move $4, $21
; SOFT-FLOAT-64R2-NEXT: jal __muldf3
; SOFT-FLOAT-64R2-NEXT: move $5, $18
; SOFT-FLOAT-64R2-NEXT: move $4, $2
; SOFT-FLOAT-64R2-NEXT: jal __adddf3
; SOFT-FLOAT-64R2-NEXT: move $5, $17
; SOFT-FLOAT-64R2-NEXT: sd $2, 0($16)
; SOFT-FLOAT-64R2-NEXT: ld $16, 0($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $17, 8($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $18, 16($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $19, 24($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $20, 32($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $21, 40($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $22, 48($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: ld $ra, 56($sp) # 8-byte Folded Reload
; SOFT-FLOAT-64R2-NEXT: jr $ra
; SOFT-FLOAT-64R2-NEXT: daddiu $sp, $sp, 64
%product = fmul contract <4 x double> %a, %b
%result = fadd contract <4 x double> %product, %c
ret <4 x double> %result
}
attributes #0 = { "use-soft-float"="true" }
declare float @llvm.fmuladd.f32(float %a, float %b, float %c)
declare double @llvm.fmuladd.f64(double %a, double %b, double %c)