; Show that we know how to translate vadd.

; NOTE: Restricts S and D registers to ones that will better test S/D
; register encodings.

; REQUIRES: allow_dump

; Compile using standalone assembler.
; RUN: %p2i --filetype=asm -i %s --target=arm32 --args -Om1 \
; RUN:   -reg-use s20,s22,d20,d22 \
; 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:   -reg-use s20,s22,d20,d22 \
; RUN:   | FileCheck %s --check-prefix=DIS

; Compile using integrated assembler.
; RUN: %p2i --filetype=iasm -i %s --target=arm32 --args -Om1 \
; RUN:   -reg-use s20,s22,d20,d22 \
; 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:   -reg-use s20,s22,d20,d22 \
; RUN:   | FileCheck %s --check-prefix=DIS

define internal float @testVaddFloat(float %v1, float %v2) {
; ASM-LABEL: testVaddFloat:
; DIS-LABEL: 00000000 <testVaddFloat>:
; IASM-LABEL: testVaddFloat:

entry:
  %res = fadd float %v1, %v2

; ASM:     vadd.f32        s20, s20, s22
; DIS:   1c:       ee3aaa0b
; IASM-NOT:     vadd

  ret float %res
}

define internal double @testVaddDouble(double %v1, double %v2) {
; ASM-LABEL: testVaddDouble:
; DIS-LABEL: 00000040 <testVaddDouble>:
; IASM-LABEL: .LtestVaddDouble$entry:

entry:
  %res = fadd double %v1, %v2

; ASM:        vadd.f64        d20, d20, d22
; DIS:      54:       ee744ba6
; IASM-NOT:   vadd

  ret double %res
}