| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc < %s -mtriple=aarch64 -global-isel=0 -mattr=+v8.2a,+fullfp16 | FileCheck %s |
| |
| ; Test f16 -> i16 NEON intrinics, currently only supported in SDAG. |
| ; Should be merged with fp16_intrinsic_scalar_1op.ll once there is |
| ; support in GlSel. |
| |
| declare i16 @llvm.aarch64.neon.fcvtzs.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtzu.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtas.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtau.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtms.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtmu.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtns.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtnu.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtps.i16.f16(half) |
| declare i16 @llvm.aarch64.neon.fcvtpu.i16.f16(half) |
| |
| |
| define i16 @fcvtzs_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtzs_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtzs.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtzu_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtzu_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzu h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtzu.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtas_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtas_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtas h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtas.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtau_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtau_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtau h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtau.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtms_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtms_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtms h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtms.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtmu_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtmu_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtmu h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtmu.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtns_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtns_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtns h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtns.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtnu_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtnu_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtnu h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtnu.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtps_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtps_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtps h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtps.i16.f16(half %a) |
| ret i16 %fcvt |
| } |
| |
| define i16 @fcvtpu_intrinsic_i16(half %a) { |
| ; CHECK-LABEL: fcvtpu_intrinsic_i16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtpu h0, h0 |
| ; CHECK-NEXT: fmov w0, s0 |
| ; CHECK-NEXT: ret |
| entry: |
| %fcvt = tail call i16 @llvm.aarch64.neon.fcvtpu.i16.f16(half %a) |
| ret i16 %fcvt |
| } |