blob: 019854aebf7cee3bece98134c183cacf05cb0c14 [file] [log] [blame] [edit]
; 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: {{.*}}