| ; 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: {{.*}} |