diff --git a/llvm/lib/Target/AArch64/AArch64InstrFormats.td b/llvm/lib/Target/AArch64/AArch64InstrFormats.td index 78d683a4b4256..f07d3514d1a99 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrFormats.td +++ b/llvm/lib/Target/AArch64/AArch64InstrFormats.td @@ -5301,28 +5301,29 @@ multiclass FPToIntegerUnscaled rmode, bits<3> opcode, string asm, } } -multiclass FPToIntegerSIMDScalar rmode, bits<3> opcode, string asm> { +multiclass FPToIntegerSIMDScalar rmode, bits<3> opcode, string asm, + SDPatternOperator OpN = null_frag> { // double-precision to 32-bit SIMD/FPR def SDr : BaseFPToIntegerUnscaled<0b01, rmode, opcode, FPR64, FPR32, asm, - []> { + [(set FPR32:$Rd, (i32 (OpN (f64 FPR64:$Rn))))]> { let Inst{31} = 0; // 32-bit FPR flag } // half-precision to 32-bit SIMD/FPR def SHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, FPR32, asm, - []> { + [(set FPR32:$Rd, (i32 (OpN (f16 FPR16:$Rn))))]> { let Inst{31} = 0; // 32-bit FPR flag } // half-precision to 64-bit SIMD/FPR def DHr : BaseFPToIntegerUnscaled<0b11, rmode, opcode, FPR16, FPR64, asm, - []> { + [(set FPR64:$Rd, (i64 (OpN (f16 FPR16:$Rn))))]> { let Inst{31} = 1; // 64-bit FPR flag } // single-precision to 64-bit SIMD/FPR def DSr : BaseFPToIntegerUnscaled<0b00, rmode, opcode, FPR32, FPR64, asm, - []> { + [(set FPR64:$Rd, (i64 (OpN (f32 FPR32:$Rn))))]> { let Inst{31} = 1; // 64-bit FPR flag } } @@ -7940,14 +7941,18 @@ multiclass SIMDTwoScalarD opc, string asm, } } -let mayRaiseFPException = 1, Uses = [FPCR] in -multiclass SIMDFPTwoScalar opc, string asm> { +let mayRaiseFPException = 1, Uses = [FPCR], FastISelShouldIgnore = 1 in +multiclass SIMDFPTwoScalar opc, string asm, + SDPatternOperator OpN = null_frag> { let Predicates = [HasNEONandIsStreamingSafe] in { - def v1i64 : BaseSIMDTwoScalar; - def v1i32 : BaseSIMDTwoScalar; + def v1i64 : BaseSIMDTwoScalar; + def v1i32 : BaseSIMDTwoScalar; } let Predicates = [HasNEONandIsStreamingSafe, HasFullFP16] in { - def v1f16 : BaseSIMDTwoScalar; + def v1f16 : BaseSIMDTwoScalar; } } diff --git a/llvm/lib/Target/AArch64/AArch64InstrInfo.td b/llvm/lib/Target/AArch64/AArch64InstrInfo.td index 980636c1b562b..04b3c90c2e177 100644 --- a/llvm/lib/Target/AArch64/AArch64InstrInfo.td +++ b/llvm/lib/Target/AArch64/AArch64InstrInfo.td @@ -5231,18 +5231,19 @@ defm FCVTZS : FPToIntegerScaled<0b11, 0b000, "fcvtzs", any_fp_to_sint>; defm FCVTZU : FPToIntegerScaled<0b11, 0b001, "fcvtzu", any_fp_to_uint>; let Predicates = [HasNEON, HasFPRCVT] in{ - defm FCVTAS : FPToIntegerSIMDScalar<0b11, 0b010, "fcvtas">; - defm FCVTAU : FPToIntegerSIMDScalar<0b11, 0b011, "fcvtau">; - defm FCVTMS : FPToIntegerSIMDScalar<0b10, 0b100, "fcvtms">; - defm FCVTMU : FPToIntegerSIMDScalar<0b10, 0b101, "fcvtmu">; - defm FCVTNS : FPToIntegerSIMDScalar<0b01, 0b010, "fcvtns">; - defm FCVTNU : FPToIntegerSIMDScalar<0b01, 0b011, "fcvtnu">; - defm FCVTPS : FPToIntegerSIMDScalar<0b10, 0b010, "fcvtps">; - defm FCVTPU : FPToIntegerSIMDScalar<0b10, 0b011, "fcvtpu">; + defm FCVTAS : FPToIntegerSIMDScalar<0b11, 0b010, "fcvtas", int_aarch64_neon_fcvtas>; + defm FCVTAU : FPToIntegerSIMDScalar<0b11, 0b011, "fcvtau", int_aarch64_neon_fcvtau>; + defm FCVTMS : FPToIntegerSIMDScalar<0b10, 0b100, "fcvtms", int_aarch64_neon_fcvtms>; + defm FCVTMU : FPToIntegerSIMDScalar<0b10, 0b101, "fcvtmu", int_aarch64_neon_fcvtmu>; + defm FCVTNS : FPToIntegerSIMDScalar<0b01, 0b010, "fcvtns", int_aarch64_neon_fcvtns>; + defm FCVTNU : FPToIntegerSIMDScalar<0b01, 0b011, "fcvtnu", int_aarch64_neon_fcvtnu>; + defm FCVTPS : FPToIntegerSIMDScalar<0b10, 0b010, "fcvtps", int_aarch64_neon_fcvtps>; + defm FCVTPU : FPToIntegerSIMDScalar<0b10, 0b011, "fcvtpu", int_aarch64_neon_fcvtpu>; defm FCVTZS : FPToIntegerSIMDScalar<0b10, 0b110, "fcvtzs">; defm FCVTZU : FPToIntegerSIMDScalar<0b10, 0b111, "fcvtzu">; } + // AArch64's FCVT instructions saturate when out of range. multiclass FPToIntegerSatPats { let Predicates = [HasFullFP16] in { @@ -5309,35 +5310,6 @@ multiclass FPToIntegerSatPats; defm : FPToIntegerSatPats; -multiclass FPToIntegerIntPats { - let Predicates = [HasFullFP16] in { - def : Pat<(i32 (round f16:$Rn)), (!cast(INST # UWHr) $Rn)>; - def : Pat<(i64 (round f16:$Rn)), (!cast(INST # UXHr) $Rn)>; - } - def : Pat<(i32 (round f32:$Rn)), (!cast(INST # UWSr) $Rn)>; - def : Pat<(i64 (round f32:$Rn)), (!cast(INST # UXSr) $Rn)>; - def : Pat<(i32 (round f64:$Rn)), (!cast(INST # UWDr) $Rn)>; - def : Pat<(i64 (round f64:$Rn)), (!cast(INST # UXDr) $Rn)>; - - let Predicates = [HasFullFP16] in { - def : Pat<(i32 (round (fmul f16:$Rn, fixedpoint_f16_i32:$scale))), - (!cast(INST # SWHri) $Rn, $scale)>; - def : Pat<(i64 (round (fmul f16:$Rn, fixedpoint_f16_i64:$scale))), - (!cast(INST # SXHri) $Rn, $scale)>; - } - def : Pat<(i32 (round (fmul f32:$Rn, fixedpoint_f32_i32:$scale))), - (!cast(INST # SWSri) $Rn, $scale)>; - def : Pat<(i64 (round (fmul f32:$Rn, fixedpoint_f32_i64:$scale))), - (!cast(INST # SXSri) $Rn, $scale)>; - def : Pat<(i32 (round (fmul f64:$Rn, fixedpoint_f64_i32:$scale))), - (!cast(INST # SWDri) $Rn, $scale)>; - def : Pat<(i64 (round (fmul f64:$Rn, fixedpoint_f64_i64:$scale))), - (!cast(INST # SXDri) $Rn, $scale)>; -} - -defm : FPToIntegerIntPats; -defm : FPToIntegerIntPats; - multiclass FPToIntegerPats { def : Pat<(i32 (to_int (round f32:$Rn))), (!cast(INST # UWSr) f32:$Rn)>; @@ -6572,14 +6544,14 @@ defm FCMGE : SIMDFPCmpTwoScalar<1, 1, 0b01100, "fcmge", AArch64fcmgez>; defm FCMGT : SIMDFPCmpTwoScalar<0, 1, 0b01100, "fcmgt", AArch64fcmgtz>; defm FCMLE : SIMDFPCmpTwoScalar<1, 1, 0b01101, "fcmle", AArch64fcmlez>; defm FCMLT : SIMDFPCmpTwoScalar<0, 1, 0b01110, "fcmlt", AArch64fcmltz>; -defm FCVTAS : SIMDFPTwoScalar< 0, 0, 0b11100, "fcvtas">; -defm FCVTAU : SIMDFPTwoScalar< 1, 0, 0b11100, "fcvtau">; -defm FCVTMS : SIMDFPTwoScalar< 0, 0, 0b11011, "fcvtms">; -defm FCVTMU : SIMDFPTwoScalar< 1, 0, 0b11011, "fcvtmu">; -defm FCVTNS : SIMDFPTwoScalar< 0, 0, 0b11010, "fcvtns">; -defm FCVTNU : SIMDFPTwoScalar< 1, 0, 0b11010, "fcvtnu">; -defm FCVTPS : SIMDFPTwoScalar< 0, 1, 0b11010, "fcvtps">; -defm FCVTPU : SIMDFPTwoScalar< 1, 1, 0b11010, "fcvtpu">; +defm FCVTAS : SIMDFPTwoScalar< 0, 0, 0b11100, "fcvtas", int_aarch64_neon_fcvtas>; +defm FCVTAU : SIMDFPTwoScalar< 1, 0, 0b11100, "fcvtau", int_aarch64_neon_fcvtau>; +defm FCVTMS : SIMDFPTwoScalar< 0, 0, 0b11011, "fcvtms", int_aarch64_neon_fcvtms>; +defm FCVTMU : SIMDFPTwoScalar< 1, 0, 0b11011, "fcvtmu", int_aarch64_neon_fcvtmu>; +defm FCVTNS : SIMDFPTwoScalar< 0, 0, 0b11010, "fcvtns", int_aarch64_neon_fcvtns>; +defm FCVTNU : SIMDFPTwoScalar< 1, 0, 0b11010, "fcvtnu", int_aarch64_neon_fcvtnu>; +defm FCVTPS : SIMDFPTwoScalar< 0, 1, 0b11010, "fcvtps", int_aarch64_neon_fcvtps>; +defm FCVTPU : SIMDFPTwoScalar< 1, 1, 0b11010, "fcvtpu", int_aarch64_neon_fcvtpu>; def FCVTXNv1i64 : SIMDInexactCvtTwoScalar<0b10110, "fcvtxn">; defm FCVTZS : SIMDFPTwoScalar< 0, 1, 0b11011, "fcvtzs">; defm FCVTZU : SIMDFPTwoScalar< 1, 1, 0b11011, "fcvtzu">; @@ -6600,6 +6572,86 @@ defm UQXTN : SIMDTwoScalarMixedBHS<1, 0b10100, "uqxtn", int_aarch64_neon_scalar defm USQADD : SIMDTwoScalarBHSDTied< 1, 0b00011, "usqadd", int_aarch64_neon_usqadd>; +// Floating-point conversion patterns. +multiclass FPToIntegerSIMDScalarPatterns { + def : Pat<(f32 (bitconvert (i32 (OpN (f64 FPR64:$Rn))))), + (!cast(INST # SDr) FPR64:$Rn)>; + def : Pat<(f32 (bitconvert (i32 (OpN (f16 FPR16:$Rn))))), + (!cast(INST # SHr) FPR16:$Rn)>; + def : Pat<(f64 (bitconvert (i64 (OpN (f16 FPR16:$Rn))))), + (!cast(INST # DHr) FPR16:$Rn)>; + def : Pat<(f64 (bitconvert (i64 (OpN (f32 FPR32:$Rn))))), + (!cast(INST # DSr) FPR32:$Rn)>; + def : Pat<(f32 (bitconvert (i32 (OpN (f32 FPR32:$Rn))))), + (!cast(INST # v1i32) FPR32:$Rn)>; + def : Pat<(f64 (bitconvert (i64 (OpN (f64 FPR64:$Rn))))), + (!cast(INST # v1i64) FPR64:$Rn)>; + +} +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; +defm: FPToIntegerSIMDScalarPatterns; + +multiclass FPToIntegerIntPats { + let Predicates = [HasFullFP16] in { + def : Pat<(i32 (round f16:$Rn)), (!cast(INST # UWHr) $Rn)>; + def : Pat<(i64 (round f16:$Rn)), (!cast(INST # UXHr) $Rn)>; + } + def : Pat<(i32 (round f32:$Rn)), (!cast(INST # UWSr) $Rn)>; + def : Pat<(i64 (round f32:$Rn)), (!cast(INST # UXSr) $Rn)>; + def : Pat<(i32 (round f64:$Rn)), (!cast(INST # UWDr) $Rn)>; + def : Pat<(i64 (round f64:$Rn)), (!cast(INST # UXDr) $Rn)>; + + // For global-isel we can use register classes to determine + // which FCVT instruction to use. + let Predicates = [HasFPRCVT] in { + def : Pat<(i32 (round f16:$Rn)), (!cast(INST # SHr) $Rn)>; + def : Pat<(i64 (round f16:$Rn)), (!cast(INST # DHr) $Rn)>; + def : Pat<(i64 (round f32:$Rn)), (!cast(INST # DSr) $Rn)>; + def : Pat<(i32 (round f64:$Rn)), (!cast(INST # SDr) $Rn)>; + } + def : Pat<(i32 (round f32:$Rn)), (!cast(INST # v1i32) $Rn)>; + def : Pat<(i64 (round f64:$Rn)), (!cast(INST # v1i64) $Rn)>; + + let Predicates = [HasFPRCVT] in { + def : Pat<(f32 (bitconvert (i32 (round f16:$Rn)))), + (!cast(INST # SHr) $Rn)>; + def : Pat<(f64 (bitconvert (i64 (round f16:$Rn)))), + (!cast(INST # DHr) $Rn)>; + def : Pat<(f64 (bitconvert (i64 (round f32:$Rn)))), + (!cast(INST # DSr) $Rn)>; + def : Pat<(f32 (bitconvert (i32 (round f64:$Rn)))), + (!cast(INST # SDr) $Rn)>; + } + def : Pat<(f32 (bitconvert (i32 (round f32:$Rn)))), + (!cast(INST # v1i32) $Rn)>; + def : Pat<(f64 (bitconvert (i64 (round f64:$Rn)))), + (!cast(INST # v1i64) $Rn)>; + + let Predicates = [HasFullFP16] in { + def : Pat<(i32 (round (fmul f16:$Rn, fixedpoint_f16_i32:$scale))), + (!cast(INST # SWHri) $Rn, $scale)>; + def : Pat<(i64 (round (fmul f16:$Rn, fixedpoint_f16_i64:$scale))), + (!cast(INST # SXHri) $Rn, $scale)>; + } + def : Pat<(i32 (round (fmul f32:$Rn, fixedpoint_f32_i32:$scale))), + (!cast(INST # SWSri) $Rn, $scale)>; + def : Pat<(i64 (round (fmul f32:$Rn, fixedpoint_f32_i64:$scale))), + (!cast(INST # SXSri) $Rn, $scale)>; + def : Pat<(i32 (round (fmul f64:$Rn, fixedpoint_f64_i32:$scale))), + (!cast(INST # SWDri) $Rn, $scale)>; + def : Pat<(i64 (round (fmul f64:$Rn, fixedpoint_f64_i64:$scale))), + (!cast(INST # SXDri) $Rn, $scale)>; +} + +defm : FPToIntegerIntPats; +defm : FPToIntegerIntPats; + // f16 -> s16 conversions let Predicates = [HasFullFP16] in { def : Pat<(i16(fp_to_sint_sat_gi f16:$Rn)), (FCVTZSv1f16 f16:$Rn)>; diff --git a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp index eeb34e12993b9..f90bcc7a77cdf 100644 --- a/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp +++ b/llvm/lib/Target/AArch64/GISel/AArch64RegisterBankInfo.cpp @@ -573,9 +573,7 @@ bool AArch64RegisterBankInfo::onlyUsesFP(const MachineInstr &MI, case Intrinsic::aarch64_neon_fcvtnu: case Intrinsic::aarch64_neon_fcvtps: case Intrinsic::aarch64_neon_fcvtpu: - // Force FPR register bank for half types, as those types otherwise - // don't get legalized correctly resulting in fp16 <-> gpr32 COPY's. - return MRI.getType(MI.getOperand(2).getReg()) == LLT::float16(); + return true; default: break; } @@ -1148,6 +1146,34 @@ AArch64RegisterBankInfo::getInstrMapping(const MachineInstr &MI) const { case TargetOpcode::G_INTRINSIC: case TargetOpcode::G_INTRINSIC_W_SIDE_EFFECTS: { switch (cast(MI).getIntrinsicID()) { + case Intrinsic::aarch64_neon_fcvtas: + case Intrinsic::aarch64_neon_fcvtau: + case Intrinsic::aarch64_neon_fcvtzs: + case Intrinsic::aarch64_neon_fcvtzu: + case Intrinsic::aarch64_neon_fcvtms: + case Intrinsic::aarch64_neon_fcvtmu: + case Intrinsic::aarch64_neon_fcvtns: + case Intrinsic::aarch64_neon_fcvtnu: + case Intrinsic::aarch64_neon_fcvtps: + case Intrinsic::aarch64_neon_fcvtpu: { + OpRegBankIdx[2] = PMI_FirstFPR; + if (MRI.getType(MI.getOperand(0).getReg()).isVector()) { + OpRegBankIdx[0] = PMI_FirstFPR; + break; + } + TypeSize DstSize = getSizeInBits(MI.getOperand(0).getReg(), MRI, TRI); + TypeSize SrcSize = getSizeInBits(MI.getOperand(2).getReg(), MRI, TRI); + if (((DstSize == SrcSize) || STI.hasFeature(AArch64::FeatureFPRCVT)) && + all_of(MRI.use_nodbg_instructions(MI.getOperand(0).getReg()), + [&](const MachineInstr &UseMI) { + return onlyUsesFP(UseMI, MRI, TRI) || + prefersFPUse(UseMI, MRI, TRI); + })) + OpRegBankIdx[0] = PMI_FirstFPR; + else + OpRegBankIdx[0] = PMI_FirstGPR; + break; + } case Intrinsic::aarch64_neon_vcvtfxs2fp: case Intrinsic::aarch64_neon_vcvtfxu2fp: case Intrinsic::aarch64_neon_vcvtfp2fxs: diff --git a/llvm/test/CodeGen/AArch64/arm64-cvt-simd-intrinsics.ll b/llvm/test/CodeGen/AArch64/arm64-cvt-simd-intrinsics.ll new file mode 100644 index 0000000000000..b1b9fcf8a8b3c --- /dev/null +++ b/llvm/test/CodeGen/AArch64/arm64-cvt-simd-intrinsics.ll @@ -0,0 +1,609 @@ +; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 +; RUN: llc < %s -mtriple aarch64-unknown-unknown -mattr=+fprcvt,+fullfp16 | FileCheck %s --check-prefixes=CHECK +; RUN: llc < %s -mtriple aarch64-unknown-unknown -global-isel -mattr=+fprcvt,+fullfp16 | FileCheck %s --check-prefixes=CHECK + + +; +; Intriniscs +; + +define float @fcvtas_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtas_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtas.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtas_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtas_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtas.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtas_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtas_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtas.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtas_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtas_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtas.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtas_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtas_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtas.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtas_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtas_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtas s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtas.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + + +define float @fcvtau_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtau_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtau.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtau_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtau_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtau.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtau_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtau_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtau.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtau_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtau_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtau.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtau_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtau_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtau.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtau_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtau_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtau s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtau.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtms_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtms_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtms.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtms_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtms_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtms.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtms_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtms_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtms.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtms_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtms_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtms.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtms_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtms_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtms.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtms_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtms_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtms s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtms.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtmu_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtmu_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtmu.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtmu_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtmu_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtmu.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtmu_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtmu_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtmu.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtmu_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtmu_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtmu.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtmu_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtmu_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtmu.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtmu_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtmu_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtmu s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtmu.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtns_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtns_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtns.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtns_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtns_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtns.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtns_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtns_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtns.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtns_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtns_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtns.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtns_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtns_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtns.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtns_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtns_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtns s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtns.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtnu_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtnu_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtnu.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtnu_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtnu_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtnu.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtnu_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtnu_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtnu.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtnu_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtnu_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtnu.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtnu_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtnu_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtnu.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtnu_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtnu_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtnu s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtnu.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtps_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtps_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtps.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtps_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtps_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtps.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtps_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtps_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtps.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtps_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtps_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtps.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtps_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtps_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtps.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtps_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtps_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtps s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtps.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtpu_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtpu_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtpu.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtpu_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtpu_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtpu.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtpu_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtpu_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtpu.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtpu_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtpu_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtpu.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtpu_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtpu_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtpu.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtpu_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtpu_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtpu s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtpu.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtzs_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtzs_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtzs.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtzs_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtzs_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtzs.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtzs_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtzs_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtzs_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtzs_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtzs_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtzs_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtzs.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtzs_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtzs_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtzs.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} + +define float @fcvtzu_1s1d_simd(double %A) nounwind { +; CHECK-LABEL: fcvtzu_1s1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu s0, d0 +; CHECK-NEXT: ret + %i = call i32 @llvm.aarch64.neon.fcvtzu.i32.f64(double %A) + %f = bitcast i32 %i to float + ret float %f +} + +define double @fcvtzu_1d1s_simd(float %A) nounwind { +; CHECK-LABEL: fcvtzu_1d1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu d0, s0 +; CHECK-NEXT: ret + %i = call i64 @llvm.aarch64.neon.fcvtzu.i64.f32(float %A) + %d = bitcast i64 %i to double + ret double %d +} + +define float @fcvtzu_1s1h_simd(half %a) { +; CHECK-LABEL: fcvtzu_1s1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu s0, h0 +; CHECK-NEXT: ret + %fcvt = tail call i32 @llvm.aarch64.neon.fcvtzu.i32.f16(half %a) + %f = bitcast i32 %fcvt to float + ret float %f +} + +define double @fcvtzu_1d1h_simd(half %a) { +; CHECK-LABEL: fcvtzu_1d1h_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu d0, h0 +; CHECK-NEXT: ret + %vcvtah_s64_f16 = tail call i64 @llvm.aarch64.neon.fcvtzu.i64.f16(half %a) + %d = bitcast i64 %vcvtah_s64_f16 to double + ret double %d +} + +define double @fcvtzu_1d1d_simd(double %a) { +; CHECK-LABEL: fcvtzu_1d1d_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu d0, d0 +; CHECK-NEXT: ret + %vcvtah_s64_f64 = tail call i64 @llvm.aarch64.neon.fcvtzu.i64.f64(double %a) + %d = bitcast i64 %vcvtah_s64_f64 to double + ret double %d +} + +define float @fcvtzu_1s1s_simd(float %a) { +; CHECK-LABEL: fcvtzu_1s1s_simd: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu s0, s0 +; CHECK-NEXT: ret + %vcvtah_s32_f32 = tail call i32 @llvm.aarch64.neon.fcvtzu.i32.f32(float %a) + %d = bitcast i32 %vcvtah_s32_f32 to float + ret float %d +} diff --git a/llvm/test/CodeGen/AArch64/arm64-vcvt.ll b/llvm/test/CodeGen/AArch64/arm64-vcvt.ll index 60fcb643fb9f4..627d31f9a64fc 100644 --- a/llvm/test/CodeGen/AArch64/arm64-vcvt.ll +++ b/llvm/test/CodeGen/AArch64/arm64-vcvt.ll @@ -1,15 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 ; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple | FileCheck %s --check-prefixes=CHECK,CHECK-SD -; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel -global-isel-abort=2 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI - -; CHECK-GI: warning: Instruction selection used fallback path for fcvtas_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtau_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtms_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtmu_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtps_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtpu_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtns_1d -; CHECK-GI-NEXT: warning: Instruction selection used fallback path for fcvtnu_1d +; RUN: llc < %s -mtriple=arm64-eabi -aarch64-neon-syntax=apple -global-isel 2>&1 | FileCheck %s --check-prefixes=CHECK,CHECK-GI define <2 x i32> @fcvtas_2s(<2 x float> %A) nounwind { ; CHECK-LABEL: fcvtas_2s: @@ -405,16 +396,10 @@ define <2 x i64> @fcvtzs_2d_intrinsic(<2 x double> %A) nounwind { } define <1 x i64> @fcvtzs_1d_intrinsic(<1 x double> %A) nounwind { -; CHECK-SD-LABEL: fcvtzs_1d_intrinsic: -; CHECK-SD: // %bb.0: -; CHECK-SD-NEXT: fcvtzs d0, d0 -; CHECK-SD-NEXT: ret -; -; CHECK-GI-LABEL: fcvtzs_1d_intrinsic: -; CHECK-GI: // %bb.0: -; CHECK-GI-NEXT: fcvtzs x8, d0 -; CHECK-GI-NEXT: fmov d0, x8 -; CHECK-GI-NEXT: ret +; CHECK-LABEL: fcvtzs_1d_intrinsic: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzs d0, d0 +; CHECK-NEXT: ret %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtzs.v1i64.v1f64(<1 x double> %A) ret <1 x i64> %tmp3 } @@ -490,16 +475,10 @@ define <2 x i64> @fcvtzu_2d_intrinsic(<2 x double> %A) nounwind { } define <1 x i64> @fcvtzu_1d_intrinsic(<1 x double> %A) nounwind { -; CHECK-SD-LABEL: fcvtzu_1d_intrinsic: -; CHECK-SD: // %bb.0: -; CHECK-SD-NEXT: fcvtzu d0, d0 -; CHECK-SD-NEXT: ret -; -; CHECK-GI-LABEL: fcvtzu_1d_intrinsic: -; CHECK-GI: // %bb.0: -; CHECK-GI-NEXT: fcvtzu x8, d0 -; CHECK-GI-NEXT: fmov d0, x8 -; CHECK-GI-NEXT: ret +; CHECK-LABEL: fcvtzu_1d_intrinsic: +; CHECK: // %bb.0: +; CHECK-NEXT: fcvtzu d0, d0 +; CHECK-NEXT: ret %tmp3 = call <1 x i64> @llvm.aarch64.neon.fcvtzu.v1i64.v1f64(<1 x double> %A) ret <1 x i64> %tmp3 }