
This reverts commit 9c319d5bb40785c969d2af76535ca62448dfafa7. Some issues were discovered with the bootstrap builds, which seem like they were caused by this commit. I'm reverting to investigate.
126 lines
3.3 KiB
LLVM
126 lines
3.3 KiB
LLVM
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
|
|
; RUN: llc < %s -mtriple=aarch64-- | FileCheck %s
|
|
|
|
define void @test_load_store(ptr %in, ptr %out) {
|
|
; CHECK-LABEL: test_load_store:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ldr h0, [x0]
|
|
; CHECK-NEXT: str h0, [x1]
|
|
; CHECK-NEXT: ret
|
|
%val = load half, ptr %in
|
|
store half %val, ptr %out
|
|
ret void
|
|
}
|
|
|
|
define i16 @test_bitcast_from_half(ptr %addr) {
|
|
; CHECK-LABEL: test_bitcast_from_half:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ldrh w0, [x0]
|
|
; CHECK-NEXT: ret
|
|
%val = load half, ptr %addr
|
|
%val_int = bitcast half %val to i16
|
|
ret i16 %val_int
|
|
}
|
|
|
|
define i16 @test_reg_bitcast_from_half(half %in) {
|
|
; CHECK-LABEL: test_reg_bitcast_from_half:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 def $s0
|
|
; CHECK-NEXT: fmov w0, s0
|
|
; CHECK-NEXT: ret
|
|
%val = bitcast half %in to i16
|
|
ret i16 %val
|
|
}
|
|
|
|
define void @test_bitcast_to_half(ptr %addr, i16 %in) {
|
|
; CHECK-LABEL: test_bitcast_to_half:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: strh w1, [x0]
|
|
; CHECK-NEXT: ret
|
|
%val_fp = bitcast i16 %in to half
|
|
store half %val_fp, ptr %addr
|
|
ret void
|
|
}
|
|
|
|
define half @test_reg_bitcast_to_half(i16 %in) {
|
|
; CHECK-LABEL: test_reg_bitcast_to_half:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: fmov s0, w0
|
|
; CHECK-NEXT: // kill: def $h0 killed $h0 killed $s0
|
|
; CHECK-NEXT: ret
|
|
%val = bitcast i16 %in to half
|
|
ret half %val
|
|
}
|
|
|
|
define float @test_extend32(ptr %addr) {
|
|
; CHECK-LABEL: test_extend32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ldr h0, [x0]
|
|
; CHECK-NEXT: fcvt s0, h0
|
|
; CHECK-NEXT: ret
|
|
%val16 = load half, ptr %addr
|
|
%val32 = fpext half %val16 to float
|
|
ret float %val32
|
|
}
|
|
|
|
define double @test_extend64(ptr %addr) {
|
|
; CHECK-LABEL: test_extend64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: ldr h0, [x0]
|
|
; CHECK-NEXT: fcvt d0, h0
|
|
; CHECK-NEXT: ret
|
|
%val16 = load half, ptr %addr
|
|
%val32 = fpext half %val16 to double
|
|
ret double %val32
|
|
}
|
|
|
|
define void @test_trunc32(float %in, ptr %addr) {
|
|
; CHECK-LABEL: test_trunc32:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: fcvt h0, s0
|
|
; CHECK-NEXT: str h0, [x0]
|
|
; CHECK-NEXT: ret
|
|
%val16 = fptrunc float %in to half
|
|
store half %val16, ptr %addr
|
|
ret void
|
|
}
|
|
|
|
define void @test_trunc64(double %in, ptr %addr) {
|
|
; CHECK-LABEL: test_trunc64:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: fcvt h0, d0
|
|
; CHECK-NEXT: str h0, [x0]
|
|
; CHECK-NEXT: ret
|
|
%val16 = fptrunc double %in to half
|
|
store half %val16, ptr %addr
|
|
ret void
|
|
}
|
|
|
|
define i16 @test_fccmp(i1 %a, i16 %in) {
|
|
; CHECK-LABEL: test_fccmp:
|
|
; CHECK: // %bb.0:
|
|
; CHECK-NEXT: fmov s0, w1
|
|
; CHECK-NEXT: mov w8, #24576 // =0x6000
|
|
; CHECK-NEXT: movk w8, #15974, lsl #16
|
|
; CHECK-NEXT: fmov s1, w8
|
|
; CHECK-NEXT: mov w8, #16384 // =0x4000
|
|
; CHECK-NEXT: fcvt s0, h0
|
|
; CHECK-NEXT: movk w8, #15428, lsl #16
|
|
; CHECK-NEXT: fmov s2, w8
|
|
; CHECK-NEXT: mov w8, #4 // =0x4
|
|
; CHECK-NEXT: fcmp s0, s1
|
|
; CHECK-NEXT: fccmp s0, s2, #8, pl
|
|
; CHECK-NEXT: csinc w8, w8, wzr, mi
|
|
; CHECK-NEXT: fcmp s0, s1
|
|
; CHECK-NEXT: cinc w0, w8, pl
|
|
; CHECK-NEXT: ret
|
|
%f16 = bitcast i16 %in to half
|
|
%cmp0 = fcmp ogt half 0xH3333, %f16
|
|
%cmp1 = fcmp ogt half 0xH2222, %f16
|
|
%x = select i1 %cmp0, i16 0, i16 1
|
|
%or = or i1 %cmp1, %cmp0
|
|
%y = select i1 %or, i16 4, i16 1
|
|
%r = add i16 %x, %y
|
|
ret i16 %r
|
|
}
|