We take no action to ensure the SVE vector size is large enough. It is left to the user to check that before compiling this intrinsic or before running such a program on a machine.
The main difference between ld1ro and ld1rq is in the allowed offsets, the implementation difference is that ld1ro is implemented using integer modes since there are no pre-existing vector modes of the relevant size. Adding new vector modes simply for this intrinsic seems to make the code less tidy. Specifications can be found under the "Arm C Language Extensions for Scalable Vector Extension" title at https://developer.arm.com/architectures/system-architectures/software-standards/acle gcc/ChangeLog: 2020-01-09 Matthew Malcomson <matthew.malcom...@arm.com> * config/aarch64/aarch64-protos.h (aarch64_sve_ld1ro_operand_p): New. * config/aarch64/aarch64-sve-builtins-base.cc (class load_replicate): New. (class svld1ro_impl): New. (class svld1rq_impl): Change to inherit from load_replicate. (svld1ro): New sve intrinsic function base. * config/aarch64/aarch64-sve-builtins-base.def (svld1ro): New DEF_SVE_FUNCTION. * config/aarch64/aarch64-sve-builtins-base.h (svld1ro): New decl. * config/aarch64/aarch64-sve-builtins.cc (function_expander::add_mem_operand): Modify assert to allow OImode. * config/aarch64/aarch64-sve.md (@aarch64_sve_ld1ro<mode>): New pattern. * config/aarch64/aarch64.c (aarch64_sve_ld1rq_operand_p): Implement in terms of ... (aarch64_sve_ld1rq_ld1ro_operand_p): This. (aarch64_sve_ld1ro_operand_p): New. * config/aarch64/aarch64.md (UNSPEC_LD1RO): New unspec. * config/aarch64/constraints.md (UOb,UOh,UOw,UOd): New. * config/aarch64/predicates.md (aarch64_sve_ld1ro_operand_{b,h,w,d}): New. gcc/testsuite/ChangeLog: 2020-01-09 Matthew Malcomson <matthew.malcom...@arm.com> * gcc.target/aarch64/sve/acle/asm/ld1ro_f16.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_f32.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_f64.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_s16.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_s32.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_s64.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_s8.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_u16.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_u32.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_u64.c: New test. * gcc.target/aarch64/sve/acle/asm/ld1ro_u8.c: New test. ############### Attachment also inlined for ease of reply ############### diff --git a/gcc/config/aarch64/aarch64-protos.h b/gcc/config/aarch64/aarch64-protos.h index c16b9362ea986ff221755bfc4d10bae674a67ed4..6d2162b93932e433677dae48e5c58975be2902d2 100644 --- a/gcc/config/aarch64/aarch64-protos.h +++ b/gcc/config/aarch64/aarch64-protos.h @@ -582,6 +582,7 @@ rtx aarch64_simd_gen_const_vector_dup (machine_mode, HOST_WIDE_INT); bool aarch64_simd_mem_operand_p (rtx); bool aarch64_sve_ld1r_operand_p (rtx); bool aarch64_sve_ld1rq_operand_p (rtx); +bool aarch64_sve_ld1ro_operand_p (rtx, scalar_mode); bool aarch64_sve_ldff1_operand_p (rtx); bool aarch64_sve_ldnf1_operand_p (rtx); bool aarch64_sve_ldr_operand_p (rtx); diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.cc b/gcc/config/aarch64/aarch64-sve-builtins-base.cc index 38bd3adce1ebbde4c58531ffd26eedd4ae4938b0..e52a6012565fadd84cdd77a613f887e5ae53a576 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.cc @@ -1139,7 +1139,7 @@ public: } }; -class svld1rq_impl : public function_base +class load_replicate : public function_base { public: unsigned int @@ -1153,7 +1153,11 @@ public: { return fi.scalar_type (0); } +}; +class svld1rq_impl : public load_replicate +{ +public: machine_mode memory_vector_mode (const function_instance &fi) const OVERRIDE { @@ -1168,6 +1172,23 @@ public: } }; +class svld1ro_impl : public load_replicate +{ +public: + machine_mode + memory_vector_mode (const function_instance &fi) const OVERRIDE + { + return OImode; + } + + rtx + expand (function_expander &e) const OVERRIDE + { + insn_code icode = code_for_aarch64_sve_ld1ro (e.vector_mode (0)); + return e.use_contiguous_load_insn (icode); + } +}; + /* Implements svld2, svld3 and svld4. */ class svld234_impl : public full_width_access { @@ -2571,6 +2592,7 @@ FUNCTION (svlasta, svlast_impl, (UNSPEC_LASTA)) FUNCTION (svlastb, svlast_impl, (UNSPEC_LASTB)) FUNCTION (svld1, svld1_impl,) FUNCTION (svld1_gather, svld1_gather_impl,) +FUNCTION (svld1ro, svld1ro_impl,) FUNCTION (svld1rq, svld1rq_impl,) FUNCTION (svld1sb, svld1_extend_impl, (TYPE_SUFFIX_s8)) FUNCTION (svld1sb_gather, svld1_gather_extend_impl, (TYPE_SUFFIX_s8)) diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.def b/gcc/config/aarch64/aarch64-sve-builtins-base.def index a678ee8f4eebad5a8be113968a08185f1fe848d7..d0a761720c435b934b8bca43a70ab9cccd2edc2e 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.def +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.def @@ -316,3 +316,7 @@ DEF_SVE_FUNCTION (svzip1, binary_pred, all_pred, none) DEF_SVE_FUNCTION (svzip2, binary, all_data, none) DEF_SVE_FUNCTION (svzip2, binary_pred, all_pred, none) #undef REQUIRED_EXTENSIONS + +#define REQUIRED_EXTENSIONS AARCH64_FL_V8_6 | AARCH64_FL_F64MM +DEF_SVE_FUNCTION (svld1ro, load_replicate, all_data, implicit) +#undef REQUIRED_EXTENSIONS diff --git a/gcc/config/aarch64/aarch64-sve-builtins-base.h b/gcc/config/aarch64/aarch64-sve-builtins-base.h index 41ab12f4e35460603657e3b4f324545b5d10442f..d88aed8e30b97c6ad0a1699b971588e2aeaebcfa 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins-base.h +++ b/gcc/config/aarch64/aarch64-sve-builtins-base.h @@ -108,6 +108,7 @@ namespace aarch64_sve extern const function_base *const svlastb; extern const function_base *const svld1; extern const function_base *const svld1_gather; + extern const function_base *const svld1ro; extern const function_base *const svld1rq; extern const function_base *const svld1sb; extern const function_base *const svld1sb_gather; diff --git a/gcc/config/aarch64/aarch64-sve-builtins.cc b/gcc/config/aarch64/aarch64-sve-builtins.cc index 88a8b791df713ddacaf3808588ce864416886c57..6089cf23281e54f5b0f32ff5b1858db47f705ee5 100644 --- a/gcc/config/aarch64/aarch64-sve-builtins.cc +++ b/gcc/config/aarch64/aarch64-sve-builtins.cc @@ -2525,7 +2525,11 @@ function_expander::add_integer_operand (HOST_WIDE_INT x) void function_expander::add_mem_operand (machine_mode mode, rtx addr) { - gcc_assert (VECTOR_MODE_P (mode)); + /* Exception for OImode for the ld1ro intrinsics. + They act on 256 bit octaword data, and it's just easier to use a scalar + mode to represent that than add a new vector mode solely for the purpose + of this intrinsic. */ + gcc_assert (VECTOR_MODE_P (mode) || mode == OImode); rtx mem = gen_rtx_MEM (mode, memory_address (mode, addr)); /* The memory is only guaranteed to be element-aligned. */ set_mem_align (mem, GET_MODE_ALIGNMENT (GET_MODE_INNER (mode))); diff --git a/gcc/config/aarch64/aarch64-sve.md b/gcc/config/aarch64/aarch64-sve.md index 4427609b57907c47f6abd23a6137babd65586e3f..202503a4f336358f4ffbcb2f3c8f1210882852df 100644 --- a/gcc/config/aarch64/aarch64-sve.md +++ b/gcc/config/aarch64/aarch64-sve.md @@ -2494,6 +2494,20 @@ } ) +(define_insn "@aarch64_sve_ld1ro<mode>" + [(set (match_operand:SVE_FULL 0 "register_operand" "=w") + (unspec:SVE_FULL + [(match_operand:<VPRED> 2 "register_operand" "Upl") + (match_operand:OI 1 "aarch64_sve_ld1ro_operand_<Vesize>" + "UO<Vesize>")] + UNSPEC_LD1RO))] + "TARGET_SVE && TARGET_ARMV8_6" + { + operands[1] = gen_rtx_MEM (<VEL>mode, XEXP (operands[1], 0)); + return "ld1ro<Vesize>\t%0.<Vetype>, %2/z, %1"; + } +) + ;; ------------------------------------------------------------------------- ;; ---- [INT,FP] Initialize from individual elements ;; ------------------------------------------------------------------------- diff --git a/gcc/config/aarch64/aarch64.c b/gcc/config/aarch64/aarch64.c index a3b18b381e1748f8fe5e522bdec4f7c850821fe8..f1b1a68fbc33449b6e6bd8cca1badfd41ac5a424 100644 --- a/gcc/config/aarch64/aarch64.c +++ b/gcc/config/aarch64/aarch64.c @@ -17073,18 +17073,20 @@ aarch64_sve_ld1r_operand_p (rtx op) && offset_6bit_unsigned_scaled_p (mode, addr.const_offset)); } -/* Return true if OP is a valid MEM operand for an SVE LD1RQ instruction. */ +/* Return true if OP is a valid MEM operand for an SVE LD1R{Q,O} instruction + where the size of the read data is specified by `mode` and the size of the + vector elements are specified by `elem_mode`. */ bool -aarch64_sve_ld1rq_operand_p (rtx op) +aarch64_sve_ld1rq_ld1ro_operand_p (rtx op, machine_mode mode, + scalar_mode elem_mode) { struct aarch64_address_info addr; - scalar_mode elem_mode = GET_MODE_INNER (GET_MODE (op)); if (!MEM_P (op) || !aarch64_classify_address (&addr, XEXP (op, 0), elem_mode, false)) return false; if (addr.type == ADDRESS_REG_IMM) - return offset_4bit_signed_scaled_p (TImode, addr.const_offset); + return offset_4bit_signed_scaled_p (mode, addr.const_offset); if (addr.type == ADDRESS_REG_REG) return (1U << addr.shift) == GET_MODE_SIZE (elem_mode); @@ -17092,6 +17094,22 @@ aarch64_sve_ld1rq_operand_p (rtx op) return false; } +/* Return true if OP is a valid MEM operand for an SVE LD1RQ instruction. */ +bool +aarch64_sve_ld1rq_operand_p (rtx op) +{ + return aarch64_sve_ld1rq_ld1ro_operand_p (op, TImode, + GET_MODE_INNER (GET_MODE (op))); +} + +/* Return true if OP is a valid MEM operand for an SVE LD1RO instruction for + accessing a vector where the element size is specified by `elem_mode`. */ +bool +aarch64_sve_ld1ro_operand_p (rtx op, scalar_mode elem_mode) +{ + return aarch64_sve_ld1rq_ld1ro_operand_p (op, OImode, elem_mode); +} + /* Return true if OP is a valid MEM operand for an SVE LDFF1 instruction. */ bool aarch64_sve_ldff1_operand_p (rtx op) diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index b11ead7ab23d78bb5b45662fecb73dd0f4e0fda0..db8aa40c8bfa7558a590e5fc25841cb8cab3c9fc 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -273,6 +273,7 @@ UNSPEC_GEN_TAG ; Generate a 4-bit MTE tag. UNSPEC_GEN_TAG_RND ; Generate a random 4-bit MTE tag. UNSPEC_TAG_SPACE ; Translate address to MTE tag address space. + UNSPEC_LD1RO ]) (define_c_enum "unspecv" [ diff --git a/gcc/config/aarch64/constraints.md b/gcc/config/aarch64/constraints.md index b9e5d13e851912c2d5b27a2d0dbc764bde3fa36f..a2d6b7d49e9cdf058463cb8acec8f583fd6f7eef 100644 --- a/gcc/config/aarch64/constraints.md +++ b/gcc/config/aarch64/constraints.md @@ -320,6 +320,31 @@ (and (match_code "mem") (match_test "aarch64_sve_ld1rq_operand_p (op)"))) +(define_memory_constraint "UOb" + "@internal + An address valid for SVE LD1ROH." + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, QImode)"))) + +(define_memory_constraint "UOh" + "@internal + An address valid for SVE LD1ROH." + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, HImode)"))) + + +(define_memory_constraint "UOw" + "@internal + An address valid for SVE LD1ROW." + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, SImode)"))) + +(define_memory_constraint "UOd" + "@internal + An address valid for SVE LD1ROD." + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, DImode)"))) + (define_memory_constraint "Uty" "@internal An address valid for SVE LD1Rs." diff --git a/gcc/config/aarch64/predicates.md b/gcc/config/aarch64/predicates.md index da6779e790cb70203ea9920fadb5b926321d1576..55fa1b2a77017e7f0582b9d8999168cc2cbd5c99 100644 --- a/gcc/config/aarch64/predicates.md +++ b/gcc/config/aarch64/predicates.md @@ -588,6 +588,22 @@ (and (match_code "mem") (match_test "aarch64_sve_ld1rq_operand_p (op)"))) +(define_predicate "aarch64_sve_ld1ro_operand_b" + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, QImode)"))) + +(define_predicate "aarch64_sve_ld1ro_operand_h" + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, HImode)"))) + +(define_predicate "aarch64_sve_ld1ro_operand_w" + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, SImode)"))) + +(define_predicate "aarch64_sve_ld1ro_operand_d" + (and (match_code "mem") + (match_test "aarch64_sve_ld1ro_operand_p (op, DImode)"))) + (define_predicate "aarch64_sve_ldff1_operand" (and (match_code "mem") (match_test "aarch64_sve_ldff1_operand_p (op)"))) diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f16.c new file mode 100644 index 0000000000000000000000000000000000000000..7badc75a43ab2009e9406afc04c980fc01834716 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f16.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_f16_base: +** ld1roh z0\.h, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_f16_base, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_f16_index: +** ld1roh z0\.h, p0/z, \[x0, x1, lsl 1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_index, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_f16_1: +** add (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_1, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_f16_8: +** add (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_8, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_f16_128: +** add (x[0-9]+), x0, #?256 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_128, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + 128), + z0 = svld1ro (p0, x0 + 128)) + +/* +** ld1ro_f16_m1: +** sub (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_m1, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_f16_m8: +** sub (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_m8, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_f16_m144: +** sub (x[0-9]+), x0, #?288 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f16_m144, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 - 144), + z0 = svld1ro (p0, x0 - 144)) + +/* +** ld1ro_f16_16: +** ld1roh z0\.h, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_f16_16, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_f16_112: +** ld1roh z0\.h, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_f16_112, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 + 112), + z0 = svld1ro (p0, x0 + 112)) + +/* +** ld1ro_f16_m16: +** ld1roh z0\.h, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_f16_m16, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_f16_m128: +** ld1roh z0\.h, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_f16_m128, svfloat16_t, float16_t, + z0 = svld1ro_f16 (p0, x0 - 128), + z0 = svld1ro (p0, x0 - 128)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f32.c new file mode 100644 index 0000000000000000000000000000000000000000..dd8a1c53cd0fb7b7acd0b92394f3977382ac26e0 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f32.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_f32_base: +** ld1row z0\.s, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_f32_base, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_f32_index: +** ld1row z0\.s, p0/z, \[x0, x1, lsl 2\] +** ret +*/ +TEST_LOAD (ld1ro_f32_index, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_f32_1: +** add (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_1, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_f32_4: +** add (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_4, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_f32_64: +** add (x[0-9]+), x0, #?256 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_64, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + 64), + z0 = svld1ro (p0, x0 + 64)) + +/* +** ld1ro_f32_m1: +** sub (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_m1, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_f32_m4: +** sub (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_m4, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_f32_m72: +** sub (x[0-9]+), x0, #?288 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f32_m72, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 - 72), + z0 = svld1ro (p0, x0 - 72)) + +/* +** ld1ro_f32_8: +** ld1row z0\.s, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_f32_8, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_f32_56: +** ld1row z0\.s, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_f32_56, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 + 56), + z0 = svld1ro (p0, x0 + 56)) + +/* +** ld1ro_f32_m8: +** ld1row z0\.s, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_f32_m8, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_f32_m64: +** ld1row z0\.s, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_f32_m64, svfloat32_t, float32_t, + z0 = svld1ro_f32 (p0, x0 - 64), + z0 = svld1ro (p0, x0 - 64)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f64.c new file mode 100644 index 0000000000000000000000000000000000000000..30563698310f65060d34be4bef4c57a74ef9d734 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_f64.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_f64_base: +** ld1rod z0\.d, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_f64_base, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_f64_index: +** ld1rod z0\.d, p0/z, \[x0, x1, lsl 3\] +** ret +*/ +TEST_LOAD (ld1ro_f64_index, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_f64_1: +** add (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_1, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_f64_2: +** add (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_2, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + 2), + z0 = svld1ro (p0, x0 + 2)) + +/* +** ld1ro_f64_32: +** add (x[0-9]+), x0, #?256 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_32, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_f64_m1: +** sub (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_m1, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_f64_m2: +** sub (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_m2, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 - 2), + z0 = svld1ro (p0, x0 - 2)) + +/* +** ld1ro_f64_m36: +** sub (x[0-9]+), x0, #?288 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_f64_m36, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 - 36), + z0 = svld1ro (p0, x0 - 36)) + +/* +** ld1ro_f64_4: +** ld1rod z0\.d, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_f64_4, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_f64_28: +** ld1rod z0\.d, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_f64_28, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 + 28), + z0 = svld1ro (p0, x0 + 28)) + +/* +** ld1ro_f64_m4: +** ld1rod z0\.d, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_f64_m4, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_f64_m32: +** ld1rod z0\.d, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_f64_m32, svfloat64_t, float64_t, + z0 = svld1ro_f64 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s16.c new file mode 100644 index 0000000000000000000000000000000000000000..d4702fa6cc15e9f93751d8579cfecfd37759306e --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s16.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_s16_base: +** ld1roh z0\.h, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_s16_base, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_s16_index: +** ld1roh z0\.h, p0/z, \[x0, x1, lsl 1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_index, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_s16_1: +** add (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_1, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_s16_8: +** add (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_8, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_s16_128: +** add (x[0-9]+), x0, #?256 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_128, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + 128), + z0 = svld1ro (p0, x0 + 128)) + +/* +** ld1ro_s16_m1: +** sub (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_m1, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_s16_m8: +** sub (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_m8, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_s16_m144: +** sub (x[0-9]+), x0, #?288 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s16_m144, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 - 144), + z0 = svld1ro (p0, x0 - 144)) + +/* +** ld1ro_s16_16: +** ld1roh z0\.h, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_s16_16, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_s16_112: +** ld1roh z0\.h, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_s16_112, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 + 112), + z0 = svld1ro (p0, x0 + 112)) + +/* +** ld1ro_s16_m16: +** ld1roh z0\.h, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_s16_m16, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_s16_m128: +** ld1roh z0\.h, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_s16_m128, svint16_t, int16_t, + z0 = svld1ro_s16 (p0, x0 - 128), + z0 = svld1ro (p0, x0 - 128)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s32.c new file mode 100644 index 0000000000000000000000000000000000000000..4604b0b5fbfb716ae814bf88f7acfe8bf0eaa9f5 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s32.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_s32_base: +** ld1row z0\.s, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_s32_base, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_s32_index: +** ld1row z0\.s, p0/z, \[x0, x1, lsl 2\] +** ret +*/ +TEST_LOAD (ld1ro_s32_index, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_s32_1: +** add (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_1, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_s32_4: +** add (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_4, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_s32_64: +** add (x[0-9]+), x0, #?256 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_64, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + 64), + z0 = svld1ro (p0, x0 + 64)) + +/* +** ld1ro_s32_m1: +** sub (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_m1, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_s32_m4: +** sub (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_m4, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_s32_m72: +** sub (x[0-9]+), x0, #?288 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s32_m72, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 - 72), + z0 = svld1ro (p0, x0 - 72)) + +/* +** ld1ro_s32_8: +** ld1row z0\.s, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_s32_8, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_s32_56: +** ld1row z0\.s, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_s32_56, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 + 56), + z0 = svld1ro (p0, x0 + 56)) + +/* +** ld1ro_s32_m8: +** ld1row z0\.s, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_s32_m8, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_s32_m64: +** ld1row z0\.s, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_s32_m64, svint32_t, int32_t, + z0 = svld1ro_s32 (p0, x0 - 64), + z0 = svld1ro (p0, x0 - 64)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s64.c new file mode 100644 index 0000000000000000000000000000000000000000..dac98b293fb88f733ffcaec04a8b9861c3c502bf --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s64.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_s64_base: +** ld1rod z0\.d, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_s64_base, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_s64_index: +** ld1rod z0\.d, p0/z, \[x0, x1, lsl 3\] +** ret +*/ +TEST_LOAD (ld1ro_s64_index, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_s64_1: +** add (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_1, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_s64_2: +** add (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_2, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + 2), + z0 = svld1ro (p0, x0 + 2)) + +/* +** ld1ro_s64_32: +** add (x[0-9]+), x0, #?256 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_32, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_s64_m1: +** sub (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_m1, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_s64_m2: +** sub (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_m2, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 - 2), + z0 = svld1ro (p0, x0 - 2)) + +/* +** ld1ro_s64_m36: +** sub (x[0-9]+), x0, #?288 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s64_m36, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 - 36), + z0 = svld1ro (p0, x0 - 36)) + +/* +** ld1ro_s64_4: +** ld1rod z0\.d, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_s64_4, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_s64_28: +** ld1rod z0\.d, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_s64_28, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 + 28), + z0 = svld1ro (p0, x0 + 28)) + +/* +** ld1ro_s64_m4: +** ld1rod z0\.d, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_s64_m4, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_s64_m32: +** ld1rod z0\.d, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_s64_m32, svint64_t, int64_t, + z0 = svld1ro_s64 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s8.c new file mode 100644 index 0000000000000000000000000000000000000000..17df5dbb0d7302d9d735b13fb97111a657efbbfc --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_s8.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_s8_base: +** ld1rob z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_s8_base, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_s8_index: +** ld1rob z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_index, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_s8_1: +** add (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_1, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_s8_16: +** add (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_16, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_s8_256: +** add (x[0-9]+), x0, #?256 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_256, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + 256), + z0 = svld1ro (p0, x0 + 256)) + +/* +** ld1ro_s8_m1: +** sub (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_m1, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_s8_m16: +** sub (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_m16, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_s8_m288: +** sub (x[0-9]+), x0, #?288 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_s8_m288, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 - 288), + z0 = svld1ro (p0, x0 - 288)) + +/* +** ld1ro_s8_32: +** ld1rob z0\.b, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_s8_32, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_s8_224: +** ld1rob z0\.b, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_s8_224, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 + 224), + z0 = svld1ro (p0, x0 + 224)) + +/* +** ld1ro_s8_m32: +** ld1rob z0\.b, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_s8_m32, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + +/* +** ld1ro_s8_m256: +** ld1rob z0\.b, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_s8_m256, svint8_t, int8_t, + z0 = svld1ro_s8 (p0, x0 - 256), + z0 = svld1ro (p0, x0 - 256)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u16.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u16.c new file mode 100644 index 0000000000000000000000000000000000000000..611e9166b0ff6d98ab3d05799072484a623ae3a0 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u16.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_u16_base: +** ld1roh z0\.h, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_u16_base, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_u16_index: +** ld1roh z0\.h, p0/z, \[x0, x1, lsl 1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_index, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_u16_1: +** add (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_1, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_u16_8: +** add (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_8, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_u16_128: +** add (x[0-9]+), x0, #?256 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_128, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + 128), + z0 = svld1ro (p0, x0 + 128)) + +/* +** ld1ro_u16_m1: +** sub (x[0-9]+), x0, #?2 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_m1, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_u16_m8: +** sub (x[0-9]+), x0, #?16 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_m8, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_u16_m144: +** sub (x[0-9]+), x0, #?288 +** ld1roh z0\.h, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u16_m144, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 - 144), + z0 = svld1ro (p0, x0 - 144)) + +/* +** ld1ro_u16_16: +** ld1roh z0\.h, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_u16_16, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_u16_112: +** ld1roh z0\.h, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_u16_112, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 + 112), + z0 = svld1ro (p0, x0 + 112)) + +/* +** ld1ro_u16_m16: +** ld1roh z0\.h, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_u16_m16, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_u16_m128: +** ld1roh z0\.h, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_u16_m128, svuint16_t, uint16_t, + z0 = svld1ro_u16 (p0, x0 - 128), + z0 = svld1ro (p0, x0 - 128)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u32.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u32.c new file mode 100644 index 0000000000000000000000000000000000000000..7cb5bb93aa008272f9d765be567f084da0adc9a6 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u32.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_u32_base: +** ld1row z0\.s, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_u32_base, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_u32_index: +** ld1row z0\.s, p0/z, \[x0, x1, lsl 2\] +** ret +*/ +TEST_LOAD (ld1ro_u32_index, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_u32_1: +** add (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_1, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_u32_4: +** add (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_4, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_u32_64: +** add (x[0-9]+), x0, #?256 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_64, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + 64), + z0 = svld1ro (p0, x0 + 64)) + +/* +** ld1ro_u32_m1: +** sub (x[0-9]+), x0, #?4 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_m1, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_u32_m4: +** sub (x[0-9]+), x0, #?16 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_m4, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_u32_m72: +** sub (x[0-9]+), x0, #?288 +** ld1row z0\.s, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u32_m72, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 - 72), + z0 = svld1ro (p0, x0 - 72)) + +/* +** ld1ro_u32_8: +** ld1row z0\.s, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_u32_8, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + 8), + z0 = svld1ro (p0, x0 + 8)) + +/* +** ld1ro_u32_56: +** ld1row z0\.s, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_u32_56, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 + 56), + z0 = svld1ro (p0, x0 + 56)) + +/* +** ld1ro_u32_m8: +** ld1row z0\.s, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_u32_m8, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 - 8), + z0 = svld1ro (p0, x0 - 8)) + +/* +** ld1ro_u32_m64: +** ld1row z0\.s, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_u32_m64, svuint32_t, uint32_t, + z0 = svld1ro_u32 (p0, x0 - 64), + z0 = svld1ro (p0, x0 - 64)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u64.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u64.c new file mode 100644 index 0000000000000000000000000000000000000000..2194d52d5e3592e22d311be27573e254f16f2897 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u64.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_u64_base: +** ld1rod z0\.d, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_u64_base, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_u64_index: +** ld1rod z0\.d, p0/z, \[x0, x1, lsl 3\] +** ret +*/ +TEST_LOAD (ld1ro_u64_index, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_u64_1: +** add (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_1, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_u64_2: +** add (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_2, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + 2), + z0 = svld1ro (p0, x0 + 2)) + +/* +** ld1ro_u64_32: +** add (x[0-9]+), x0, #?256 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_32, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_u64_m1: +** sub (x[0-9]+), x0, #?8 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_m1, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_u64_m2: +** sub (x[0-9]+), x0, #?16 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_m2, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 - 2), + z0 = svld1ro (p0, x0 - 2)) + +/* +** ld1ro_u64_m36: +** sub (x[0-9]+), x0, #?288 +** ld1rod z0\.d, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u64_m36, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 - 36), + z0 = svld1ro (p0, x0 - 36)) + +/* +** ld1ro_u64_4: +** ld1rod z0\.d, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_u64_4, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + 4), + z0 = svld1ro (p0, x0 + 4)) + +/* +** ld1ro_u64_28: +** ld1rod z0\.d, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_u64_28, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 + 28), + z0 = svld1ro (p0, x0 + 28)) + +/* +** ld1ro_u64_m4: +** ld1rod z0\.d, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_u64_m4, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 - 4), + z0 = svld1ro (p0, x0 - 4)) + +/* +** ld1ro_u64_m32: +** ld1rod z0\.d, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_u64_m32, svuint64_t, uint64_t, + z0 = svld1ro_u64 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + diff --git a/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u8.c b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u8.c new file mode 100644 index 0000000000000000000000000000000000000000..b98c0c7444f6c50d6c4e185a431a49040a267154 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/sve/acle/asm/ld1ro_u8.c @@ -0,0 +1,119 @@ +/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" } } */ +/* { dg-additional-options "-march=armv8.6-a+sve+f64mm" } */ + +#include "test_sve_acle.h" + +/* +** ld1ro_u8_base: +** ld1rob z0\.b, p0/z, \[x0\] +** ret +*/ +TEST_LOAD (ld1ro_u8_base, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0), + z0 = svld1ro (p0, x0)) + +/* +** ld1ro_u8_index: +** ld1rob z0\.b, p0/z, \[x0, x1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_index, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + x1), + z0 = svld1ro (p0, x0 + x1)) + +/* +** ld1ro_u8_1: +** add (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_1, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + 1), + z0 = svld1ro (p0, x0 + 1)) + +/* +** ld1ro_u8_16: +** add (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_16, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + 16), + z0 = svld1ro (p0, x0 + 16)) + +/* +** ld1ro_u8_256: +** add (x[0-9]+), x0, #?256 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_256, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + 256), + z0 = svld1ro (p0, x0 + 256)) + +/* +** ld1ro_u8_m1: +** sub (x[0-9]+), x0, #?1 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_m1, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 - 1), + z0 = svld1ro (p0, x0 - 1)) + +/* +** ld1ro_u8_m16: +** sub (x[0-9]+), x0, #?16 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_m16, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 - 16), + z0 = svld1ro (p0, x0 - 16)) + +/* +** ld1ro_u8_m288: +** sub (x[0-9]+), x0, #?288 +** ld1rob z0\.b, p0/z, \[\1\] +** ret +*/ +TEST_LOAD (ld1ro_u8_m288, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 - 288), + z0 = svld1ro (p0, x0 - 288)) + +/* +** ld1ro_u8_32: +** ld1rob z0\.b, p0/z, \[x0, #?32\] +** ret +*/ +TEST_LOAD (ld1ro_u8_32, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + 32), + z0 = svld1ro (p0, x0 + 32)) + +/* +** ld1ro_u8_224: +** ld1rob z0\.b, p0/z, \[x0, #?224\] +** ret +*/ +TEST_LOAD (ld1ro_u8_224, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 + 224), + z0 = svld1ro (p0, x0 + 224)) + +/* +** ld1ro_u8_m32: +** ld1rob z0\.b, p0/z, \[x0, #?-32\] +** ret +*/ +TEST_LOAD (ld1ro_u8_m32, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 - 32), + z0 = svld1ro (p0, x0 - 32)) + +/* +** ld1ro_u8_m256: +** ld1rob z0\.b, p0/z, \[x0, #?-256\] +** ret +*/ +TEST_LOAD (ld1ro_u8_m256, svuint8_t, uint8_t, + z0 = svld1ro_u8 (p0, x0 - 256), + z0 = svld1ro (p0, x0 - 256)) +
svld1ro.patch.gz
Description: svld1ro.patch.gz