; Show that we can translate IR instruction "trap".

; REQUIRES: allow_dump

; Compile using standalone assembler.
; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -Om1 \
; RUN:   | FileCheck %s --check-prefix=ASM

; Show bytes in assembled standalone code.
; RUN: %p2i --filetype=asm -i %s --target=arm32 --assemble --disassemble \
; RUN:   --args -Om1 \
; RUN:   | FileCheck %s --check-prefix=DIS

; Compile using integrated assembler.
; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -Om1 \
; RUN:   | FileCheck %s --check-prefix=IASM

; Show bytes in assembled integrated code.
; RUN: %p2i --filetype=iasm -i %s --target=arm32 --assemble --disassemble \
; RUN:   --args -Om1 \
; RUN:   | FileCheck %s --check-prefix=DIS

; testUnreachable generates a trap for the unreachable instruction.

define internal void @testUnreachable() {
; ASM-LABEL: testUnreachable:
; DIS-LABEL: 00000000 <testUnreachable>:

  unreachable

; ASM:  .long 0xe7fedef0
; DIS-NEXT:    0:       e7fedef0
; IASM-NOT:     .long 0xe7fedef0
}

; testTrap uses integer division to test this, since a trap is
; inserted if one divides by zero.

define internal i32 @testTrap(i32 %v1, i32 %v2) {
; ASM-LABEL: testTrap:
; DIS-LABEL: 00000010 <testTrap>:
; IASM-LABEL: testTrap:

  %res = udiv i32 %v1, %v2

; ASM:          bne
; DIS:  28:     1a000000
; IASM-NOT:     bne

; ASM-NEXT:     .long 0xe7fedef0
; DIS-NEXT:  2c:        e7fedef0
; IASM-NOT:     .long 0xe7fedef0

  ret i32 %res
}