| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 6 | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64 -verify-machineinstrs -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,ACC64,ACC64-TRAP | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r2 -verify-machineinstrs -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,ACC64,ACC64-TRAP | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64 -mno-check-zero-division -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,ACC64,NOCHECK | |
| ; RUN: llc -mtriple=mips64 -mcpu=mips64r2 -mno-check-zero-division -relocation-model=pic < %s | FileCheck %s -check-prefixes=ALL,ACC64,NOCHECK | |
| ; FileCheck Prefixes: | |
| ; ALL - All targets | |
| ; ACC64 - Same as ACC32 but only for 64-bit targets | |
| ; GPR64 - Same as GPR32 but only for 64-bit targets | |
| ; ACC64-TRAP - Same as TRAP and ACC64 combined | |
| ; GPR64-TRAP - Same as TRAP and GPR64 combined | |
| ; NOCHECK - Division by zero will not be detected | |
| define i32 @inline_asm_div() { | |
| ; ACC64-TRAP-LABEL: inline_asm_div: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: addiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: addiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: div $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bnez $3, .Ltmp0 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp0: | |
| ; ACC64-TRAP-NEXT: mflo $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_div: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: addiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: addiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: div $zero, $2, $3 | |
| ; NOCHECK-NEXT: mflo $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i32 asm sideeffect "div $0, $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i32 2, i32 1) | |
| ret i32 %0 | |
| } | |
| define i32 @inline_asm_rem() { | |
| ; ACC64-TRAP-LABEL: inline_asm_rem: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: addiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: addiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: div $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bnez $3, .Ltmp1 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp1: | |
| ; ACC64-TRAP-NEXT: mfhi $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_rem: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: addiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: addiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: div $zero, $2, $3 | |
| ; NOCHECK-NEXT: mfhi $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i32 asm sideeffect "rem $0, $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i32 2, i32 1) | |
| ret i32 %0 | |
| } | |
| define i64 @inline_asm_ddiv() { | |
| ; ACC64-TRAP-LABEL: inline_asm_ddiv: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: daddiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: daddiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: ddiv $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bne $3, $zero, .Ltmp2 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp2: | |
| ; ACC64-TRAP-NEXT: mflo $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_ddiv: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: daddiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: daddiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: ddiv $zero, $2, $3 | |
| ; NOCHECK-NEXT: mflo $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i64 asm sideeffect "ddiv $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i64 2, i64 1) | |
| ret i64 %0 | |
| } | |
| define i64 @inline_asm_drem() { | |
| ; ACC64-TRAP-LABEL: inline_asm_drem: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: daddiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: daddiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: ddiv $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bne $3, $zero, .Ltmp3 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp3: | |
| ; ACC64-TRAP-NEXT: mfhi $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_drem: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: daddiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: daddiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: ddiv $zero, $2, $3 | |
| ; NOCHECK-NEXT: mfhi $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i64 asm sideeffect "drem $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i64 2, i64 1) | |
| ret i64 %0 | |
| } | |
| define i32 @inline_asm_divu() { | |
| ; ACC64-TRAP-LABEL: inline_asm_divu: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: addiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: addiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: divu $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bnez $3, .Ltmp4 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp4: | |
| ; ACC64-TRAP-NEXT: mflo $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_divu: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: addiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: addiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: divu $zero, $2, $3 | |
| ; NOCHECK-NEXT: mflo $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i32 asm sideeffect "divu $0, $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i32 2, i32 1) | |
| ret i32 %0 | |
| } | |
| define i32 @inline_asm_remu() { | |
| ; ACC64-TRAP-LABEL: inline_asm_remu: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: addiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: addiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: divu $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bnez $3, .Ltmp5 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp5: | |
| ; ACC64-TRAP-NEXT: mfhi $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_remu: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: addiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: addiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: divu $zero, $2, $3 | |
| ; NOCHECK-NEXT: mfhi $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i32 asm sideeffect "remu $0, $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i32 2, i32 1) | |
| ret i32 %0 | |
| } | |
| define i64 @inline_asm_ddivu() { | |
| ; ACC64-TRAP-LABEL: inline_asm_ddivu: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: daddiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: daddiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: ddivu $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bne $3, $zero, .Ltmp6 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp6: | |
| ; ACC64-TRAP-NEXT: mflo $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_ddivu: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: daddiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: daddiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: ddivu $zero, $2, $3 | |
| ; NOCHECK-NEXT: mflo $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i64 asm sideeffect "ddivu $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i64 2, i64 1) | |
| ret i64 %0 | |
| } | |
| define i64 @inline_asm_dremu() { | |
| ; ACC64-TRAP-LABEL: inline_asm_dremu: | |
| ; ACC64-TRAP: # %bb.0: # %entry | |
| ; ACC64-TRAP-NEXT: daddiu $2, $zero, 2 | |
| ; ACC64-TRAP-NEXT: daddiu $3, $zero, 1 | |
| ; ACC64-TRAP-NEXT: #APP | |
| ; ACC64-TRAP-NEXT: .set push | |
| ; ACC64-TRAP-NEXT: .set at | |
| ; ACC64-TRAP-NEXT: .set macro | |
| ; ACC64-TRAP-NEXT: .set reorder | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: ddivu $zero, $2, $3 | |
| ; ACC64-TRAP-NEXT: bne $3, $zero, .Ltmp7 | |
| ; ACC64-TRAP-NEXT: nop | |
| ; ACC64-TRAP-NEXT: break 7 | |
| ; ACC64-TRAP-NEXT: .Ltmp7: | |
| ; ACC64-TRAP-NEXT: mfhi $2 | |
| ; ACC64-TRAP-EMPTY: | |
| ; ACC64-TRAP-NEXT: .set pop | |
| ; ACC64-TRAP-NEXT: #NO_APP | |
| ; ACC64-TRAP-NEXT: jr $ra | |
| ; ACC64-TRAP-NEXT: nop | |
| ; | |
| ; NOCHECK-LABEL: inline_asm_dremu: | |
| ; NOCHECK: # %bb.0: # %entry | |
| ; NOCHECK-NEXT: daddiu $2, $zero, 2 | |
| ; NOCHECK-NEXT: daddiu $3, $zero, 1 | |
| ; NOCHECK-NEXT: #APP | |
| ; NOCHECK-NEXT: .set push | |
| ; NOCHECK-NEXT: .set at | |
| ; NOCHECK-NEXT: .set macro | |
| ; NOCHECK-NEXT: .set reorder | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: ddivu $zero, $2, $3 | |
| ; NOCHECK-NEXT: mfhi $2 | |
| ; NOCHECK-EMPTY: | |
| ; NOCHECK-NEXT: .set pop | |
| ; NOCHECK-NEXT: #NO_APP | |
| ; NOCHECK-NEXT: jr $ra | |
| ; NOCHECK-NEXT: nop | |
| entry: | |
| %0 = tail call i64 asm sideeffect "dremu $1, $2", "=r,r,r,~{hi},~{lo},~{$1}"(i64 2, i64 1) | |
| ret i64 %0 | |
| } | |
| ;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line: | |
| ; ACC64: {{.*}} | |
| ; ALL: {{.*}} |