/* { dg-final { check-function-bodies "**" "" "-DCHECK_ASM" { target { ! ilp32 } } } } */

#include "test_sve_acle.h"

/*
** ld1sh_gather_s32_tied1:
**	ld1sh	z0\.s, p0/z, \[z0\.s\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_s32_tied1, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_s32 (p0, z0),
		     z0_res = svld1sh_gather_s32 (p0, z0))

/*
** ld1sh_gather_s32_untied:
**	ld1sh	z0\.s, p0/z, \[z1\.s\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_s32_untied, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_s32 (p0, z1),
		     z0_res = svld1sh_gather_s32 (p0, z1))

/*
** ld1sh_gather_x0_s32_offset:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_x0_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, x0),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, x0))

/*
** ld1sh_gather_m2_s32_offset:
**	mov	(x[0-9]+), #?-2
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_m2_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, -2),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, -2))

/*
** ld1sh_gather_0_s32_offset:
**	ld1sh	z0\.s, p0/z, \[z0\.s\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_0_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, 0),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, 0))

/*
** ld1sh_gather_5_s32_offset:
**	mov	(x[0-9]+), #?5
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_5_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, 5),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, 5))

/*
** ld1sh_gather_6_s32_offset:
**	ld1sh	z0\.s, p0/z, \[z0\.s, #6\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_6_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, 6),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, 6))

/*
** ld1sh_gather_62_s32_offset:
**	ld1sh	z0\.s, p0/z, \[z0\.s, #62\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_62_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, 62),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, 62))

/*
** ld1sh_gather_64_s32_offset:
**	mov	(x[0-9]+), #?64
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_64_s32_offset, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_offset_s32 (p0, z0, 64),
		     z0_res = svld1sh_gather_offset_s32 (p0, z0, 64))

/*
** ld1sh_gather_x0_s32_index:
**	lsl	(x[0-9]+), x0, #?1
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_x0_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, x0),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, x0))

/*
** ld1sh_gather_m1_s32_index:
**	mov	(x[0-9]+), #?-2
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_m1_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, -1),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, -1))

/*
** ld1sh_gather_0_s32_index:
**	ld1sh	z0\.s, p0/z, \[z0\.s\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_0_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, 0),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, 0))

/*
** ld1sh_gather_5_s32_index:
**	ld1sh	z0\.s, p0/z, \[z0\.s, #10\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_5_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, 5),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, 5))

/*
** ld1sh_gather_31_s32_index:
**	ld1sh	z0\.s, p0/z, \[z0\.s, #62\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_31_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, 31),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, 31))

/*
** ld1sh_gather_32_s32_index:
**	mov	(x[0-9]+), #?64
**	ld1sh	z0\.s, p0/z, \[\1, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_ZS (ld1sh_gather_32_s32_index, svint32_t, svuint32_t,
		     z0_res = svld1sh_gather_u32base_index_s32 (p0, z0, 32),
		     z0_res = svld1sh_gather_index_s32 (p0, z0, 32))

/*
** ld1sh_gather_x0_s32_s32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, sxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_x0_s32_s32offset, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32offset_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z0))

/*
** ld1sh_gather_tied1_s32_s32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, sxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_tied1_s32_s32offset, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32offset_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z0))

/*
** ld1sh_gather_untied_s32_s32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z1\.s, sxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_untied_s32_s32offset, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32offset_s32 (p0, x0, z1),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z1))

/*
** ld1sh_gather_x0_s32_u32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_x0_s32_u32offset, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32offset_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z0))

/*
** ld1sh_gather_tied1_s32_u32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_tied1_s32_u32offset, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32offset_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z0))

/*
** ld1sh_gather_untied_s32_u32offset:
**	ld1sh	z0\.s, p0/z, \[x0, z1\.s, uxtw\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_untied_s32_u32offset, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32offset_s32 (p0, x0, z1),
		     z0_res = svld1sh_gather_offset_s32 (p0, x0, z1))

/*
** ld1sh_gather_x0_s32_s32index:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, sxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_x0_s32_s32index, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32index_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z0))

/*
** ld1sh_gather_tied1_s32_s32index:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, sxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_tied1_s32_s32index, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32index_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z0))

/*
** ld1sh_gather_untied_s32_s32index:
**	ld1sh	z0\.s, p0/z, \[x0, z1\.s, sxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_untied_s32_s32index, svint32_t, int16_t, svint32_t,
		     z0_res = svld1sh_gather_s32index_s32 (p0, x0, z1),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z1))

/*
** ld1sh_gather_x0_s32_u32index:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, uxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_x0_s32_u32index, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32index_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z0))

/*
** ld1sh_gather_tied1_s32_u32index:
**	ld1sh	z0\.s, p0/z, \[x0, z0\.s, uxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_tied1_s32_u32index, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32index_s32 (p0, x0, z0),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z0))

/*
** ld1sh_gather_untied_s32_u32index:
**	ld1sh	z0\.s, p0/z, \[x0, z1\.s, uxtw 1\]
**	ret
*/
TEST_LOAD_GATHER_SZ (ld1sh_gather_untied_s32_u32index, svint32_t, int16_t, svuint32_t,
		     z0_res = svld1sh_gather_u32index_s32 (p0, x0, z1),
		     z0_res = svld1sh_gather_index_s32 (p0, x0, z1))
