510 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			510 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			LLVM
		
	
	
	
| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | |
| ; RUN: llc -march=mips -mcpu=mips32 < %s | FileCheck %s -check-prefixes=ALL,32
 | |
| ; RUN: llc -march=mips -mcpu=mips32r2 < %s | FileCheck %s -check-prefixes=ALL,32
 | |
| ; RUN: llc -march=mips -mcpu=mips32r6 < %s | FileCheck %s -check-prefixes=ALL,32R6
 | |
| ; RUN: llc -march=mips -mcpu=mips32r2 -mattr=dsp < %s | FileCheck %s -check-prefix=DSP
 | |
| ; RUN: llc -march=mips -mcpu=mips64   -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64
 | |
| ; RUN: llc -march=mips -mcpu=mips64r2 -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64
 | |
| ; RUN: llc -march=mips -mcpu=mips64r6 -target-abi n64 < %s | FileCheck %s -check-prefixes=ALL,64R6
 | |
| ; RUN: llc -march=mips -mattr=mips16 < %s | FileCheck %s -check-prefixes=ALL,16
 | |
| 
 | |
| define i64 @madd1(i32 %a, i32 %b, i32 %c) nounwind readnone {
 | |
| ; 32-LABEL: madd1:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    sra $1, $6, 31
 | |
| ; 32-NEXT:    mtlo $6
 | |
| ; 32-NEXT:    mthi $1
 | |
| ; 32-NEXT:    madd $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: madd1:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $5, $4
 | |
| ; 32R6-NEXT:    addu $3, $1, $6
 | |
| ; 32R6-NEXT:    sltu $1, $3, $1
 | |
| ; 32R6-NEXT:    muh $2, $5, $4
 | |
| ; 32R6-NEXT:    sra $4, $6, 31
 | |
| ; 32R6-NEXT:    addu $2, $2, $4
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    addu $2, $2, $1
 | |
| ;
 | |
| ; DSP-LABEL: madd1:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    sra $1, $6, 31
 | |
| ; DSP-NEXT:    mtlo $6, $ac0
 | |
| ; DSP-NEXT:    mthi $1, $ac0
 | |
| ; DSP-NEXT:    madd $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: madd1:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $4, 0
 | |
| ; 64-NEXT:    sll $2, $5, 0
 | |
| ; 64-NEXT:    dmult $2, $1
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    sll $2, $6, 0
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    daddu $2, $1, $2
 | |
| ;
 | |
| ; 64R6-LABEL: madd1:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $4, 0
 | |
| ; 64R6-NEXT:    sll $2, $5, 0
 | |
| ; 64R6-NEXT:    dmul $1, $2, $1
 | |
| ; 64R6-NEXT:    sll $2, $6, 0
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    daddu $2, $1, $2
 | |
| ;
 | |
| ; 16-LABEL: madd1:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $3
 | |
| ; 16-NEXT:    sra $4, $6, 31
 | |
| ; 16-NEXT:    addu $4, $3, $4
 | |
| ; 16-NEXT:    addu $3, $2, $6
 | |
| ; 16-NEXT:    sltu $3, $2
 | |
| ; 16-NEXT:    move $2, $24
 | |
| ; 16-NEXT:    addu $2, $4, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = sext i32 %a to i64
 | |
|   %conv2 = sext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv2, %conv
 | |
|   %conv4 = sext i32 %c to i64
 | |
|   %add = add nsw i64 %mul, %conv4
 | |
|   ret i64 %add
 | |
| }
 | |
| 
 | |
| define i64 @madd2(i32 zeroext %a, i32 zeroext %b, i32 zeroext %c) nounwind readnone {
 | |
| ; 32-LABEL: madd2:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    addiu $1, $zero, 0
 | |
| ; 32-NEXT:    mtlo $6
 | |
| ; 32-NEXT:    mthi $1
 | |
| ; 32-NEXT:    maddu $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: madd2:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $5, $4
 | |
| ; 32R6-NEXT:    addu $3, $1, $6
 | |
| ; 32R6-NEXT:    sltu $1, $3, $1
 | |
| ; 32R6-NEXT:    muhu $2, $5, $4
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    addu $2, $2, $1
 | |
| ;
 | |
| ; DSP-LABEL: madd2:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    addiu $1, $zero, 0
 | |
| ; DSP-NEXT:    mtlo $6, $ac0
 | |
| ; DSP-NEXT:    mthi $1, $ac0
 | |
| ; DSP-NEXT:    maddu $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: madd2:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    dmult $5, $4
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    daddu $2, $1, $6
 | |
| ;
 | |
| ; 64R6-LABEL: madd2:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    dmul $1, $5, $4
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    daddu $2, $1, $6
 | |
| ;
 | |
| ; 16-LABEL: madd2:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    multu $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $4
 | |
| ; 16-NEXT:    addu $3, $2, $6
 | |
| ; 16-NEXT:    sltu $3, $2
 | |
| ; 16-NEXT:    move $2, $24
 | |
| ; 16-NEXT:    addu $2, $4, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = zext i32 %a to i64
 | |
|   %conv2 = zext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv2, %conv
 | |
|   %conv4 = zext i32 %c to i64
 | |
|   %add = add nsw i64 %mul, %conv4
 | |
|   ret i64 %add
 | |
| }
 | |
| 
 | |
| define i64 @madd3(i32 %a, i32 %b, i64 %c) nounwind readnone {
 | |
| ; 32-LABEL: madd3:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    mtlo $7
 | |
| ; 32-NEXT:    mthi $6
 | |
| ; 32-NEXT:    madd $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: madd3:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $5, $4
 | |
| ; 32R6-NEXT:    addu $3, $1, $7
 | |
| ; 32R6-NEXT:    sltu $1, $3, $1
 | |
| ; 32R6-NEXT:    muh $2, $5, $4
 | |
| ; 32R6-NEXT:    addu $2, $2, $6
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    addu $2, $2, $1
 | |
| ;
 | |
| ; DSP-LABEL: madd3:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    mtlo $7, $ac0
 | |
| ; DSP-NEXT:    mthi $6, $ac0
 | |
| ; DSP-NEXT:    madd $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: madd3:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $4, 0
 | |
| ; 64-NEXT:    sll $2, $5, 0
 | |
| ; 64-NEXT:    dmult $2, $1
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    daddu $2, $1, $6
 | |
| ;
 | |
| ; 64R6-LABEL: madd3:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $4, 0
 | |
| ; 64R6-NEXT:    sll $2, $5, 0
 | |
| ; 64R6-NEXT:    dmul $1, $2, $1
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    daddu $2, $1, $6
 | |
| ;
 | |
| ; 16-LABEL: madd3:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $3
 | |
| ; 16-NEXT:    addu $4, $3, $6
 | |
| ; 16-NEXT:    addu $3, $2, $7
 | |
| ; 16-NEXT:    sltu $3, $2
 | |
| ; 16-NEXT:    move $2, $24
 | |
| ; 16-NEXT:    addu $2, $4, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = sext i32 %a to i64
 | |
|   %conv2 = sext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv2, %conv
 | |
|   %add = add nsw i64 %mul, %c
 | |
|   ret i64 %add
 | |
| }
 | |
| 
 | |
| define i32 @madd4(i32 %a, i32 %b, i32 %c) {
 | |
| ; 32-LABEL: madd4:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    mul $1, $4, $5
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    addu $2, $6, $1
 | |
| ;
 | |
| ; 32R6-LABEL: madd4:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $4, $5
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    addu $2, $6, $1
 | |
| ;
 | |
| ; DSP-LABEL: madd4:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    mul $1, $4, $5
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    addu $2, $6, $1
 | |
| ;
 | |
| ; 64-LABEL: madd4:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $5, 0
 | |
| ; 64-NEXT:    sll $2, $4, 0
 | |
| ; 64-NEXT:    mul $1, $2, $1
 | |
| ; 64-NEXT:    sll $2, $6, 0
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    addu $2, $2, $1
 | |
| ;
 | |
| ; 64R6-LABEL: madd4:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $5, 0
 | |
| ; 64R6-NEXT:    sll $2, $4, 0
 | |
| ; 64R6-NEXT:    mul $1, $2, $1
 | |
| ; 64R6-NEXT:    sll $2, $6, 0
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    addu $2, $2, $1
 | |
| ;
 | |
| ; 16-LABEL: madd4:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $4, $5
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    addu $2, $6, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %mul = mul nsw i32 %a, %b
 | |
|   %add = add nsw i32 %c, %mul
 | |
| 
 | |
|   ret i32 %add
 | |
| }
 | |
| 
 | |
| define i64 @msub1(i32 %a, i32 %b, i32 %c) nounwind readnone {
 | |
| ; 32-LABEL: msub1:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    sra $1, $6, 31
 | |
| ; 32-NEXT:    mtlo $6
 | |
| ; 32-NEXT:    mthi $1
 | |
| ; 32-NEXT:    msub $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: msub1:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $5, $4
 | |
| ; 32R6-NEXT:    sltu $2, $6, $1
 | |
| ; 32R6-NEXT:    muh $3, $5, $4
 | |
| ; 32R6-NEXT:    sra $4, $6, 31
 | |
| ; 32R6-NEXT:    subu $3, $4, $3
 | |
| ; 32R6-NEXT:    subu $2, $3, $2
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    subu $3, $6, $1
 | |
| ;
 | |
| ; DSP-LABEL: msub1:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    sra $1, $6, 31
 | |
| ; DSP-NEXT:    mtlo $6, $ac0
 | |
| ; DSP-NEXT:    mthi $1, $ac0
 | |
| ; DSP-NEXT:    msub $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: msub1:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $4, 0
 | |
| ; 64-NEXT:    sll $2, $5, 0
 | |
| ; 64-NEXT:    dmult $2, $1
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    sll $2, $6, 0
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    dsubu $2, $2, $1
 | |
| ;
 | |
| ; 64R6-LABEL: msub1:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $4, 0
 | |
| ; 64R6-NEXT:    sll $2, $5, 0
 | |
| ; 64R6-NEXT:    dmul $1, $2, $1
 | |
| ; 64R6-NEXT:    sll $2, $6, 0
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    dsubu $2, $2, $1
 | |
| ;
 | |
| ; 16-LABEL: msub1:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $4
 | |
| ; 16-NEXT:    subu $3, $6, $2
 | |
| ; 16-NEXT:    sltu $6, $2
 | |
| ; 16-NEXT:    move $2, $24
 | |
| ; 16-NEXT:    sra $5, $6, 31
 | |
| ; 16-NEXT:    subu $4, $5, $4
 | |
| ; 16-NEXT:    subu $2, $4, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = sext i32 %c to i64
 | |
|   %conv2 = sext i32 %a to i64
 | |
|   %conv4 = sext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv4, %conv2
 | |
|   %sub = sub nsw i64 %conv, %mul
 | |
|   ret i64 %sub
 | |
| }
 | |
| 
 | |
| define i64 @msub2(i32 zeroext %a, i32 zeroext %b, i32 zeroext %c) nounwind readnone {
 | |
| ; 32-LABEL: msub2:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    addiu $1, $zero, 0
 | |
| ; 32-NEXT:    mtlo $6
 | |
| ; 32-NEXT:    mthi $1
 | |
| ; 32-NEXT:    msubu $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: msub2:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    muhu $1, $5, $4
 | |
| ; 32R6-NEXT:    mul $3, $5, $4
 | |
| ; 32R6-NEXT:    sltu $2, $6, $3
 | |
| ; 32R6-NEXT:    addu $1, $1, $2
 | |
| ; 32R6-NEXT:    negu $2, $1
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    subu $3, $6, $3
 | |
| ;
 | |
| ; DSP-LABEL: msub2:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    addiu $1, $zero, 0
 | |
| ; DSP-NEXT:    mtlo $6, $ac0
 | |
| ; DSP-NEXT:    mthi $1, $ac0
 | |
| ; DSP-NEXT:    msubu $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: msub2:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    dmult $5, $4
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    dsubu $2, $6, $1
 | |
| ;
 | |
| ; 64R6-LABEL: msub2:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    dmul $1, $5, $4
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    dsubu $2, $6, $1
 | |
| ;
 | |
| ; 16-LABEL: msub2:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    multu $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $3
 | |
| ; 16-NEXT:    sltu $6, $2
 | |
| ; 16-NEXT:    move $4, $24
 | |
| ; 16-NEXT:    addu $4, $3, $4
 | |
| ; 16-NEXT:    subu $3, $6, $2
 | |
| ; 16-NEXT:    neg $2, $4
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = zext i32 %c to i64
 | |
|   %conv2 = zext i32 %a to i64
 | |
|   %conv4 = zext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv4, %conv2
 | |
|   %sub = sub nsw i64 %conv, %mul
 | |
|   ret i64 %sub
 | |
| }
 | |
| 
 | |
| define i64 @msub3(i32 %a, i32 %b, i64 %c) nounwind readnone {
 | |
| ; 32-LABEL: msub3:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    mtlo $7
 | |
| ; 32-NEXT:    mthi $6
 | |
| ; 32-NEXT:    msub $5, $4
 | |
| ; 32-NEXT:    mfhi $2
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    mflo $3
 | |
| ;
 | |
| ; 32R6-LABEL: msub3:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $5, $4
 | |
| ; 32R6-NEXT:    sltu $2, $7, $1
 | |
| ; 32R6-NEXT:    muh $3, $5, $4
 | |
| ; 32R6-NEXT:    subu $3, $6, $3
 | |
| ; 32R6-NEXT:    subu $2, $3, $2
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    subu $3, $7, $1
 | |
| ;
 | |
| ; DSP-LABEL: msub3:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    mtlo $7, $ac0
 | |
| ; DSP-NEXT:    mthi $6, $ac0
 | |
| ; DSP-NEXT:    msub $ac0, $5, $4
 | |
| ; DSP-NEXT:    mfhi $2, $ac0
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    mflo $3, $ac0
 | |
| ;
 | |
| ; 64-LABEL: msub3:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $4, 0
 | |
| ; 64-NEXT:    sll $2, $5, 0
 | |
| ; 64-NEXT:    dmult $2, $1
 | |
| ; 64-NEXT:    mflo $1
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    dsubu $2, $6, $1
 | |
| ;
 | |
| ; 64R6-LABEL: msub3:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $4, 0
 | |
| ; 64R6-NEXT:    sll $2, $5, 0
 | |
| ; 64R6-NEXT:    dmul $1, $2, $1
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    dsubu $2, $6, $1
 | |
| ;
 | |
| ; 16-LABEL: msub3:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $5, $4
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    mfhi $4
 | |
| ; 16-NEXT:    subu $3, $7, $2
 | |
| ; 16-NEXT:    sltu $7, $2
 | |
| ; 16-NEXT:    move $2, $24
 | |
| ; 16-NEXT:    subu $4, $6, $4
 | |
| ; 16-NEXT:    subu $2, $4, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %conv = sext i32 %a to i64
 | |
|   %conv3 = sext i32 %b to i64
 | |
|   %mul = mul nsw i64 %conv3, %conv
 | |
|   %sub = sub nsw i64 %c, %mul
 | |
|   ret i64 %sub
 | |
| }
 | |
| 
 | |
| define i32 @msub4(i32 %a, i32 %b, i32 %c) {
 | |
| ; 32-LABEL: msub4:
 | |
| ; 32:       # %bb.0: # %entry
 | |
| ; 32-NEXT:    mul $1, $4, $5
 | |
| ; 32-NEXT:    jr $ra
 | |
| ; 32-NEXT:    subu $2, $6, $1
 | |
| ;
 | |
| ; 32R6-LABEL: msub4:
 | |
| ; 32R6:       # %bb.0: # %entry
 | |
| ; 32R6-NEXT:    mul $1, $4, $5
 | |
| ; 32R6-NEXT:    jr $ra
 | |
| ; 32R6-NEXT:    subu $2, $6, $1
 | |
| ;
 | |
| ; DSP-LABEL: msub4:
 | |
| ; DSP:       # %bb.0: # %entry
 | |
| ; DSP-NEXT:    mul $1, $4, $5
 | |
| ; DSP-NEXT:    jr $ra
 | |
| ; DSP-NEXT:    subu $2, $6, $1
 | |
| ;
 | |
| ; 64-LABEL: msub4:
 | |
| ; 64:       # %bb.0: # %entry
 | |
| ; 64-NEXT:    sll $1, $5, 0
 | |
| ; 64-NEXT:    sll $2, $4, 0
 | |
| ; 64-NEXT:    mul $1, $2, $1
 | |
| ; 64-NEXT:    sll $2, $6, 0
 | |
| ; 64-NEXT:    jr $ra
 | |
| ; 64-NEXT:    subu $2, $2, $1
 | |
| ;
 | |
| ; 64R6-LABEL: msub4:
 | |
| ; 64R6:       # %bb.0: # %entry
 | |
| ; 64R6-NEXT:    sll $1, $5, 0
 | |
| ; 64R6-NEXT:    sll $2, $4, 0
 | |
| ; 64R6-NEXT:    mul $1, $2, $1
 | |
| ; 64R6-NEXT:    sll $2, $6, 0
 | |
| ; 64R6-NEXT:    jr $ra
 | |
| ; 64R6-NEXT:    subu $2, $2, $1
 | |
| ;
 | |
| ; 16-LABEL: msub4:
 | |
| ; 16:       # %bb.0: # %entry
 | |
| ; 16-NEXT:    mult $4, $5
 | |
| ; 16-NEXT:    mflo $2
 | |
| ; 16-NEXT:    subu $2, $6, $2
 | |
| ; 16-NEXT:    jrc $ra
 | |
| entry:
 | |
|   %mul = mul nsw i32 %a, %b
 | |
|   %sub = sub nsw i32 %c, %mul
 | |
| 
 | |
|   ret i32 %sub
 | |
| }
 |