From: Richard Ball <[email protected]>
This patch moves the NEON conversion intrinsics over to the new system
and removes them from the arm-neon.h file.
gcc/ChangeLog:
* config/aarch64/aarch64-acle-builtins.h
(TYPES_neon_cvt): New shape.
(TYPES_neon_cvt_scalar): Likewise.
(TYPES_neon_cvt_narrow): Likewise.
(TYPES_neon_cvtx_narrow): Likewise.
(TYPES_neon_cvtbf16_narrow): Likewise.
(TYPES_neon_cvtbf16_widen): Likewise.
(neon_cvt): Likewise.
(neon_cvt_scalar): Likewise.
(neon_cvt_widen): Likewise.
(neon_cvt_narrow): Likewise.
(neon_cvtx_narrow): Likewise.
(neon_cvtbf16_narrow): Likewise.
(neon_cvtbf16_widen): Likewise.
* config/aarch64/aarch64-neon-builtins-base.cc
(enum class): Add neon_cvt_kind enum.
(build_64bit_cvt): Function to handle 64 bit conversions.
(class gimple_cvt): New intrinsic handler.
(class gimple_cvt_scalar): Likewise.
(class gimple_cvt_n): Likewise.
(NEON_FUNCTION): New functions.
* config/aarch64/aarch64-neon-builtins-base.def
(REQUIRED_EXTENSIONS): New Functions.
(vcvt): Likewise.
(vcvtq): Likewise.
(vcvta): Likewise.
(vcvtaq): Likewise.
(vcvtp): Likewise.
(vcvtpq): Likewise.
(vcvtm): Likewise.
(vcvtmq): Likewise.
(vcvtn): Likewise.
(vcvtnq): Likewise.
(vcvtd): Likewise.
(vcvts): Likewise.
(vcvtad): Likewise.
(vcvtas): Likewise.
(vcvtmd): Likewise.
(vcvtms): Likewise.
(vcvtpd): Likewise.
(vcvtps): Likewise.
(vcvtnd): Likewise.
(vcvtns): Likewise.
(vcvt_n): Likewise.
(vcvtq_n): Likewise.
(vcvtd_n): Likewise.
(vcvts_n): Likewise.
(vcvt_high): Likewise.
(vcvtx): Likewise.
(vcvtx_high): Likewise.
(vcvtxd): Likewise.
(vcvtq_high): Likewise.
(vcvtq_low): Likewise.
* config/aarch64/aarch64-simd.md
(<FCVT_F2FIXED:fcvt_fixed_insn><VHSDF:mode>3): Add support for @.
(@fcvtzs<VHSDF:mode>3): Likewise.
(<FCVT_FIXED2F:fcvt_fixed_insn><VDQ_HSDI:mode>3): Likewise.
(@fcvtzu<VHSDF:mode>3): Likewise.
(@scvtf<VDQ_HSDI:mode>3): Likewise.
(@ucvtf<VDQ_HSDI:mode>3): Likewise.
* config/aarch64/aarch64.md
(<FCVT_F2FIXED:fcvt_fixed_insn><GPF:mode>3): Add support for @.
(@fcvtzs<GPF:mode>3): Likewise.
(@fcvtzu<GPF:mode>3): Likewise.
(<FCVT_FIXED2F:fcvt_fixed_insn><GPI:mode>3): Likewise.
(@scvtf<GPI:mode>3): Likewise.
(@ucvtf<GPI:mode>3): Likewise.
* config/aarch64/arm_neon.h
(__attribute__): Remove old defintion.
(vcvtx_f32_f64): Likewise.
(vcvtx_high_f32_f64): Likewise.
(vcvtxd_f32_f64): Likewise.
(vcltd_f64): Likewise.
(vcltz_f32): Likewise.
(vcltz_f64): Likewise.
(vcltz_s8): Likewise.
(vcltz_s16): Likewise.
(vcltz_s32): Likewise.
(vcltz_s64): Likewise.
(vcltzq_f32): Likewise.
(vcltzq_f64): Likewise.
(vcltzq_s8): Likewise.
(vcltzq_s16): Likewise.
(vcltzq_s32): Likewise.
(vcltzq_s64): Likewise.
(vcltzs_f32): Likewise.
(vcltzd_s64): Likewise.
(vcltzd_f64): Likewise.
(vcvt_f16_f32): Likewise.
(vcvt_high_f16_f32): Likewise.
(vcvt_f32_f64): Likewise.
(vcvt_high_f32_f64): Likewise.
(vcvt_f32_f16): Likewise.
(vcvt_f64_f32): Likewise.
(vcvt_high_f32_f16): Likewise.
(vcvt_high_f64_f32): Likewise.
(vcvtd_n_f64_s64): Likewise.
(vcvtd_n_f64_u64): Likewise.
(vcvts_n_f32_s32): Likewise.
(vcvts_n_f32_u32): Likewise.
(vcvt_n_f32_s32): Likewise.
(vcvt_n_f32_u32): Likewise.
(vcvt_n_f64_s64): Likewise.
(vcvt_n_f64_u64): Likewise.
(vcvtq_n_f32_s32): Likewise.
(vcvtq_n_f32_u32): Likewise.
(vcvtq_n_f64_s64): Likewise.
(vcvtq_n_f64_u64): Likewise.
(vcvtd_n_s64_f64): Likewise.
(vcvtd_n_u64_f64): Likewise.
(vcvts_n_s32_f32): Likewise.
(vcvts_n_u32_f32): Likewise.
(vcvt_n_s32_f32): Likewise.
(vcvt_n_u32_f32): Likewise.
(vcvt_n_s64_f64): Likewise.
(vcvt_n_u64_f64): Likewise.
(vcvtq_n_s32_f32): Likewise.
(vcvtq_n_u32_f32): Likewise.
(vcvtq_n_s64_f64): Likewise.
(vcvtq_n_u64_f64): Likewise.
(vcvtd_f64_s64): Likewise.
(vcvtd_f64_u64): Likewise.
(vcvts_f32_s32): Likewise.
(vcvts_f32_u32): Likewise.
(vcvt_f32_s32): Likewise.
(vcvt_f32_u32): Likewise.
(vcvt_f64_s64): Likewise.
(vcvt_f64_u64): Likewise.
(vcvtq_f32_s32): Likewise.
(vcvtq_f32_u32): Likewise.
(vcvtq_f64_s64): Likewise.
(vcvtq_f64_u64): Likewise.
(vcvtd_s64_f64): Likewise.
(vcvtd_s32_f64): Likewise.
(vcvtd_u64_f64): Likewise.
(vcvtd_u32_f64): Likewise.
(vcvts_s32_f32): Likewise.
(vcvts_s64_f32): Likewise.
(vcvts_u32_f32): Likewise.
(vcvts_u64_f32): Likewise.
(vcvt_s32_f32): Likewise.
(vcvt_u32_f32): Likewise.
(vcvtq_s32_f32): Likewise.
(vcvtq_u32_f32): Likewise.
(vcvt_s64_f64): Likewise.
(vcvt_u64_f64): Likewise.
(vcvtq_s64_f64): Likewise.
(vcvtq_u64_f64): Likewise.
(vcvtad_s64_f64): Likewise.
(vcvtad_s32_f64): Likewise.
(vcvtad_u64_f64): Likewise.
(vcvtad_u32_f64): Likewise.
(vcvtas_s32_f32): Likewise.
(vcvtas_s64_f32): Likewise.
(vcvtas_u32_f32): Likewise.
(vcvtas_u64_f32): Likewise.
(vcvta_s32_f32): Likewise.
(vcvta_u32_f32): Likewise.
(vcvtaq_s32_f32): Likewise.
(vcvtaq_u32_f32): Likewise.
(vcvta_s64_f64): Likewise.
(vcvta_u64_f64): Likewise.
(vcvtaq_s64_f64): Likewise.
(vcvtaq_u64_f64): Likewise.
(vcvtmd_s64_f64): Likewise.
(vcvtmd_s32_f64): Likewise.
(vcvtmd_u64_f64): Likewise.
(vcvtmd_u32_f64): Likewise.
(vcvtms_s32_f32): Likewise.
(vcvtms_s64_f32): Likewise.
(vcvtms_u32_f32): Likewise.
(vcvtms_u64_f32): Likewise.
(vcvtm_s32_f32): Likewise.
(vcvtm_u32_f32): Likewise.
(vcvtmq_s32_f32): Likewise.
(vcvtmq_u32_f32): Likewise.
(vcvtm_s64_f64): Likewise.
(vcvtm_u64_f64): Likewise.
(vcvtmq_s64_f64): Likewise.
(vcvtmq_u64_f64): Likewise.
(vcvtnd_s64_f64): Likewise.
(vcvtnd_s32_f64): Likewise.
(vcvtnd_u64_f64): Likewise.
(vcvtnd_u32_f64): Likewise.
(vcvtns_s32_f32): Likewise.
(vcvtns_s64_f32): Likewise.
(vcvtns_u32_f32): Likewise.
(vcvtns_u64_f32): Likewise.
(vcvtn_s32_f32): Likewise.
(vcvtn_u32_f32): Likewise.
(vcvtnq_s32_f32): Likewise.
(vcvtnq_u32_f32): Likewise.
(vcvtn_s64_f64): Likewise.
(vcvtn_u64_f64): Likewise.
(vcvtnq_s64_f64): Likewise.
(vcvtnq_u64_f64): Likewise.
(vcvtpd_s64_f64): Likewise.
(vcvtpd_s32_f64): Likewise.
(vcvtpd_u64_f64): Likewise.
(vcvtpd_u32_f64): Likewise.
(vcvtps_s32_f32): Likewise.
(vcvtps_s64_f32): Likewise.
(vcvtps_u32_f32): Likewise.
(vcvtps_u64_f32): Likewise.
(vcvtp_s32_f32): Likewise.
(vcvtp_u32_f32): Likewise.
(vcvtpq_s32_f32): Likewise.
(vcvtpq_u32_f32): Likewise.
(vcvtp_s64_f64): Likewise.
(vcvtp_u64_f64): Likewise.
(vcvtpq_s64_f64): Likewise.
(vcvtpq_u64_f64): Likewise.
(vcvt_f16_s16): Likewise.
(vcvtq_f16_s16): Likewise.
(vcvt_f16_u16): Likewise.
(vcvtq_f16_u16): Likewise.
(vcvt_s16_f16): Likewise.
(vcvtq_s16_f16): Likewise.
(vcvt_u16_f16): Likewise.
(vcvtq_u16_f16): Likewise.
(vcvta_s16_f16): Likewise.
(vcvtaq_s16_f16): Likewise.
(vcvta_u16_f16): Likewise.
(vcvtaq_u16_f16): Likewise.
(vcvtm_s16_f16): Likewise.
(vcvtmq_s16_f16): Likewise.
(vcvtm_u16_f16): Likewise.
(vcvtmq_u16_f16): Likewise.
(vcvtn_s16_f16): Likewise.
(vcvtnq_s16_f16): Likewise.
(vcvtn_u16_f16): Likewise.
(vcvtnq_u16_f16): Likewise.
(vcvtp_s16_f16): Likewise.
(vcvtpq_s16_f16): Likewise.
(vcvtp_u16_f16): Likewise.
(vcvtpq_u16_f16): Likewise.
(vcvt_n_f16_s16): Likewise.
(vcvtq_n_f16_s16): Likewise.
(vcvt_n_f16_u16): Likewise.
(vcvtq_n_f16_u16): Likewise.
(vcvt_n_s16_f16): Likewise.
(vcvtq_n_s16_f16): Likewise.
(vcvt_n_u16_f16): Likewise.
(vcvtq_n_u16_f16): Likewise.
(vcvt_f32_bf16): Likewise.
(vcvtq_low_f32_bf16): Likewise.
(vcvtq_high_f32_bf16): Likewise.
(vcvt_bf16_f32): Likewise.
(vcvtq_low_bf16_f32): Likewise.
(vcvtq_high_bf16_f32): Likewise.
* optabs.def
(OPTAB_CL): Add new optabs.
gcc/testsuite/ChangeLog:
* gcc.target/aarch64/neon/arm_neon_test.h: Add UNARY_N.
* gcc.target/aarch64/advsimd-intrinsics/bfcvtn-nobf16.c: Removed.
* gcc.target/aarch64/neon/vcvt.c: New test.
* gcc.target/aarch64/neon/vcvt_highlo.c: New test.
* gcc.target/aarch64/neon/vcvt_n.c: New test.
* gcc.target/aarch64/neon/vcvta.c: New test.
* gcc.target/aarch64/neon/vcvtd.c: New test.
* gcc.target/aarch64/neon/vcvtds_n.c: New test.
* gcc.target/aarch64/neon/vcvtm.c: New test.
* gcc.target/aarch64/neon/vcvtn.c: New test.
* gcc.target/aarch64/neon/vcvtp.c: New test.
* gcc.target/aarch64/neon/vcvts.c: New test.
---
gcc/config/aarch64/aarch64-acle-builtins.h | 53 +
.../aarch64/aarch64-neon-builtins-base.cc | 417 +++++-
.../aarch64/aarch64-neon-builtins-base.def | 41 +
gcc/config/aarch64/aarch64-simd.md | 34 +-
gcc/config/aarch64/aarch64.md | 40 +-
gcc/config/aarch64/arm_neon.h | 1281 +----------------
gcc/optabs.def | 6 +
.../advsimd-intrinsics/bfcvtn-nobf16.c | 10 -
.../gcc.target/aarch64/neon/arm_neon_test.h | 6 +
gcc/testsuite/gcc.target/aarch64/neon/vcvt.c | 172 +++
.../gcc.target/aarch64/neon/vcvt_highlo.c | 123 ++
.../gcc.target/aarch64/neon/vcvt_n.c | 172 +++
gcc/testsuite/gcc.target/aarch64/neon/vcvta.c | 90 ++
gcc/testsuite/gcc.target/aarch64/neon/vcvtd.c | 158 ++
.../gcc.target/aarch64/neon/vcvtds_n.c | 59 +
gcc/testsuite/gcc.target/aarch64/neon/vcvtm.c | 90 ++
gcc/testsuite/gcc.target/aarch64/neon/vcvtn.c | 90 ++
gcc/testsuite/gcc.target/aarch64/neon/vcvtp.c | 90 ++
gcc/testsuite/gcc.target/aarch64/neon/vcvts.c | 158 ++
19 files changed, 1833 insertions(+), 1257 deletions(-)
delete mode 100644
gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfcvtn-nobf16.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvt.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvt_highlo.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvt_n.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvta.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvtd.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvtds_n.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvtm.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvtn.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvtp.c
create mode 100644 gcc/testsuite/gcc.target/aarch64/neon/vcvts.c
diff --git a/gcc/config/aarch64/aarch64-acle-builtins.h
b/gcc/config/aarch64/aarch64-acle-builtins.h
index a9832c1689b9..5a3a9fb9bb8c 100644
--- a/gcc/config/aarch64/aarch64-acle-builtins.h
+++ b/gcc/config/aarch64/aarch64-acle-builtins.h
@@ -2042,6 +2042,52 @@ function_expander::result_mode () const
TYPES_neon_reinterpretq1 (D, p64), \
TYPES_neon_reinterpretq1 (D, p128)
+#define TYPES_neon_cvt(S, D, T) \
+ D (s32, f32), \
+ D (u32, f32), \
+ D (f32, s32), \
+ D (f32, u32), \
+ D (s64, f64), \
+ D (u64, f64), \
+ D (f64, s64), \
+ D (f64, u64), \
+ D (f16, s16), \
+ D (f16, u16), \
+ D (s16, f16), \
+ D (u16, f16)
+
+#define TYPES_neon_cvt_scalar(S, D, T) \
+ D (s32, f32), \
+ D (u32, f32), \
+ D (f32, s32), \
+ D (f32, u32), \
+ D (s64, f64), \
+ D (u64, f64), \
+ D (f64, s64), \
+ D (f64, u64), \
+ D (s32, f64), \
+ D (u32, f64), \
+ D (s64, f32), \
+ D (u64, f32)
+
+ #define TYPES_neon_cvt_widen(S, D, T) \
+ D (f32, f16), \
+ D (f64, f32)
+
+#define TYPES_neon_cvt_narrow(S, D, T) \
+ D (f16, f32), \
+ D (f32, f64)
+
+#define TYPES_neon_cvtx_narrow(S, D, T) \
+ D (f32, f64)
+
+#define TYPES_neon_cvtbf16_narrow(S, D, T) \
+ D (bf16, f32)
+
+#define TYPES_neon_cvtbf16_widen(S, D, T) \
+ D (f32, bf16)
+
+
/* Describe a tuple of type suffixes in which only the first is used. */
#define DEF_VECTOR_TYPE(X) \
{ TYPE_SUFFIX_ ## X, NUM_TYPE_SUFFIXES, NUM_TYPE_SUFFIXES }
@@ -2212,6 +2258,13 @@ DEF_SVE_TYPES_ARRAY (neon_rev32);
DEF_SVE_TYPES_ARRAY (neon_rev64);
DEF_SVE_TYPES_ARRAY (neon_reinterpret);
DEF_SVE_TYPES_ARRAY (neon_reinterpretq);
+DEF_SVE_TYPES_ARRAY (neon_cvt);
+DEF_SVE_TYPES_ARRAY (neon_cvt_scalar);
+DEF_SVE_TYPES_ARRAY (neon_cvt_widen);
+DEF_SVE_TYPES_ARRAY (neon_cvt_narrow);
+DEF_SVE_TYPES_ARRAY (neon_cvtx_narrow);
+DEF_SVE_TYPES_ARRAY (neon_cvtbf16_narrow);
+DEF_SVE_TYPES_ARRAY (neon_cvtbf16_widen);
static const group_suffix_index groups_none[] = {
GROUP_none, NUM_GROUP_SUFFIXES
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
index 0313eb49759e..7c7f9809aef0 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.cc
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.cc
@@ -579,6 +579,382 @@ public:
}
};
+enum class neon_cvt_kind
+{
+ cvt,
+ cvta,
+ cvtm,
+ cvtp,
+ cvtn,
+ cvt_n,
+ cvt_high,
+ cvtx,
+ cvtx_high,
+ cvtx_scalar,
+ cvtq_high,
+ cvtq_low
+};
+
+rtx
+build_64bit_cvt (auto_vec<rtx, 16> args, bool unsigned_p,
+ bool float_p,
+ neon_cvt_kind m_kind)
+{
+ rtx op = force_reg (V1DFmode, args[0]);
+ rtx scalar_in = gen_lowpart (DFmode, op);
+ rtx scalar_out = gen_reg_rtx (DImode);
+ machine_mode scalar_mode = DImode;
+ machine_mode target_mode = V1DImode;
+
+ switch (m_kind)
+ {
+ case neon_cvt_kind::cvta:
+ if (unsigned_p)
+ emit_insn (gen_lroundudfdi2 (scalar_out, scalar_in));
+ else
+ emit_insn (gen_lrounddfdi2 (scalar_out, scalar_in));
+ break;
+
+ case neon_cvt_kind::cvtm:
+ if (unsigned_p)
+ emit_insn (gen_lfloorudfdi2 (scalar_out, scalar_in));
+ else
+ emit_insn (gen_lfloordfdi2 (scalar_out, scalar_in));
+ break;
+
+ case neon_cvt_kind::cvtp:
+ if (unsigned_p)
+ emit_insn (gen_lceiludfdi2 (scalar_out, scalar_in));
+ else
+ emit_insn (gen_lceildfdi2 (scalar_out, scalar_in));
+ break;
+
+ case neon_cvt_kind::cvtn:
+ if (unsigned_p)
+ emit_insn (gen_lfrintnudfdi2 (scalar_out, scalar_in));
+ else
+ emit_insn (gen_lfrintndfdi2 (scalar_out, scalar_in));
+ break;
+
+ case neon_cvt_kind::cvt_n:
+ if (float_p)
+ {
+ op = force_reg (V1DImode, args[0]);
+ scalar_in = gen_lowpart (DImode, op);
+ scalar_out = gen_reg_rtx (DFmode);
+ target_mode = V1DFmode;
+ scalar_mode = DFmode;
+ if (unsigned_p)
+ emit_insn (gen_ucvtfdi3 (scalar_out, scalar_in, args[1]));
+ else
+ emit_insn (gen_scvtfdi3 (scalar_out, scalar_in, args[1]));
+ }
+ else
+ if (unsigned_p)
+ emit_insn (gen_fcvtzudf3 (scalar_out, scalar_in, args[1]));
+ else
+ emit_insn (gen_fcvtzsdf3 (scalar_out, scalar_in, args[1]));
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ /* Put the scalar result back into a V1DI. */
+
+ rtx target = gen_reg_rtx (target_mode);
+
+ emit_move_insn (target,
+ simplify_gen_subreg (target_mode,
+ scalar_out,
+ scalar_mode, 0));
+
+ return target;
+}
+
+
+class gimple_cvt : public gimple_function_base
+{
+public:
+ constexpr gimple_cvt (neon_cvt_kind kind)
+ : m_kind (kind)
+ {}
+
+ gimple *fold (gimple_folder &f) const override
+ {
+ tree arg = gimple_call_arg (f.call, 0);
+ tree arg_type = TREE_TYPE (arg);
+ tree ret_type = TREE_TYPE (f.lhs);
+ const auto &to = f.type_suffix (0);
+ const auto &from = f.type_suffix (1);
+ if (!VECTOR_TYPE_P (arg_type) || !VECTOR_TYPE_P (ret_type))
+ {
+ return nullptr;
+ }
+ if (known_eq (TYPE_VECTOR_SUBPARTS (arg_type), 1U)
+ && known_eq (TYPE_VECTOR_SUBPARTS (ret_type), 1U)
+ && m_kind == neon_cvt_kind::cvt)
+ {
+ auto ret_elem_type = TREE_TYPE (ret_type);
+
+ auto scalar_arg
+ = f.force_val (build_lane_get (arg, size_zero_node));
+ tree_code code;
+
+ if (to.integer_p && from.float_p)
+ code = FIX_TRUNC_EXPR;
+ else if (to.float_p && from.integer_p)
+ code = FLOAT_EXPR;
+ else
+ gcc_unreachable ();
+
+ tree scalar_result
+ = f.force_val (fold_build1 (code, ret_elem_type, scalar_arg));
+
+ return gimple_build_assign
+ (f.lhs, build_vec_dup (ret_type, scalar_result));
+ }
+ return nullptr;
+ }
+
+ rtx expand (function_expander &e) const override
+ {
+ machine_mode to_mode = e.result_mode ();
+ machine_mode from_mode = GET_MODE (e.args[0]);
+ insn_code icode;
+
+ const auto &to = e.type_suffix (0);
+ const auto &from = e.type_suffix (1);
+
+ convert_optab optab;
+
+ if (GET_MODE (e.args[0]) == V1DFmode
+ && m_kind != neon_cvt_kind::cvt)
+ {
+ return build_64bit_cvt (e.args, to.unsigned_p, to.float_p, m_kind);
+ }
+
+ if ((to.element_bits != from.element_bits)
+ && (m_kind == neon_cvt_kind::cvt_high
+ || m_kind == neon_cvt_kind::cvtx
+ || m_kind == neon_cvt_kind::cvtx_high
+ || m_kind == neon_cvt_kind::cvtx_scalar
+ || m_kind == neon_cvt_kind::cvtq_high
+ || m_kind == neon_cvt_kind::cvtq_low
+ || m_kind == neon_cvt_kind::cvt))
+ {
+ if (m_kind == neon_cvt_kind::cvt_high)
+ {
+ switch (from_mode)
+ {
+ case E_V8HFmode:
+ icode = CODE_FOR_vec_unpacks_hi_v8hf;
+ break;
+
+ case E_V4SFmode:
+ icode = CODE_FOR_vec_unpacks_hi_v4sf;
+ break;
+
+ case E_V4HFmode:
+ icode = CODE_FOR_aarch64_float_truncate_hi_v8hf;
+ break;
+
+ case E_V2SFmode:
+ icode = CODE_FOR_aarch64_float_truncate_hi_v4sf;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+ else if (m_kind == neon_cvt_kind::cvtq_high)
+ {
+ switch (to_mode)
+ {
+ case E_V8BFmode:
+ icode = CODE_FOR_aarch64_bfcvtn2v8bf;
+ break;
+
+ case E_V4SFmode:
+ icode = CODE_FOR_aarch64_vbfcvt_highv8bf;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+ else if (m_kind == neon_cvt_kind::cvtq_low)
+ {
+ switch (from_mode)
+ {
+ case E_V8BFmode:
+ icode = CODE_FOR_aarch64_vbfcvtv8bf;
+ break;
+
+ case E_V4SFmode:
+ icode = CODE_FOR_aarch64_bfcvtn_qv8bf;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+ else if (m_kind == neon_cvt_kind::cvtx)
+ icode = CODE_FOR_aarch64_float_trunc_rodd_lo_v2sf;
+ else if (m_kind == neon_cvt_kind::cvtx_high)
+ icode = CODE_FOR_aarch64_float_trunc_rodd_hi_v4sf;
+ else if (m_kind == neon_cvt_kind::cvtx_scalar)
+ icode = CODE_FOR_aarch64_float_trunc_rodd_df;
+ else
+ {
+ switch (from_mode)
+ {
+ case E_V4HFmode:
+ icode = CODE_FOR_extendv4hfv4sf2;
+ break;
+
+ case E_V2SFmode:
+ icode = CODE_FOR_extendv2sfv2df2;
+ break;
+
+ case E_V4SFmode:
+ if (to_mode == E_V4BFmode)
+ icode = CODE_FOR_aarch64_bfcvtnv4bf;
+ else
+ icode = CODE_FOR_truncv4sfv4hf2;
+ break;
+
+ case E_V2DFmode:
+ icode = CODE_FOR_truncv2dfv2sf2;
+ break;
+
+ case E_V4BFmode:
+ icode = CODE_FOR_aarch64_vbfcvtv4bf;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+ gcc_assert (icode != CODE_FOR_nothing);
+ return e.use_exact_insn (icode);
+ }
+
+ if (to.float_p)
+ {
+ gcc_assert (m_kind == neon_cvt_kind::cvt);
+ optab = from.unsigned_p ? ufloat_optab : sfloat_optab;
+ }
+ else
+ {
+ switch (m_kind)
+ {
+ case neon_cvt_kind::cvt:
+ optab = to.unsigned_p ? ufix_optab : sfix_optab;
+ break;
+
+ case neon_cvt_kind::cvta:
+ optab = to.unsigned_p ? lroundu_optab : lround_optab;
+ break;
+
+ case neon_cvt_kind::cvtm:
+ optab = to.unsigned_p ? lflooru_optab : lfloor_optab;
+ break;
+
+ case neon_cvt_kind::cvtp:
+ optab = to.unsigned_p ? lceilu_optab : lceil_optab;
+ break;
+
+ case neon_cvt_kind::cvtn:
+ optab = to.unsigned_p ? lfrintnu_optab : lfrintn_optab;
+ break;
+
+ default:
+ gcc_unreachable ();
+ }
+ }
+
+ icode = convert_optab_handler (optab, to_mode, from_mode);
+ gcc_assert (icode != CODE_FOR_nothing);
+ return e.use_exact_insn (icode);
+ }
+
+private:
+ neon_cvt_kind m_kind;
+};
+
+class gimple_cvt_scalar : public gimple_function_base
+{
+public:
+ constexpr gimple_cvt_scalar (neon_cvt_kind kind)
+ : m_kind (kind)
+ {}
+
+ gimple *fold (gimple_folder &f) const override
+ {
+ tree arg = gimple_call_arg (f.call, 0);
+ tree ret_type = TREE_TYPE (f.lhs);
+ const auto &to = f.type_suffix (0);
+ const auto &from = f.type_suffix (1);
+ tree_code code;
+
+ if (to.integer_p && from.float_p)
+ code = FIX_TRUNC_EXPR;
+ else if (to.float_p && from.integer_p)
+ code = FLOAT_EXPR;
+ else
+ gcc_unreachable ();
+
+ tree rhs
+ = f.force_val (fold_build1 (code, ret_type, arg));
+
+ return gimple_build_assign (f.lhs, rhs);
+ }
+
+private:
+ neon_cvt_kind m_kind;
+};
+
+class gimple_cvt_n : public gimple_function_base
+{
+public:
+ constexpr gimple_cvt_n (neon_cvt_kind kind)
+ : m_kind (kind)
+ {}
+
+ gimple *fold (gimple_folder &) const override
+ {
+ return nullptr;
+ }
+
+ rtx expand (function_expander &e) const override
+ {
+ machine_mode from_mode = GET_MODE (e.args[0]);
+ const auto &to = e.type_suffix (0);
+ const auto &from = e.type_suffix (1);
+
+ if (GET_MODE (e.args[0]) == V1DFmode
+ || GET_MODE (e.args[0]) == V1DImode)
+ {
+ if (to.float_p)
+ return build_64bit_cvt (e.args, from.unsigned_p, to.float_p, m_kind);
+ else
+ return build_64bit_cvt (e.args, to.unsigned_p, to.float_p, m_kind);
+ }
+
+ insn_code icode;
+ if (to.float_p)
+ icode = from.unsigned_p ? code_for_ucvtf3 (from_mode)
+ : code_for_scvtf3 (from_mode);
+ else
+ icode = to.unsigned_p ? code_for_fcvtzu3 (from_mode)
+ : code_for_fcvtzs3 (from_mode);
+ return e.use_exact_insn (icode);
+ }
+
+private:
+ neon_cvt_kind m_kind;
+};
+
tree
ext_mask (gimple_folder &f)
{
@@ -779,7 +1155,42 @@ NEON_FUNCTION (vuzp2, vuzp2q, gimple_permute,
(uzp_mask<true>))
NEON_FUNCTION (vuzp, vuzpq, gimple_permute_pair, (uzp_mask<false>,
uzp_mask<true>))
// Zip
-NEON_FUNCTION (vzip1, vzip1q, gimple_permute, (zip_mask<false>))
-NEON_FUNCTION (vzip2, vzip2q, gimple_permute, (zip_mask<true>))
-NEON_FUNCTION (vzip, vzipq, gimple_permute_pair, (zip_mask<false>,
zip_mask<true>))
+NEON_FUNCTION (vzip1, gimple_permute, (zip_mask<false>))
+NEON_FUNCTION (vzip1q, gimple_permute, (zip_mask<false>))
+NEON_FUNCTION (vzip2, gimple_permute, (zip_mask<true>))
+NEON_FUNCTION (vzip2q, gimple_permute, (zip_mask<true>))
+NEON_FUNCTION (vzip, gimple_permute_pair, (zip_mask<false>, zip_mask<true>))
+NEON_FUNCTION (vzipq, gimple_permute_pair, (zip_mask<false>, zip_mask<true>))
+
+// Conversions
+NEON_FUNCTION (vcvt, gimple_cvt, (neon_cvt_kind::cvt))
+NEON_FUNCTION (vcvtq, gimple_cvt, (neon_cvt_kind::cvt))
+NEON_FUNCTION (vcvta, gimple_cvt, (neon_cvt_kind::cvta))
+NEON_FUNCTION (vcvtaq, gimple_cvt, (neon_cvt_kind::cvta))
+NEON_FUNCTION (vcvtp, gimple_cvt, (neon_cvt_kind::cvtp))
+NEON_FUNCTION (vcvtpq, gimple_cvt, (neon_cvt_kind::cvtp))
+NEON_FUNCTION (vcvtm, gimple_cvt, (neon_cvt_kind::cvtm))
+NEON_FUNCTION (vcvtmq, gimple_cvt, (neon_cvt_kind::cvtm))
+NEON_FUNCTION (vcvtn, gimple_cvt, (neon_cvt_kind::cvtn))
+NEON_FUNCTION (vcvtnq, gimple_cvt, (neon_cvt_kind::cvtn))
+NEON_FUNCTION (vcvtd, gimple_cvt_scalar, (neon_cvt_kind::cvt))
+NEON_FUNCTION (vcvts, gimple_cvt_scalar, (neon_cvt_kind::cvt))
+NEON_FUNCTION (vcvtad, gimple_cvt, (neon_cvt_kind::cvta))
+NEON_FUNCTION (vcvtas, gimple_cvt, (neon_cvt_kind::cvta))
+NEON_FUNCTION (vcvtmd, gimple_cvt, (neon_cvt_kind::cvtm))
+NEON_FUNCTION (vcvtms, gimple_cvt, (neon_cvt_kind::cvtm))
+NEON_FUNCTION (vcvtpd, gimple_cvt, (neon_cvt_kind::cvtp))
+NEON_FUNCTION (vcvtps, gimple_cvt, (neon_cvt_kind::cvtp))
+NEON_FUNCTION (vcvtnd, gimple_cvt, (neon_cvt_kind::cvtn))
+NEON_FUNCTION (vcvtns, gimple_cvt, (neon_cvt_kind::cvtn))
+NEON_FUNCTION (vcvt_n, gimple_cvt_n, (neon_cvt_kind::cvt_n))
+NEON_FUNCTION (vcvtq_n, gimple_cvt_n, (neon_cvt_kind::cvt_n))
+NEON_FUNCTION (vcvtd_n, gimple_cvt_n, (neon_cvt_kind::cvt_n))
+NEON_FUNCTION (vcvts_n, gimple_cvt_n, (neon_cvt_kind::cvt_n))
+NEON_FUNCTION (vcvt_high, gimple_cvt, (neon_cvt_kind::cvt_high))
+NEON_FUNCTION (vcvtx, gimple_cvt, (neon_cvt_kind::cvtx))
+NEON_FUNCTION (vcvtx_high, gimple_cvt, (neon_cvt_kind::cvtx_high))
+NEON_FUNCTION (vcvtxd, gimple_cvt, (neon_cvt_kind::cvtx_scalar))
+NEON_FUNCTION (vcvtq_high, gimple_cvt, (neon_cvt_kind::cvtq_high))
+NEON_FUNCTION (vcvtq_low, gimple_cvt, (neon_cvt_kind::cvtq_low))
}
diff --git a/gcc/config/aarch64/aarch64-neon-builtins-base.def
b/gcc/config/aarch64/aarch64-neon-builtins-base.def
index 7257f59bbc56..e46b00ed4d48 100644
--- a/gcc/config/aarch64/aarch64-neon-builtins-base.def
+++ b/gcc/config/aarch64/aarch64-neon-builtins-base.def
@@ -145,3 +145,44 @@ DEF_NEON_FUNCTION (vzip2, bhs_neon, ("D0,D0,D0"))
DEF_NEON_FUNCTION (vzip2q, bhsd_neon, ("Q0,Q0,Q0"))
DEF_NEON_FUNCTION (vzipq, bhs_neon, ("Q0x2,Q0,Q0"))
#undef REQUIRED_EXTENSIONS
+
+// Conversions
+#define REQUIRED_EXTENSIONS nonstreaming_only (AARCH64_FL_SIMD)
+DEF_NEON_FUNCTION (vcvt, neon_cvt, ("D0,D1"))
+DEF_NEON_FUNCTION (vcvtq, neon_cvt, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvta, neon_cvt, ("D0,D1"))
+DEF_NEON_FUNCTION (vcvtaq, neon_cvt, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvtp, neon_cvt, ("D0,D1"))
+DEF_NEON_FUNCTION (vcvtpq, neon_cvt, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvtm, neon_cvt, ("D0,D1"))
+DEF_NEON_FUNCTION (vcvtmq, neon_cvt, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvtn, neon_cvt, ("D0,D1"))
+DEF_NEON_FUNCTION (vcvtnq, neon_cvt, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvtd, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvts, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtad, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtas, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtmd, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtms, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtpd, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtps, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtnd, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvtns, neon_cvt_scalar, ("s0,s1"))
+DEF_NEON_FUNCTION (vcvt_n, neon_cvt, ("D0,D1,ss32"))
+DEF_NEON_FUNCTION (vcvtq_n, neon_cvt, ("Q0,Q1,ss32"))
+DEF_NEON_FUNCTION (vcvtd_n, neon_cvt, ("s0,s1,ss32"))
+DEF_NEON_FUNCTION (vcvts_n, neon_cvt, ("s0,s1,ss32"))
+DEF_NEON_FUNCTION (vcvt, neon_cvt_widen, ("Q0,D1"))
+DEF_NEON_FUNCTION (vcvt, neon_cvt_narrow, ("D0,Q1"))
+DEF_NEON_FUNCTION (vcvt_high, neon_cvt_widen, ("Q0,Q1"))
+DEF_NEON_FUNCTION (vcvt_high, neon_cvt_narrow, ("Q0,D0,Q1"))
+DEF_NEON_FUNCTION (vcvtx, neon_cvtx_narrow, (("D0,Q1")))
+DEF_NEON_FUNCTION (vcvtx_high, neon_cvtx_narrow, ("Q0,D0,Q1"))
+DEF_NEON_FUNCTION (vcvtxd, neon_cvtx_narrow, (("s0,s1")))
+DEF_NEON_FUNCTION (vcvt, neon_cvtbf16_widen, ("Q0,DB"))
+DEF_NEON_FUNCTION (vcvt, neon_cvtbf16_narrow, ("DB,Q1"))
+DEF_NEON_FUNCTION (vcvtq_high, neon_cvtbf16_narrow,("QB,QB,Q1"))
+DEF_NEON_FUNCTION (vcvtq_high, neon_cvtbf16_widen,("Q0,QB"))
+DEF_NEON_FUNCTION (vcvtq_low, neon_cvtbf16_narrow,("QB,Q1"))
+DEF_NEON_FUNCTION (vcvtq_low, neon_cvtbf16_widen,("Q0,QB"))
+#undef REQUIRED_EXTENSIONS
diff --git a/gcc/config/aarch64/aarch64-simd.md
b/gcc/config/aarch64/aarch64-simd.md
index fe6cb4250f6a..fe6ea2cd08f9 100644
--- a/gcc/config/aarch64/aarch64-simd.md
+++ b/gcc/config/aarch64/aarch64-simd.md
@@ -3455,25 +3455,47 @@
;; Convert between fixed-point and floating-point (vector modes)
-(define_insn "<FCVT_F2FIXED:fcvt_fixed_insn><VHSDF:mode>3"
+(define_insn "@fcvtzs<VHSDF:mode>3"
[(set (match_operand:<VHSDF:FCVT_TARGET> 0 "register_operand" "=w")
(unspec:<VHSDF:FCVT_TARGET>
[(match_operand:VHSDF 1 "register_operand" "w")
(match_operand:SI 2 "immediate_operand" "i")]
- FCVT_F2FIXED))]
+ UNSPEC_FCVTZS))]
"TARGET_SIMD"
- "<FCVT_F2FIXED:fcvt_fixed_insn>\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
+ "fcvtzs\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
[(set_attr "type" "neon_fp_to_int_<VHSDF:stype><q>")]
)
-(define_insn "<FCVT_FIXED2F:fcvt_fixed_insn><VDQ_HSDI:mode>3"
+(define_insn "@fcvtzu<VHSDF:mode>3"
+ [(set (match_operand:<VHSDF:FCVT_TARGET> 0 "register_operand" "=w")
+ (unspec:<VHSDF:FCVT_TARGET>
+ [(match_operand:VHSDF 1 "register_operand" "w")
+ (match_operand:SI 2 "immediate_operand" "i")]
+ UNSPEC_FCVTZU))]
+ "TARGET_SIMD"
+ "fcvtzu\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
+ [(set_attr "type" "neon_fp_to_int_<VHSDF:stype><q>")]
+)
+
+(define_insn "@scvtf<VDQ_HSDI:mode>3"
+ [(set (match_operand:<VDQ_HSDI:FCVT_TARGET> 0 "register_operand" "=w")
+ (unspec:<VDQ_HSDI:FCVT_TARGET>
+ [(match_operand:VDQ_HSDI 1 "register_operand" "w")
+ (match_operand:SI 2 "immediate_operand" "i")]
+ UNSPEC_SCVTF))]
+ "TARGET_SIMD"
+ "scvtf\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
+ [(set_attr "type" "neon_int_to_fp_<VDQ_HSDI:stype><q>")]
+)
+
+(define_insn "@ucvtf<VDQ_HSDI:mode>3"
[(set (match_operand:<VDQ_HSDI:FCVT_TARGET> 0 "register_operand" "=w")
(unspec:<VDQ_HSDI:FCVT_TARGET>
[(match_operand:VDQ_HSDI 1 "register_operand" "w")
(match_operand:SI 2 "immediate_operand" "i")]
- FCVT_FIXED2F))]
+ UNSPEC_UCVTF))]
"TARGET_SIMD"
- "<FCVT_FIXED2F:fcvt_fixed_insn>\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
+ "ucvtf\t%<v>0<Vmtype>, %<v>1<Vmtype>, #%2"
[(set_attr "type" "neon_int_to_fp_<VDQ_HSDI:stype><q>")]
)
diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
index 7c8915ec3890..6f232e9add84 100644
--- a/gcc/config/aarch64/aarch64.md
+++ b/gcc/config/aarch64/aarch64.md
@@ -7509,27 +7509,51 @@
;; Convert between fixed-point and floating-point (scalar modes)
-(define_insn "<FCVT_F2FIXED:fcvt_fixed_insn><GPF:mode>3"
+(define_insn "@fcvtzs<GPF:mode>3"
[(set (match_operand:<GPF:FCVT_TARGET> 0 "register_operand")
(unspec:<GPF:FCVT_TARGET> [(match_operand:GPF 1 "register_operand")
(match_operand:SI 2 "immediate_operand")]
- FCVT_F2FIXED))]
+ UNSPEC_FCVTZS))]
+ ""
+ {@ [ cons: =0 , 1 , 2 ; attrs: type , arch ]
+ [ r , w , i ; f_cvtf2i , fp ]
fcvtzs\t%<GPF:w1>0, %<GPF:s>1, #%2
+ [ w , w , i ; neon_fp_to_int_<GPF:Vetype> , simd ]
fcvtzs\t%<GPF:s>0, %<GPF:s>1, #%2
+ }
+)
+
+(define_insn "@fcvtzu<GPF:mode>3"
+ [(set (match_operand:<GPF:FCVT_TARGET> 0 "register_operand")
+ (unspec:<GPF:FCVT_TARGET> [(match_operand:GPF 1 "register_operand")
+ (match_operand:SI 2 "immediate_operand")]
+ UNSPEC_FCVTZU))]
""
{@ [ cons: =0 , 1 , 2 ; attrs: type , arch ]
- [ r , w , i ; f_cvtf2i , fp ]
<FCVT_F2FIXED:fcvt_fixed_insn>\t%<GPF:w1>0, %<GPF:s>1, #%2
- [ w , w , i ; neon_fp_to_int_<GPF:Vetype> , simd ]
<FCVT_F2FIXED:fcvt_fixed_insn>\t%<GPF:s>0, %<GPF:s>1, #%2
+ [ r , w , i ; f_cvtf2i , fp ]
fcvtzu\t%<GPF:w1>0, %<GPF:s>1, #%2
+ [ w , w , i ; neon_fp_to_int_<GPF:Vetype> , simd ]
fcvtzu\t%<GPF:s>0, %<GPF:s>1, #%2
}
)
-(define_insn "<FCVT_FIXED2F:fcvt_fixed_insn><GPI:mode>3"
+(define_insn "@scvtf<GPI:mode>3"
[(set (match_operand:<GPI:FCVT_TARGET> 0 "register_operand")
(unspec:<GPI:FCVT_TARGET> [(match_operand:GPI 1 "register_operand")
(match_operand:SI 2 "immediate_operand")]
- FCVT_FIXED2F))]
+ UNSPEC_SCVTF))]
+ ""
+ {@ [ cons: =0 , 1 , 2 ; attrs: type , arch ]
+ [ w , r , i ; f_cvti2f , fp ]
scvtf\t%<GPI:v>0, %<GPI:w>1, #%2
+ [ w , w , i ; neon_int_to_fp_<GPI:Vetype> , simd ]
scvtf\t%<GPI:v>0, %<GPI:v>1, #%2
+ }
+)
+
+(define_insn "@ucvtf<GPI:mode>3"
+ [(set (match_operand:<GPI:FCVT_TARGET> 0 "register_operand")
+ (unspec:<GPI:FCVT_TARGET> [(match_operand:GPI 1 "register_operand")
+ (match_operand:SI 2 "immediate_operand")]
+ UNSPEC_UCVTF))]
""
{@ [ cons: =0 , 1 , 2 ; attrs: type , arch ]
- [ w , r , i ; f_cvti2f , fp ]
<FCVT_FIXED2F:fcvt_fixed_insn>\t%<GPI:v>0, %<GPI:w>1, #%2
- [ w , w , i ; neon_int_to_fp_<GPI:Vetype> , simd ]
<FCVT_FIXED2F:fcvt_fixed_insn>\t%<GPI:v>0, %<GPI:v>1, #%2
+ [ w , r , i ; f_cvti2f , fp ]
ucvtf\t%<GPI:v>0, %<GPI:w>1, #%2
+ [ w , w , i ; neon_int_to_fp_<GPI:Vetype> , simd ]
ucvtf\t%<GPI:v>0, %<GPI:v>1, #%2
}
)
diff --git a/gcc/config/aarch64/arm_neon.h b/gcc/config/aarch64/arm_neon.h
index 873a1195d3ed..3313a2d4fcea 100644
--- a/gcc/config/aarch64/arm_neon.h
+++ b/gcc/config/aarch64/arm_neon.h
@@ -2109,27 +2109,6 @@ vaddlvq_u32 (uint32x4_t __a)
return __builtin_aarch64_uaddlvv4si_uu (__a);
}
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtx_f32_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_float_trunc_rodd_lo_v2sf (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtx_high_f32_f64 (float32x2_t __a, float64x2_t __b)
-{
- return __builtin_aarch64_float_trunc_rodd_hi_v4sf (__a, __b);
-}
-
-__extension__ extern __inline float32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtxd_f32_f64 (float64_t __a)
-{
- return __builtin_aarch64_float_trunc_rodd_df (__a);
-}
-
__extension__ extern __inline float32x2_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vmla_n_f32 (float32x2_t __a, float32x2_t __b, float32_t __c)
@@ -7290,1012 +7269,120 @@ vcltd_u64 (uint64_t __a, uint64_t __b)
return __a < __b ? -1ll : 0ll;
}
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltd_f64 (float64_t __a, float64_t __b)
-{
- return __a < __b ? -1ll : 0ll;
-}
-
-/* vcltz - vector. */
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_f32 (float32x2_t __a)
-{
- return (uint32x2_t) (__a < 0.0f);
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_f64 (float64x1_t __a)
-{
- return (uint64x1_t) (__a < (float64x1_t) {0.0});
-}
-
-__extension__ extern __inline uint8x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_s8 (int8x8_t __a)
-{
- return (uint8x8_t) (__a < 0);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_s16 (int16x4_t __a)
-{
- return (uint16x4_t) (__a < 0);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_s32 (int32x2_t __a)
-{
- return (uint32x2_t) (__a < 0);
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltz_s64 (int64x1_t __a)
-{
- return (uint64x1_t) (__a < __AARCH64_INT64_C (0));
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_f32 (float32x4_t __a)
-{
- return (uint32x4_t) (__a < 0.0f);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_f64 (float64x2_t __a)
-{
- return (uint64x2_t) (__a < 0.0);
-}
-
-__extension__ extern __inline uint8x16_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_s8 (int8x16_t __a)
-{
- return (uint8x16_t) (__a < 0);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_s16 (int16x8_t __a)
-{
- return (uint16x8_t) (__a < 0);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_s32 (int32x4_t __a)
-{
- return (uint32x4_t) (__a < 0);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzq_s64 (int64x2_t __a)
-{
- return (uint64x2_t) (__a < __AARCH64_INT64_C (0));
-}
-
-/* vcltz - scalar. */
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzs_f32 (float32_t __a)
-{
- return __a < 0.0f ? -1 : 0;
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzd_s64 (int64_t __a)
-{
- return __a < 0 ? -1ll : 0ll;
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcltzd_f64 (float64_t __a)
-{
- return __a < 0.0 ? -1ll : 0ll;
-}
-
-/* vcvt (double -> float). */
-
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f16_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_float_truncate_lo_v4hf (__a);
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_high_f16_f32 (float16x4_t __a, float32x4_t __b)
-{
- return __builtin_aarch64_float_truncate_hi_v8hf (__a, __b);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f32_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_float_truncate_lo_v2sf (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_high_f32_f64 (float32x2_t __a, float64x2_t __b)
-{
- return __builtin_aarch64_float_truncate_hi_v4sf (__a, __b);
-}
-
-/* vcvt (float -> double). */
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f32_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_float_extend_lo_v4sf (__a);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f64_f32 (float32x2_t __a)
-{
-
- return __builtin_aarch64_float_extend_lo_v2df (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_high_f32_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_vec_unpacks_hi_v8hf (__a);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_high_f64_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_vec_unpacks_hi_v4sf (__a);
-}
-
-/* vcvt (<u>fixed-point -> float). */
-
-__extension__ extern __inline float64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_n_f64_s64 (int64_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfdi (__a, __b);
-}
-
-__extension__ extern __inline float64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_n_f64_u64 (uint64_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfdi_sus (__a, __b);
-}
-
-__extension__ extern __inline float32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_n_f32_s32 (int32_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfsi (__a, __b);
-}
-
-__extension__ extern __inline float32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_n_f32_u32 (uint32_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfsi_sus (__a, __b);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f32_s32 (int32x2_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfv2si (__a, __b);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f32_u32 (uint32x2_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfv2si_sus (__a, __b);
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f64_s64 (int64x1_t __a, const int __b)
-{
- return (float64x1_t)
- { __builtin_aarch64_scvtfdi (vget_lane_s64 (__a, 0), __b) };
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f64_u64 (uint64x1_t __a, const int __b)
-{
- return (float64x1_t)
- { __builtin_aarch64_ucvtfdi_sus (vget_lane_u64 (__a, 0), __b) };
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f32_s32 (int32x4_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfv4si (__a, __b);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f32_u32 (uint32x4_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfv4si_sus (__a, __b);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f64_s64 (int64x2_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfv2di (__a, __b);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f64_u64 (uint64x2_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfv2di_sus (__a, __b);
-}
-
-/* vcvt (float -> <u>fixed-point). */
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_n_s64_f64 (float64_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsdf (__a, __b);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_n_u64_f64 (float64_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzudf_uss (__a, __b);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_n_s32_f32 (float32_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzssf (__a, __b);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_n_u32_f32 (float32_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzusf_uss (__a, __b);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_s32_f32 (float32x2_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsv2sf (__a, __b);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_u32_f32 (float32x2_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzuv2sf_uss (__a, __b);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_s64_f64 (float64x1_t __a, const int __b)
-{
- return (int64x1_t)
- { __builtin_aarch64_fcvtzsdf (vget_lane_f64 (__a, 0), __b) };
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_u64_f64 (float64x1_t __a, const int __b)
-{
- return (uint64x1_t)
- { __builtin_aarch64_fcvtzudf_uss (vget_lane_f64 (__a, 0), __b) };
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_s32_f32 (float32x4_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsv4sf (__a, __b);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_u32_f32 (float32x4_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzuv4sf_uss (__a, __b);
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_s64_f64 (float64x2_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsv2df (__a, __b);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_u64_f64 (float64x2_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzuv2df_uss (__a, __b);
-}
-
-/* vcvt (<u>int -> float) */
-
-__extension__ extern __inline float64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_f64_s64 (int64_t __a)
-{
- return (float64_t) __a;
-}
-
-__extension__ extern __inline float64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_f64_u64 (uint64_t __a)
-{
- return (float64_t) __a;
-}
-
-__extension__ extern __inline float32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_f32_s32 (int32_t __a)
-{
- return (float32_t) __a;
-}
-
-__extension__ extern __inline float32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_f32_u32 (uint32_t __a)
-{
- return (float32_t) __a;
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f32_s32 (int32x2_t __a)
-{
- return __builtin_aarch64_floatv2siv2sf (__a);
-}
-
-__extension__ extern __inline float32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f32_u32 (uint32x2_t __a)
-{
- return __builtin_aarch64_floatunsv2siv2sf ((int32x2_t) __a);
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f64_s64 (int64x1_t __a)
-{
- return (float64x1_t) { vget_lane_s64 (__a, 0) };
-}
-
-__extension__ extern __inline float64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f64_u64 (uint64x1_t __a)
-{
- return (float64x1_t) { vget_lane_u64 (__a, 0) };
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f32_s32 (int32x4_t __a)
-{
- return __builtin_aarch64_floatv4siv4sf (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f32_u32 (uint32x4_t __a)
-{
- return __builtin_aarch64_floatunsv4siv4sf ((int32x4_t) __a);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f64_s64 (int64x2_t __a)
-{
- return __builtin_aarch64_floatv2div2df (__a);
-}
-
-__extension__ extern __inline float64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f64_u64 (uint64x2_t __a)
-{
- return __builtin_aarch64_floatunsv2div2df ((int64x2_t) __a);
-}
-
-/* vcvt (float -> <u>int) */
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_s64_f64 (float64_t __a)
-{
- return (int64_t) __a;
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_s32_f64 (float64_t __a)
-{
- return (int32_t) __a;
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_u64_f64 (float64_t __a)
-{
- return (uint64_t) __a;
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtd_u32_f64 (float64_t __a)
-{
- return (uint32_t) __a;
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_s32_f32 (float32_t __a)
-{
- return (int32_t) __a;
-}
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_s64_f32 (float32_t __a)
-{
- return (int64_t) __a;
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_u32_f32 (float32_t __a)
-{
- return (uint32_t) __a;
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvts_u64_f32 (float32_t __a)
-{
- return (uint64_t) __a;
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_s32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lbtruncv2sfv2si (__a);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_u32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lbtruncuv2sfv2si_us (__a);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_s32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lbtruncv4sfv4si (__a);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_u32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lbtruncuv4sfv4si_us (__a);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_s64_f64 (float64x1_t __a)
-{
- return (int64x1_t) {vcvtd_s64_f64 (__a[0])};
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_u64_f64 (float64x1_t __a)
-{
- return (uint64x1_t) {vcvtd_u64_f64 (__a[0])};
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_s64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lbtruncv2dfv2di (__a);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_u64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lbtruncuv2dfv2di_us (__a);
-}
-
-/* vcvta */
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtad_s64_f64 (float64_t __a)
-{
- return __builtin_aarch64_lrounddfdi (__a);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtad_s32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lrounddfsi (__a);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtad_u64_f64 (float64_t __a)
-{
- return __builtin_aarch64_lroundudfdi_us (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtad_u32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lroundudfsi_us (__a);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtas_s32_f32 (float32_t __a)
-{
- return __builtin_aarch64_lroundsfsi (__a);
-}
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtas_s64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lroundsfdi (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtas_u32_f32 (float32_t __a)
-{
- return __builtin_aarch64_lroundusfsi_us (__a);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtas_u64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lroundusfdi_us (__a);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_s32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lroundv2sfv2si (__a);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_u32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lrounduv2sfv2si_us (__a);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_s32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lroundv4sfv4si (__a);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_u32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lrounduv4sfv4si_us (__a);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_s64_f64 (float64x1_t __a)
-{
- return (int64x1_t) {vcvtad_s64_f64 (__a[0])};
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_u64_f64 (float64x1_t __a)
-{
- return (uint64x1_t) {vcvtad_u64_f64 (__a[0])};
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_s64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lroundv2dfv2di (__a);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_u64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lrounduv2dfv2di_us (__a);
-}
-
-/* vcvtm */
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmd_s64_f64 (float64_t __a)
-{
- return __builtin_llfloor (__a);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmd_s32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfloordfsi (__a);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmd_u64_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfloorudfdi_us (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmd_u32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfloorudfsi_us (__a);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtms_s32_f32 (float32_t __a)
-{
- return __builtin_ifloorf (__a);
-}
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtms_s64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfloorsfdi (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtms_u32_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfloorusfsi_us (__a);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtms_u64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfloorusfdi_us (__a);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_s32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lfloorv2sfv2si (__a);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_u32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lflooruv2sfv2si_us (__a);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_s32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lfloorv4sfv4si (__a);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_u32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lflooruv4sfv4si_us (__a);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_s64_f64 (float64x1_t __a)
-{
- return (int64x1_t) {vcvtmd_s64_f64 (__a[0])};
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_u64_f64 (float64x1_t __a)
-{
- return (uint64x1_t) {vcvtmd_u64_f64 (__a[0])};
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_s64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lfloorv2dfv2di (__a);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_u64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lflooruv2dfv2di_us (__a);
-}
-
-/* vcvtn */
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnd_s64_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfrintndfdi (__a);
-}
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnd_s32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfrintndfsi (__a);
-}
-
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnd_u64_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfrintnudfdi_us (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnd_u32_f64 (float64_t __a)
-{
- return __builtin_aarch64_lfrintnudfsi_us (__a);
-}
-
-__extension__ extern __inline int32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtns_s32_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfrintnsfsi (__a);
-}
-
-__extension__ extern __inline int64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtns_s64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfrintnsfdi (__a);
-}
-
-__extension__ extern __inline uint32_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtns_u32_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfrintnusfsi_us (__a);
-}
-__extension__ extern __inline uint64_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtns_u64_f32 (float32_t __a)
-{
- return __builtin_aarch64_lfrintnusfdi_us (__a);
-}
-
-__extension__ extern __inline int32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_s32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lfrintnv2sfv2si (__a);
-}
-
-__extension__ extern __inline uint32x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_u32_f32 (float32x2_t __a)
-{
- return __builtin_aarch64_lfrintnuv2sfv2si_us (__a);
-}
-
-__extension__ extern __inline int32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_s32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lfrintnv4sfv4si (__a);
-}
-
-__extension__ extern __inline uint32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_u32_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_lfrintnuv4sfv4si_us (__a);
-}
-
-__extension__ extern __inline int64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_s64_f64 (float64x1_t __a)
-{
- return (int64x1_t) {vcvtnd_s64_f64 (__a[0])};
-}
-
-__extension__ extern __inline uint64x1_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_u64_f64 (float64x1_t __a)
-{
- return (uint64x1_t) {vcvtnd_u64_f64 (__a[0])};
-}
-
-__extension__ extern __inline int64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_s64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lfrintnv2dfv2di (__a);
-}
-
-__extension__ extern __inline uint64x2_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_u64_f64 (float64x2_t __a)
-{
- return __builtin_aarch64_lfrintnuv2dfv2di_us (__a);
-}
-
-/* vcvtp */
-
-__extension__ extern __inline int64_t
+__extension__ extern __inline uint64_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpd_s64_f64 (float64_t __a)
+vcltd_f64 (float64_t __a, float64_t __b)
{
- return __builtin_llceil (__a);
+ return __a < __b ? -1ll : 0ll;
}
-__extension__ extern __inline int32_t
+/* vcltz - vector. */
+
+__extension__ extern __inline uint32x2_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpd_s32_f64 (float64_t __a)
+vcltz_f32 (float32x2_t __a)
{
- return __builtin_aarch64_lceildfsi (__a);
+ return (uint32x2_t) (__a < 0.0f);
}
-__extension__ extern __inline uint64_t
+__extension__ extern __inline uint64x1_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpd_u64_f64 (float64_t __a)
+vcltz_f64 (float64x1_t __a)
{
- return __builtin_aarch64_lceiludfdi_us (__a);
+ return (uint64x1_t) (__a < (float64x1_t) {0.0});
}
-__extension__ extern __inline uint32_t
+__extension__ extern __inline uint8x8_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpd_u32_f64 (float64_t __a)
+vcltz_s8 (int8x8_t __a)
{
- return __builtin_aarch64_lceiludfsi_us (__a);
+ return (uint8x8_t) (__a < 0);
}
-__extension__ extern __inline int32_t
+__extension__ extern __inline uint16x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtps_s32_f32 (float32_t __a)
+vcltz_s16 (int16x4_t __a)
{
- return __builtin_iceilf (__a);
+ return (uint16x4_t) (__a < 0);
}
-__extension__ extern __inline int64_t
+__extension__ extern __inline uint32x2_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtps_s64_f32 (float32_t __a)
+vcltz_s32 (int32x2_t __a)
{
- return __builtin_aarch64_lceilsfdi (__a);
+ return (uint32x2_t) (__a < 0);
}
-__extension__ extern __inline uint32_t
+__extension__ extern __inline uint64x1_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtps_u32_f32 (float32_t __a)
+vcltz_s64 (int64x1_t __a)
{
- return __builtin_aarch64_lceilusfsi_us (__a);
+ return (uint64x1_t) (__a < __AARCH64_INT64_C (0));
}
-__extension__ extern __inline uint64_t
+__extension__ extern __inline uint32x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtps_u64_f32 (float32_t __a)
+vcltzq_f32 (float32x4_t __a)
{
- return __builtin_aarch64_lceilusfdi_us (__a);
+ return (uint32x4_t) (__a < 0.0f);
}
-__extension__ extern __inline int32x2_t
+__extension__ extern __inline uint64x2_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_s32_f32 (float32x2_t __a)
+vcltzq_f64 (float64x2_t __a)
{
- return __builtin_aarch64_lceilv2sfv2si (__a);
+ return (uint64x2_t) (__a < 0.0);
}
-__extension__ extern __inline uint32x2_t
+__extension__ extern __inline uint8x16_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_u32_f32 (float32x2_t __a)
+vcltzq_s8 (int8x16_t __a)
{
- return __builtin_aarch64_lceiluv2sfv2si_us (__a);
+ return (uint8x16_t) (__a < 0);
}
-__extension__ extern __inline int32x4_t
+__extension__ extern __inline uint16x8_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_s32_f32 (float32x4_t __a)
+vcltzq_s16 (int16x8_t __a)
{
- return __builtin_aarch64_lceilv4sfv4si (__a);
+ return (uint16x8_t) (__a < 0);
}
__extension__ extern __inline uint32x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_u32_f32 (float32x4_t __a)
+vcltzq_s32 (int32x4_t __a)
{
- return __builtin_aarch64_lceiluv4sfv4si_us (__a);
+ return (uint32x4_t) (__a < 0);
}
-__extension__ extern __inline int64x1_t
+__extension__ extern __inline uint64x2_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_s64_f64 (float64x1_t __a)
+vcltzq_s64 (int64x2_t __a)
{
- return (int64x1_t) {vcvtpd_s64_f64 (__a[0])};
+ return (uint64x2_t) (__a < __AARCH64_INT64_C (0));
}
-__extension__ extern __inline uint64x1_t
+/* vcltz - scalar. */
+
+__extension__ extern __inline uint32_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_u64_f64 (float64x1_t __a)
+vcltzs_f32 (float32_t __a)
{
- return (uint64x1_t) {vcvtpd_u64_f64 (__a[0])};
+ return __a < 0.0f ? -1 : 0;
}
-__extension__ extern __inline int64x2_t
+__extension__ extern __inline uint64_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_s64_f64 (float64x2_t __a)
+vcltzd_s64 (int64_t __a)
{
- return __builtin_aarch64_lceilv2dfv2di (__a);
+ return __a < 0 ? -1ll : 0ll;
}
-__extension__ extern __inline uint64x2_t
+__extension__ extern __inline uint64_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_u64_f64 (float64x2_t __a)
+vcltzd_f64 (float64_t __a)
{
- return __builtin_aarch64_lceiluv2dfv2di_us (__a);
+ return __a < 0.0 ? -1ll : 0ll;
}
/* vfma */
@@ -19825,174 +18912,6 @@ vcltzq_f16 (float16x8_t __a)
return __builtin_aarch64_cmltv8hf_uss (__a, vdupq_n_f16 (0.0f));
}
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f16_s16 (int16x4_t __a)
-{
- return __builtin_aarch64_floatv4hiv4hf (__a);
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f16_s16 (int16x8_t __a)
-{
- return __builtin_aarch64_floatv8hiv8hf (__a);
-}
-
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f16_u16 (uint16x4_t __a)
-{
- return __builtin_aarch64_floatunsv4hiv4hf ((int16x4_t) __a);
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_f16_u16 (uint16x8_t __a)
-{
- return __builtin_aarch64_floatunsv8hiv8hf ((int16x8_t) __a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_s16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lbtruncv4hfv4hi (__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_s16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lbtruncv8hfv8hi (__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_u16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lbtruncuv4hfv4hi_us (__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_u16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lbtruncuv8hfv8hi_us (__a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_s16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lroundv4hfv4hi (__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_s16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lroundv8hfv8hi (__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvta_u16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lrounduv4hfv4hi_us (__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtaq_u16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lrounduv8hfv8hi_us (__a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_s16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lfloorv4hfv4hi (__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_s16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lfloorv8hfv8hi (__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtm_u16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lflooruv4hfv4hi_us (__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtmq_u16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lflooruv8hfv8hi_us (__a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_s16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lfrintnv4hfv4hi (__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_s16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lfrintnv8hfv8hi (__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtn_u16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lfrintnuv4hfv4hi_us (__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtnq_u16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lfrintnuv8hfv8hi_us (__a);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_s16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lceilv4hfv4hi (__a);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_s16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lceilv8hfv8hi (__a);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtp_u16_f16 (float16x4_t __a)
-{
- return __builtin_aarch64_lceiluv4hfv4hi_us (__a);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtpq_u16_f16 (float16x8_t __a)
-{
- return __builtin_aarch64_lceiluv8hfv8hi_us (__a);
-}
-
__extension__ extern __inline float16x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vneg_f16 (float16x4_t __a)
@@ -20289,62 +19208,6 @@ vcltq_f16 (float16x8_t __a, float16x8_t __b)
return __builtin_aarch64_cmltv8hf_uss (__a, __b);
}
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f16_s16 (int16x4_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfv4hi (__a, __b);
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f16_s16 (int16x8_t __a, const int __b)
-{
- return __builtin_aarch64_scvtfv8hi (__a, __b);
-}
-
-__extension__ extern __inline float16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_f16_u16 (uint16x4_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfv4hi_sus (__a, __b);
-}
-
-__extension__ extern __inline float16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_f16_u16 (uint16x8_t __a, const int __b)
-{
- return __builtin_aarch64_ucvtfv8hi_sus (__a, __b);
-}
-
-__extension__ extern __inline int16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_s16_f16 (float16x4_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsv4hf (__a, __b);
-}
-
-__extension__ extern __inline int16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_s16_f16 (float16x8_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzsv8hf (__a, __b);
-}
-
-__extension__ extern __inline uint16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_n_u16_f16 (float16x4_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzuv4hf_uss (__a, __b);
-}
-
-__extension__ extern __inline uint16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_n_u16_f16 (float16x8_t __a, const int __b)
-{
- return __builtin_aarch64_fcvtzuv8hf_uss (__a, __b);
-}
-
__extension__ extern __inline float16x4_t
__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
vdiv_f16 (float16x4_t __a, float16x4_t __b)
@@ -22248,48 +21111,6 @@ vbfmlaltq_laneq_f32 (float32x4_t __r, bfloat16x8_t
__a, bfloat16x8_t __b,
return __builtin_aarch64_bfmlalt_lane_qv4sf (__r, __a, __b, __index);
}
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_f32_bf16 (bfloat16x4_t __a)
-{
- return __builtin_aarch64_vbfcvtv4bf (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_low_f32_bf16 (bfloat16x8_t __a)
-{
- return __builtin_aarch64_vbfcvtv8bf (__a);
-}
-
-__extension__ extern __inline float32x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_high_f32_bf16 (bfloat16x8_t __a)
-{
- return __builtin_aarch64_vbfcvt_highv8bf (__a);
-}
-
-__extension__ extern __inline bfloat16x4_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvt_bf16_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_bfcvtnv4bf (__a);
-}
-
-__extension__ extern __inline bfloat16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_low_bf16_f32 (float32x4_t __a)
-{
- return __builtin_aarch64_bfcvtn_qv8bf (__a);
-}
-
-__extension__ extern __inline bfloat16x8_t
-__attribute__ ((__always_inline__, __gnu_inline__, __artificial__))
-vcvtq_high_bf16_f32 (bfloat16x8_t __inactive, float32x4_t __a)
-{
- return __builtin_aarch64_bfcvtn2v8bf (__inactive, __a);
-}
-
__extension__ extern __inline bfloat16x4x2_t
__attribute__ ((__always_inline__, __gnu_inline__,__artificial__))
vld2_lane_bf16 (const bfloat16_t * __ptr, bfloat16x4x2_t __b, const int __c)
diff --git a/gcc/optabs.def b/gcc/optabs.def
index 9d95f047cb50..4a4b1ff98ffe 100644
--- a/gcc/optabs.def
+++ b/gcc/optabs.def
@@ -56,9 +56,15 @@ OPTAB_CL(sfloat_optab, "float$I$b$F$a2", FLOAT, "float",
gen_int_to_fp_conv_libf
OPTAB_CL(ufloat_optab, "floatuns$I$b$F$a2", UNSIGNED_FLOAT, NULL,
gen_ufloat_conv_libfunc)
OPTAB_CL(lrint_optab, "lrint$F$b$I$a2", UNKNOWN, "lrint",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lfrintn_optab, "lfrintn$F$b$I$a2", UNKNOWN, "lfrintn",
gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lround_optab, "lround$F$b$I$a2", UNKNOWN, "lround",
gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lfloor_optab, "lfloor$F$b$I$a2", UNKNOWN, "lfloor",
gen_int_to_fp_nondecimal_conv_libfunc)
OPTAB_CL(lceil_optab, "lceil$F$b$I$a2", UNKNOWN, "lceil",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lrintu_optab, "lrintu$F$b$I$a2", UNKNOWN, "lrintu",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lfrintnu_optab, "lfrintnu$F$b$I$a2", UNKNOWN, "lfrintnu",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lroundu_optab, "lroundu$F$b$I$a2", UNKNOWN, "lroundu",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lflooru_optab, "lflooru$F$b$I$a2", UNKNOWN, "lflooru",
gen_int_to_fp_nondecimal_conv_libfunc)
+OPTAB_CL(lceilu_optab, "lceilu$F$b$I$a2", UNKNOWN, "lceilu",
gen_int_to_fp_nondecimal_conv_libfunc)
/* Conversions for fixed-point modes and other modes. */
OPTAB_CL(fract_optab, "fract$b$a2", FRACT_CONVERT, "fract",
gen_fract_conv_libfunc)
diff --git
a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfcvtn-nobf16.c
b/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfcvtn-nobf16.c
deleted file mode 100644
index b3b6db123586..000000000000
--- a/gcc/testsuite/gcc.target/aarch64/advsimd-intrinsics/bfcvtn-nobf16.c
+++ /dev/null
@@ -1,10 +0,0 @@
-/* { dg-do assemble { target { aarch64*-*-* } } } */
-/* { dg-additional-options "-march=armv8.2-a+nobf16" } */
-
-#include <arm_neon.h>
-
-bfloat16x4_t test_bfcvtn (float32x4_t a)
-{
- /* { dg-error "inlining failed .* 'vcvt_bf16_f32" "" { target *-*-* } 0 } */
- return vcvt_bf16_f32 (a);
-}
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
b/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
index 844eef49d372..b37b7d321f0f 100644
--- a/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
+++ b/gcc/testsuite/gcc.target/aarch64/neon/arm_neon_test.h
@@ -7,6 +7,12 @@
#define TEST_UNARY(NAME, RET_TYPE, ARG_1_TYPE)
\
RET_TYPE test_##NAME (ARG_1_TYPE a) { return NAME (a); }
+#define TEST_UNARY_N(NAME, RET_TYPE, ARG1_TYPE, N) \
+ RET_TYPE test_##NAME (ARG1_TYPE a) \
+ { \
+ return NAME (a, N); \
+ }
+
#define TEST_UNIFORM_UNARY(NAME, TYPE) TEST_UNARY (NAME, TYPE, TYPE)
#define TEST_BINARY(NAME, RET_TYPE, ARG_1_TYPE, ARG_2_TYPE)
\
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvt.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvt.c
new file mode 100644
index 000000000000..35608cdff91d
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvt.c
@@ -0,0 +1,172 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvt_s32_f32:
+** fcvtzs v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvt_s32_f32, int32x2_t, float32x2_t)
+
+/*
+** test_vcvt_u32_f32:
+** fcvtzu v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvt_u32_f32, uint32x2_t, float32x2_t)
+
+/*
+** test_vcvt_s64_f64:
+** fcvtzs d0, d0
+** ret
+*/
+TEST_UNARY (vcvt_s64_f64, int64x1_t, float64x1_t)
+
+/*
+** test_vcvt_u64_f64:
+** fcvtzu d0, d0
+** ret
+*/
+TEST_UNARY (vcvt_u64_f64, uint64x1_t, float64x1_t)
+
+/*
+** test_vcvt_u16_f16:
+** fcvtzu v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvt_u16_f16, uint16x4_t, float16x4_t)
+
+/*
+** test_vcvt_s16_f16:
+** fcvtzs v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvt_s16_f16, int16x4_t, float16x4_t)
+
+/*
+** test_vcvt_f32_s32:
+** scvtf v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvt_f32_s32, float32x2_t, int32x2_t)
+
+/*
+** test_vcvt_f32_u32:
+** ucvtf v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvt_f32_u32, float32x2_t, uint32x2_t)
+
+/*
+** test_vcvt_f64_s64:
+** scvtf d0, d0
+** ret
+*/
+TEST_UNARY (vcvt_f64_s64, float64x1_t, int64x1_t)
+
+/*
+** test_vcvt_f64_u64:
+** ucvtf d0, d0
+** ret
+*/
+TEST_UNARY (vcvt_f64_u64, float64x1_t, uint64x1_t)
+
+/*
+** test_vcvt_f16_u16:
+** ucvtf v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvt_f16_u16, float16x4_t, uint16x4_t)
+
+/*
+** test_vcvt_f16_s16:
+** scvtf v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvt_f16_s16, float16x4_t, int16x4_t)
+
+/*
+** test_vcvtq_s32_f32:
+** fcvtzs v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtq_s32_f32, int32x4_t, float32x4_t)
+
+/*
+** test_vcvtq_u32_f32:
+** fcvtzu v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtq_u32_f32, uint32x4_t, float32x4_t)
+
+/*
+** test_vcvtq_s64_f64:
+** fcvtzs v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtq_s64_f64, int64x2_t, float64x2_t)
+
+/*
+** test_vcvtq_u64_f64:
+** fcvtzu v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtq_u64_f64, uint64x2_t, float64x2_t)
+
+/*
+** test_vcvtq_u16_f16:
+** fcvtzu v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtq_u16_f16, uint16x8_t, float16x8_t)
+
+/*
+** test_vcvtq_s16_f16:
+** fcvtzs v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtq_s16_f16, int16x8_t, float16x8_t)
+
+/*
+** test_vcvtq_f32_s32:
+** scvtf v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtq_f32_s32, float32x4_t, int32x4_t)
+
+/*
+** test_vcvtq_f32_u32:
+** ucvtf v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtq_f32_u32, float32x4_t, uint32x4_t)
+
+/*
+** test_vcvtq_f64_s64:
+** scvtf v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtq_f64_s64, float64x2_t, int64x2_t)
+
+/*
+** test_vcvtq_f64_u64:
+** ucvtf v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtq_f64_u64, float64x2_t, uint64x2_t)
+
+/*
+** test_vcvtq_f16_u16:
+** ucvtf v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtq_f16_u16, float16x8_t, uint16x8_t)
+
+/*
+** test_vcvtq_f16_s16:
+** scvtf v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtq_f16_s16, float16x8_t, int16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvt_highlo.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvt_highlo.c
new file mode 100644
index 000000000000..ac9f53fcb998
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvt_highlo.c
@@ -0,0 +1,123 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvt_f32_f16:
+** fcvtl v0.4s, v0.4h
+** ret
+*/
+TEST_UNARY (vcvt_f32_f16, float32x4_t, float16x4_t)
+
+/*
+** test_vcvt_f64_f32:
+** fcvtl v0.2d, v0.2s
+** ret
+*/
+TEST_UNARY (vcvt_f64_f32, float64x2_t, float32x2_t)
+
+/*
+** test_vcvt_f16_f32:
+** fcvtn v0.4h, v0.4s
+** ret
+*/
+TEST_UNARY (vcvt_f16_f32, float16x4_t, float32x4_t)
+
+/*
+** test_vcvt_f32_f64:
+** fcvtn v0.2s, v0.2d
+** ret
+*/
+TEST_UNARY (vcvt_f32_f64, float32x2_t, float64x2_t)
+
+/*
+** test_vcvt_high_f32_f16:
+** fcvtl2 v0.4s, v0.8h
+** ret
+*/
+TEST_UNARY (vcvt_high_f32_f16, float32x4_t, float16x8_t)
+
+/*
+** test_vcvt_high_f64_f32:
+** fcvtl2 v0.2d, v0.4s
+** ret
+*/
+TEST_UNARY (vcvt_high_f64_f32, float64x2_t, float32x4_t)
+
+/*
+** test_vcvt_high_f16_f32:
+** fcvtn2 v0.8h, v1.4s
+** ret
+*/
+TEST_BINARY (vcvt_high_f16_f32, float16x8_t, float16x4_t, float32x4_t)
+
+/*
+** test_vcvt_high_f32_f64:
+** fcvtn2 v0.4s, v1.2d
+** ret
+*/
+TEST_BINARY (vcvt_high_f32_f64, float32x4_t, float32x2_t, float64x2_t)
+
+/*
+** test_vcvtx_f32_f64:
+** fcvtxn v0.2s, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtx_f32_f64, float32x2_t, float64x2_t)
+
+/*
+** test_vcvtx_high_f32_f64:
+** fcvtxn2 v0.4s, v1.2d
+** ret
+*/
+TEST_BINARY (vcvtx_high_f32_f64, float32x4_t, float32x2_t, float64x2_t)
+
+/*
+** test_vcvtxd_f32_f64:
+** fcvtxn s0, d0
+** ret
+*/
+TEST_UNARY (vcvtxd_f32_f64, float32_t, float64_t)
+
+/*
+** test_vcvt_bf16_f32:
+** bfcvtn v0.4h, v0.4s
+** ret
+*/
+TEST_UNARY (vcvt_bf16_f32, bfloat16x4_t, float32x4_t)
+
+/*
+** test_vcvtq_high_bf16_f32:
+** bfcvtn2 v0.8h, v1.4s
+** ret
+*/
+TEST_BINARY (vcvtq_high_bf16_f32, bfloat16x8_t, bfloat16x8_t, float32x4_t)
+
+/*
+** test_vcvtq_low_bf16_f32:
+** bfcvtn v0.4h, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtq_low_bf16_f32, bfloat16x8_t, float32x4_t)
+
+/*
+** test_vcvt_f32_bf16:
+** shll v0.4s, v0.4h, #16
+** ret
+*/
+TEST_UNARY (vcvt_f32_bf16, float32x4_t, bfloat16x4_t)
+
+/*
+** test_vcvtq_high_f32_bf16:
+** shll2 v0.4s, v0.8h, #16
+** ret
+*/
+TEST_UNARY (vcvtq_high_f32_bf16, float32x4_t, bfloat16x8_t)
+
+/*
+** test_vcvtq_low_f32_bf16:
+** shll v0.4s, v0.4h, #16
+** ret
+*/
+TEST_UNARY (vcvtq_low_f32_bf16, float32x4_t, bfloat16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvt_n.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvt_n.c
new file mode 100644
index 000000000000..e2625c0a1824
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvt_n.c
@@ -0,0 +1,172 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvt_n_s32_f32:
+** fcvtzs v0.2s, v0.2s, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_s32_f32, int32x2_t, float32x2_t, 16)
+
+/*
+** test_vcvt_n_u32_f32:
+** fcvtzu v0.2s, v0.2s, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_u32_f32, uint32x2_t, float32x2_t, 16)
+
+/*
+** test_vcvt_n_s64_f64:
+** fcvtzs d0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_s64_f64, int64x1_t, float64x1_t, 16)
+
+/*
+** test_vcvt_n_u64_f64:
+** fcvtzu d0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_u64_f64, uint64x1_t, float64x1_t, 16)
+
+/*
+** test_vcvt_n_u16_f16:
+** fcvtzu v0.4h, v0.4h, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_u16_f16, uint16x4_t, float16x4_t, 16)
+
+/*
+** test_vcvt_n_s16_f16:
+** fcvtzs v0.4h, v0.4h, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_s16_f16, int16x4_t, float16x4_t, 16)
+
+/*
+** test_vcvt_n_f32_s32:
+** scvtf v0.2s, v0.2s, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f32_s32, float32x2_t, int32x2_t, 16)
+
+/*
+** test_vcvt_n_f32_u32:
+** ucvtf v0.2s, v0.2s, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f32_u32, float32x2_t, uint32x2_t, 16)
+
+/*
+** test_vcvt_n_f64_s64:
+** scvtf d0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f64_s64, float64x1_t, int64x1_t, 16)
+
+/*
+** test_vcvt_n_f64_u64:
+** ucvtf d0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f64_u64, float64x1_t, uint64x1_t, 16)
+
+/*
+** test_vcvt_n_f16_u16:
+** ucvtf v0.4h, v0.4h, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f16_u16, float16x4_t, uint16x4_t, 16)
+
+/*
+** test_vcvt_n_f16_s16:
+** scvtf v0.4h, v0.4h, #16
+** ret
+*/
+TEST_UNARY_N (vcvt_n_f16_s16, float16x4_t, int16x4_t, 16)
+
+/*
+** test_vcvtq_n_s32_f32:
+** fcvtzs v0.4s, v0.4s, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_s32_f32, int32x4_t, float32x4_t, 16)
+
+/*
+** test_vcvtq_n_u32_f32:
+** fcvtzu v0.4s, v0.4s, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_u32_f32, uint32x4_t, float32x4_t, 16)
+
+/*
+** test_vcvtq_n_s64_f64:
+** fcvtzs v0.2d, v0.2d, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_s64_f64, int64x2_t, float64x2_t, 16)
+
+/*
+** test_vcvtq_n_u64_f64:
+** fcvtzu v0.2d, v0.2d, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_u64_f64, uint64x2_t, float64x2_t, 16)
+
+/*
+** test_vcvtq_n_u16_f16:
+** fcvtzu v0.8h, v0.8h, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_u16_f16, uint16x8_t, float16x8_t, 16)
+
+/*
+** test_vcvtq_n_s16_f16:
+** fcvtzs v0.8h, v0.8h, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_s16_f16, int16x8_t, float16x8_t, 16)
+
+/*
+** test_vcvtq_n_f32_s32:
+** scvtf v0.4s, v0.4s, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f32_s32, float32x4_t, int32x4_t, 16)
+
+/*
+** test_vcvtq_n_f32_u32:
+** ucvtf v0.4s, v0.4s, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f32_u32, float32x4_t, uint32x4_t, 16)
+
+/*
+** test_vcvtq_n_f64_s64:
+** scvtf v0.2d, v0.2d, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f64_s64, float64x2_t, int64x2_t, 16)
+
+/*
+** test_vcvtq_n_f64_u64:
+** ucvtf v0.2d, v0.2d, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f64_u64, float64x2_t, uint64x2_t, 16)
+
+/*
+** test_vcvtq_n_f16_u16:
+** ucvtf v0.8h, v0.8h, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f16_u16, float16x8_t, uint16x8_t, 16)
+
+/*
+** test_vcvtq_n_f16_s16:
+** scvtf v0.8h, v0.8h, #16
+** ret
+*/
+TEST_UNARY_N (vcvtq_n_f16_s16, float16x8_t, int16x8_t, 16)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvta.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvta.c
new file mode 100644
index 000000000000..51dbefb082e4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvta.c
@@ -0,0 +1,90 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvta_s32_f32:
+** fcvtas v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvta_s32_f32, int32x2_t, float32x2_t)
+
+/*
+** test_vcvta_u32_f32:
+** fcvtau v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvta_u32_f32, uint32x2_t, float32x2_t)
+
+/*
+** test_vcvta_s64_f64:
+** fcvtas x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvta_s64_f64, int64x1_t, float64x1_t)
+
+/*
+** test_vcvta_u64_f64:
+** fcvtau x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvta_u64_f64, uint64x1_t, float64x1_t)
+
+/*
+** test_vcvta_u16_f16:
+** fcvtau v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvta_u16_f16, uint16x4_t, float16x4_t)
+
+/*
+** test_vcvta_s16_f16:
+** fcvtas v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvta_s16_f16, int16x4_t, float16x4_t)
+
+/*
+** test_vcvtaq_s32_f32:
+** fcvtas v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtaq_s32_f32, int32x4_t, float32x4_t)
+
+/*
+** test_vcvtaq_u32_f32:
+** fcvtau v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtaq_u32_f32, uint32x4_t, float32x4_t)
+
+/*
+** test_vcvtaq_s64_f64:
+** fcvtas v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtaq_s64_f64, int64x2_t, float64x2_t)
+
+/*
+** test_vcvtaq_u64_f64:
+** fcvtau v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtaq_u64_f64, uint64x2_t, float64x2_t)
+
+/*
+** test_vcvtaq_u16_f16:
+** fcvtau v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtaq_u16_f16, uint16x8_t, float16x8_t)
+
+/*
+** test_vcvtaq_s16_f16:
+** fcvtas v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtaq_s16_f16, int16x8_t, float16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvtd.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvtd.c
new file mode 100644
index 000000000000..c8620c29a0fd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvtd.c
@@ -0,0 +1,158 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvtd_s32_f64:
+** fcvtzs w0, d0
+** ret
+*/
+TEST_UNARY (vcvtd_s32_f64, int32_t, float64_t)
+
+/*
+** test_vcvtd_u32_f64:
+** fcvtzu w0, d0
+** ret
+*/
+TEST_UNARY (vcvtd_u32_f64, uint32_t, float64_t)
+
+/*
+** test_vcvtd_s64_f64:
+** fcvtzs x0, d0
+** ret
+*/
+TEST_UNARY (vcvtd_s64_f64, int64_t, float64_t)
+
+/*
+** test_vcvtd_u64_f64:
+** fcvtzu x0, d0
+** ret
+*/
+TEST_UNARY (vcvtd_u64_f64, uint64_t, float64_t)
+
+/*
+** test_vcvtd_f64_s64:
+** scvtf d0, x0
+** ret
+*/
+TEST_UNARY (vcvtd_f64_s64, float64_t, int64_t)
+
+/*
+** test_vcvtd_f64_u64:
+** ucvtf d0, x0
+** ret
+*/
+TEST_UNARY (vcvtd_f64_u64, float64_t, uint64_t)
+
+/*
+** test_vcvtad_s32_f64:
+** fcvtas w0, d0
+** ret
+*/
+TEST_UNARY (vcvtad_s32_f64, int32_t, float64_t)
+
+/*
+** test_vcvtad_u32_f64:
+** fcvtau w0, d0
+** ret
+*/
+TEST_UNARY (vcvtad_u32_f64, uint32_t, float64_t)
+
+/*
+** test_vcvtad_s64_f64:
+** fcvtas x0, d0
+** ret
+*/
+TEST_UNARY (vcvtad_s64_f64, int64_t, float64_t)
+
+/*
+** test_vcvtad_u64_f64:
+** fcvtau x0, d0
+** ret
+*/
+TEST_UNARY (vcvtad_u64_f64, uint64_t, float64_t)
+
+/*
+** test_vcvtmd_s32_f64:
+** fcvtms w0, d0
+** ret
+*/
+TEST_UNARY (vcvtmd_s32_f64, int32_t, float64_t)
+
+/*
+** test_vcvtmd_u32_f64:
+** fcvtmu w0, d0
+** ret
+*/
+TEST_UNARY (vcvtmd_u32_f64, uint32_t, float64_t)
+
+/*
+** test_vcvtmd_s64_f64:
+** fcvtms x0, d0
+** ret
+*/
+TEST_UNARY (vcvtmd_s64_f64, int64_t, float64_t)
+
+/*
+** test_vcvtmd_u64_f64:
+** fcvtmu x0, d0
+** ret
+*/
+TEST_UNARY (vcvtmd_u64_f64, uint64_t, float64_t)
+
+/*
+** test_vcvtpd_s32_f64:
+** fcvtps w0, d0
+** ret
+*/
+TEST_UNARY (vcvtpd_s32_f64, int32_t, float64_t)
+
+/*
+** test_vcvtpd_u32_f64:
+** fcvtpu w0, d0
+** ret
+*/
+TEST_UNARY (vcvtpd_u32_f64, uint32_t, float64_t)
+
+/*
+** test_vcvtpd_s64_f64:
+** fcvtps x0, d0
+** ret
+*/
+TEST_UNARY (vcvtpd_s64_f64, int64_t, float64_t)
+
+/*
+** test_vcvtpd_u64_f64:
+** fcvtpu x0, d0
+** ret
+*/
+TEST_UNARY (vcvtpd_u64_f64, uint64_t, float64_t)
+
+/*
+** test_vcvtnd_s32_f64:
+** fcvtns w0, d0
+** ret
+*/
+TEST_UNARY (vcvtnd_s32_f64, int32_t, float64_t)
+
+/*
+** test_vcvtnd_u32_f64:
+** fcvtnu w0, d0
+** ret
+*/
+TEST_UNARY (vcvtnd_u32_f64, uint32_t, float64_t)
+
+/*
+** test_vcvtnd_s64_f64:
+** fcvtns x0, d0
+** ret
+*/
+TEST_UNARY (vcvtnd_s64_f64, int64_t, float64_t)
+
+/*
+** test_vcvtnd_u64_f64:
+** fcvtnu x0, d0
+** ret
+*/
+TEST_UNARY (vcvtnd_u64_f64, uint64_t, float64_t)
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvtds_n.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvtds_n.c
new file mode 100644
index 000000000000..36b2da1cf49b
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvtds_n.c
@@ -0,0 +1,59 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvtd_n_s64_f64:
+** fcvtzs x0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvtd_n_s64_f64, int64_t, float64_t, 16)
+
+/*
+** test_vcvtd_n_u64_f64:
+** fcvtzu x0, d0, #16
+** ret
+*/
+TEST_UNARY_N (vcvtd_n_u64_f64, uint64_t, float64_t, 16)
+
+/*
+** test_vcvtd_n_f64_s64:
+** scvtf d0, x0, #16
+** ret
+*/
+TEST_UNARY_N (vcvtd_n_f64_s64, float64_t, int64_t, 16)
+
+/*
+** test_vcvtd_n_f64_u64:
+** ucvtf d0, x0, #16
+** ret
+*/
+TEST_UNARY_N (vcvtd_n_f64_u64, float64_t, uint64_t, 16)
+/*
+** test_vcvts_n_s32_f32:
+** fcvtzs w0, s0, #16
+** ret
+*/
+TEST_UNARY_N (vcvts_n_s32_f32, int32_t, float32_t, 16)
+
+/*
+** test_vcvts_n_u32_f32:
+** fcvtzu w0, s0, #16
+** ret
+*/
+TEST_UNARY_N (vcvts_n_u32_f32, uint32_t, float32_t, 16)
+
+/*
+** test_vcvts_n_f32_s32:
+** scvtf s0, w0, #16
+** ret
+*/
+TEST_UNARY_N (vcvts_n_f32_s32, float32_t, int32_t, 16)
+
+/*
+** test_vcvts_n_f32_u32:
+** ucvtf s0, w0, #16
+** ret
+*/
+TEST_UNARY_N (vcvts_n_f32_u32, float32_t, uint32_t, 16)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvtm.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvtm.c
new file mode 100644
index 000000000000..8fb70b8d405e
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvtm.c
@@ -0,0 +1,90 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvtm_s32_f32:
+** fcvtms v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtm_s32_f32, int32x2_t, float32x2_t)
+
+/*
+** test_vcvtm_u32_f32:
+** fcvtmu v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtm_u32_f32, uint32x2_t, float32x2_t)
+
+/*
+** test_vcvtm_s64_f64:
+** fcvtms x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtm_s64_f64, int64x1_t, float64x1_t)
+
+/*
+** test_vcvtm_u64_f64:
+** fcvtmu x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtm_u64_f64, uint64x1_t, float64x1_t)
+
+/*
+** test_vcvtm_u16_f16:
+** fcvtmu v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtm_u16_f16, uint16x4_t, float16x4_t)
+
+/*
+** test_vcvtm_s16_f16:
+** fcvtms v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtm_s16_f16, int16x4_t, float16x4_t)
+
+/*
+** test_vcvtmq_s32_f32:
+** fcvtms v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtmq_s32_f32, int32x4_t, float32x4_t)
+
+/*
+** test_vcvtmq_u32_f32:
+** fcvtmu v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtmq_u32_f32, uint32x4_t, float32x4_t)
+
+/*
+** test_vcvtmq_s64_f64:
+** fcvtms v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtmq_s64_f64, int64x2_t, float64x2_t)
+
+/*
+** test_vcvtmq_u64_f64:
+** fcvtmu v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtmq_u64_f64, uint64x2_t, float64x2_t)
+
+/*
+** test_vcvtmq_u16_f16:
+** fcvtmu v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtmq_u16_f16, uint16x8_t, float16x8_t)
+
+/*
+** test_vcvtmq_s16_f16:
+** fcvtms v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtmq_s16_f16, int16x8_t, float16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvtn.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvtn.c
new file mode 100644
index 000000000000..2d5daa044395
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvtn.c
@@ -0,0 +1,90 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvtn_s32_f32:
+** fcvtns v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtn_s32_f32, int32x2_t, float32x2_t)
+
+/*
+** test_vcvtn_u32_f32:
+** fcvtnu v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtn_u32_f32, uint32x2_t, float32x2_t)
+
+/*
+** test_vcvtn_s64_f64:
+** fcvtns x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtn_s64_f64, int64x1_t, float64x1_t)
+
+/*
+** test_vcvtn_u64_f64:
+** fcvtnu x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtn_u64_f64, uint64x1_t, float64x1_t)
+
+/*
+** test_vcvtn_u16_f16:
+** fcvtnu v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtn_u16_f16, uint16x4_t, float16x4_t)
+
+/*
+** test_vcvtn_s16_f16:
+** fcvtns v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtn_s16_f16, int16x4_t, float16x4_t)
+
+/*
+** test_vcvtnq_s32_f32:
+** fcvtns v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtnq_s32_f32, int32x4_t, float32x4_t)
+
+/*
+** test_vcvtnq_u32_f32:
+** fcvtnu v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtnq_u32_f32, uint32x4_t, float32x4_t)
+
+/*
+** test_vcvtnq_s64_f64:
+** fcvtns v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtnq_s64_f64, int64x2_t, float64x2_t)
+
+/*
+** test_vcvtnq_u64_f64:
+** fcvtnu v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtnq_u64_f64, uint64x2_t, float64x2_t)
+
+/*
+** test_vcvtnq_u16_f16:
+** fcvtnu v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtnq_u16_f16, uint16x8_t, float16x8_t)
+
+/*
+** test_vcvtnq_s16_f16:
+** fcvtns v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtnq_s16_f16, int16x8_t, float16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvtp.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvtp.c
new file mode 100644
index 000000000000..945bd3dd68b4
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvtp.c
@@ -0,0 +1,90 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvtp_s32_f32:
+** fcvtps v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtp_s32_f32, int32x2_t, float32x2_t)
+
+/*
+** test_vcvtp_u32_f32:
+** fcvtpu v0.2s, v0.2s
+** ret
+*/
+TEST_UNARY (vcvtp_u32_f32, uint32x2_t, float32x2_t)
+
+/*
+** test_vcvtp_s64_f64:
+** fcvtps x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtp_s64_f64, int64x1_t, float64x1_t)
+
+/*
+** test_vcvtp_u64_f64:
+** fcvtpu x0, d0
+** fmov d0, x0
+** ret
+*/
+TEST_UNARY (vcvtp_u64_f64, uint64x1_t, float64x1_t)
+
+/*
+** test_vcvtp_u16_f16:
+** fcvtpu v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtp_u16_f16, uint16x4_t, float16x4_t)
+
+/*
+** test_vcvtp_s16_f16:
+** fcvtps v0.4h, v0.4h
+** ret
+*/
+TEST_UNARY (vcvtp_s16_f16, int16x4_t, float16x4_t)
+
+/*
+** test_vcvtpq_s32_f32:
+** fcvtps v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtpq_s32_f32, int32x4_t, float32x4_t)
+
+/*
+** test_vcvtpq_u32_f32:
+** fcvtpu v0.4s, v0.4s
+** ret
+*/
+TEST_UNARY (vcvtpq_u32_f32, uint32x4_t, float32x4_t)
+
+/*
+** test_vcvtpq_s64_f64:
+** fcvtps v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtpq_s64_f64, int64x2_t, float64x2_t)
+
+/*
+** test_vcvtpq_u64_f64:
+** fcvtpu v0.2d, v0.2d
+** ret
+*/
+TEST_UNARY (vcvtpq_u64_f64, uint64x2_t, float64x2_t)
+
+/*
+** test_vcvtpq_u16_f16:
+** fcvtpu v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtpq_u16_f16, uint16x8_t, float16x8_t)
+
+/*
+** test_vcvtpq_s16_f16:
+** fcvtps v0.8h, v0.8h
+** ret
+*/
+TEST_UNARY (vcvtpq_s16_f16, int16x8_t, float16x8_t)
\ No newline at end of file
diff --git a/gcc/testsuite/gcc.target/aarch64/neon/vcvts.c
b/gcc/testsuite/gcc.target/aarch64/neon/vcvts.c
new file mode 100644
index 000000000000..f7fdded8a977
--- /dev/null
+++ b/gcc/testsuite/gcc.target/aarch64/neon/vcvts.c
@@ -0,0 +1,158 @@
+/* { dg-do compile } */
+/* { dg-final { check-function-bodies "**" "" } } */
+
+#include "arm_neon_test.h"
+
+/*
+** test_vcvts_s32_f32:
+** fcvtzs w0, s0
+** ret
+*/
+TEST_UNARY (vcvts_s32_f32, int32_t, float32_t)
+
+/*
+** test_vcvts_u32_f32:
+** fcvtzu w0, s0
+** ret
+*/
+TEST_UNARY (vcvts_u32_f32, uint32_t, float32_t)
+
+/*
+** test_vcvts_s64_f32:
+** fcvtzs x0, s0
+** ret
+*/
+TEST_UNARY (vcvts_s64_f32, int64_t, float32_t)
+
+/*
+** test_vcvts_u64_f32:
+** fcvtzu x0, s0
+** ret
+*/
+TEST_UNARY (vcvts_u64_f32, uint64_t, float32_t)
+
+/*
+** test_vcvts_f32_s32:
+** scvtf s0, w0
+** ret
+*/
+TEST_UNARY (vcvts_f32_s32, float32_t, int32_t)
+
+/*
+** test_vcvts_f32_u32:
+** ucvtf s0, w0
+** ret
+*/
+TEST_UNARY (vcvts_f32_u32, float32_t, uint32_t)
+
+/*
+** test_vcvtas_s32_f32:
+** fcvtas w0, s0
+** ret
+*/
+TEST_UNARY (vcvtas_s32_f32, int32_t, float32_t)
+
+/*
+** test_vcvtas_u32_f32:
+** fcvtau w0, s0
+** ret
+*/
+TEST_UNARY (vcvtas_u32_f32, uint32_t, float32_t)
+
+/*
+** test_vcvtas_s64_f32:
+** fcvtas x0, s0
+** ret
+*/
+TEST_UNARY (vcvtas_s64_f32, int64_t, float32_t)
+
+/*
+** test_vcvtas_u64_f32:
+** fcvtau x0, s0
+** ret
+*/
+TEST_UNARY (vcvtas_u64_f32, uint64_t, float32_t)
+
+/*
+** test_vcvtms_s32_f32:
+** fcvtms w0, s0
+** ret
+*/
+TEST_UNARY (vcvtms_s32_f32, int32_t, float32_t)
+
+/*
+** test_vcvtms_u32_f32:
+** fcvtmu w0, s0
+** ret
+*/
+TEST_UNARY (vcvtms_u32_f32, uint32_t, float32_t)
+
+/*
+** test_vcvtms_s64_f32:
+** fcvtms x0, s0
+** ret
+*/
+TEST_UNARY (vcvtms_s64_f32, int64_t, float32_t)
+
+/*
+** test_vcvtms_u64_f32:
+** fcvtmu x0, s0
+** ret
+*/
+TEST_UNARY (vcvtms_u64_f32, uint64_t, float32_t)
+
+/*
+** test_vcvtps_s32_f32:
+** fcvtps w0, s0
+** ret
+*/
+TEST_UNARY (vcvtps_s32_f32, int32_t, float32_t)
+
+/*
+** test_vcvtps_u32_f32:
+** fcvtpu w0, s0
+** ret
+*/
+TEST_UNARY (vcvtps_u32_f32, uint32_t, float32_t)
+
+/*
+** test_vcvtps_s64_f32:
+** fcvtps x0, s0
+** ret
+*/
+TEST_UNARY (vcvtps_s64_f32, int64_t, float32_t)
+
+/*
+** test_vcvtps_u64_f32:
+** fcvtpu x0, s0
+** ret
+*/
+TEST_UNARY (vcvtps_u64_f32, uint64_t, float32_t)
+
+/*
+** test_vcvtns_s32_f32:
+** fcvtns w0, s0
+** ret
+*/
+TEST_UNARY (vcvtns_s32_f32, int32_t, float32_t)
+
+/*
+** test_vcvtns_u32_f32:
+** fcvtnu w0, s0
+** ret
+*/
+TEST_UNARY (vcvtns_u32_f32, uint32_t, float32_t)
+
+/*
+** test_vcvtns_s64_f32:
+** fcvtns x0, s0
+** ret
+*/
+TEST_UNARY (vcvtns_s64_f32, int64_t, float32_t)
+
+/*
+** test_vcvtns_u64_f32:
+** fcvtnu x0, s0
+** ret
+*/
+TEST_UNARY (vcvtns_u64_f32, uint64_t, float32_t)
--
2.34.1