blob: cf25c31bcbf30a5b0ddf524f32aceafe375df884 [file] [log] [blame]
/* { dg-do compile } */
/* { dg-options "-O -msve-vector-bits=512 -g" } */
/* { dg-final { check-function-bodies "**" "" "" { target lp64 } } } */
#define CALLEE(SUFFIX, TYPE) \
TYPE __attribute__((noipa)) \
callee_##SUFFIX (TYPE *ptr) \
{ \
return *ptr; \
}
/*
** callee_s8:
** ptrue (p[0-7])\.b, vl64
** ld1b z0\.b, \1/z, \[x0\]
** ret
*/
CALLEE (s8, __SVInt8_t)
/*
** callee_u8:
** ptrue (p[0-7])\.b, vl64
** ld1b z0\.b, \1/z, \[x0\]
** ret
*/
CALLEE (u8, __SVUint8_t)
/*
** callee_s16:
** ptrue (p[0-7])\.b, vl64
** ld1h z0\.h, \1/z, \[x0\]
** ret
*/
CALLEE (s16, __SVInt16_t)
/*
** callee_u16:
** ptrue (p[0-7])\.b, vl64
** ld1h z0\.h, \1/z, \[x0\]
** ret
*/
CALLEE (u16, __SVUint16_t)
/*
** callee_f16:
** ptrue (p[0-7])\.b, vl64
** ld1h z0\.h, \1/z, \[x0\]
** ret
*/
CALLEE (f16, __SVFloat16_t)
/*
** callee_bf16:
** ptrue (p[0-7])\.b, vl64
** ld1h z0\.h, \1/z, \[x0\]
** ret
*/
CALLEE (bf16, __SVBfloat16_t)
/*
** callee_s32:
** ptrue (p[0-7])\.b, vl64
** ld1w z0\.s, \1/z, \[x0\]
** ret
*/
CALLEE (s32, __SVInt32_t)
/*
** callee_u32:
** ptrue (p[0-7])\.b, vl64
** ld1w z0\.s, \1/z, \[x0\]
** ret
*/
CALLEE (u32, __SVUint32_t)
/*
** callee_f32:
** ptrue (p[0-7])\.b, vl64
** ld1w z0\.s, \1/z, \[x0\]
** ret
*/
CALLEE (f32, __SVFloat32_t)
/*
** callee_s64:
** ptrue (p[0-7])\.b, vl64
** ld1d z0\.d, \1/z, \[x0\]
** ret
*/
CALLEE (s64, __SVInt64_t)
/*
** callee_u64:
** ptrue (p[0-7])\.b, vl64
** ld1d z0\.d, \1/z, \[x0\]
** ret
*/
CALLEE (u64, __SVUint64_t)
/*
** callee_f64:
** ptrue (p[0-7])\.b, vl64
** ld1d z0\.d, \1/z, \[x0\]
** ret
*/
CALLEE (f64, __SVFloat64_t)
#include <arm_sve.h>
#define CALLER(SUFFIX, TYPE) \
typeof (svaddv (svptrue_b8 (), *(TYPE *) 0)) \
__attribute__((noipa)) \
caller_##SUFFIX (TYPE *ptr1) \
{ \
return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \
}
#define CALLER_BF16(SUFFIX, TYPE) \
typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \
__attribute__((noipa)) \
caller_##SUFFIX (TYPE *ptr1) \
{ \
return svlasta (svptrue_b8 (), callee_##SUFFIX (ptr1)); \
}
/*
** caller_s8:
** ...
** bl callee_s8
** ptrue (p[0-7])\.b, vl64
** saddv (d[0-9]+), \1, z0\.b
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (s8, __SVInt8_t)
/*
** caller_u8:
** ...
** bl callee_u8
** ptrue (p[0-7])\.b, vl64
** uaddv (d[0-9]+), \1, z0\.b
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (u8, __SVUint8_t)
/*
** caller_s16:
** ...
** bl callee_s16
** ptrue (p[0-7])\.b, vl64
** saddv (d[0-9]+), \1, z0\.h
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (s16, __SVInt16_t)
/*
** caller_u16:
** ...
** bl callee_u16
** ptrue (p[0-7])\.b, vl64
** uaddv (d[0-9]+), \1, z0\.h
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (u16, __SVUint16_t)
/*
** caller_f16:
** ...
** bl callee_f16
** ptrue (p[0-7])\.b, vl64
** faddv h0, \1, z0\.h
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (f16, __SVFloat16_t)
/*
** caller_bf16:
** ...
** bl callee_bf16
** ptrue (p[0-7])\.b, vl64
** lasta h0, \1, z0\.h
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER_BF16 (bf16, __SVBfloat16_t)
/*
** caller_s32:
** ...
** bl callee_s32
** ptrue (p[0-7])\.b, vl64
** saddv (d[0-9]+), \1, z0\.s
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (s32, __SVInt32_t)
/*
** caller_u32:
** ...
** bl callee_u32
** ptrue (p[0-7])\.b, vl64
** uaddv (d[0-9]+), \1, z0\.s
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (u32, __SVUint32_t)
/*
** caller_f32:
** ...
** bl callee_f32
** ptrue (p[0-7])\.b, vl64
** faddv s0, \1, z0\.s
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (f32, __SVFloat32_t)
/*
** caller_s64:
** ...
** bl callee_s64
** ptrue (p[0-7])\.b, vl64
** uaddv (d[0-9]+), \1, z0\.d
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (s64, __SVInt64_t)
/*
** caller_u64:
** ...
** bl callee_u64
** ptrue (p[0-7])\.b, vl64
** uaddv (d[0-9]+), \1, z0\.d
** fmov x0, \2
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (u64, __SVUint64_t)
/*
** caller_f64:
** ...
** bl callee_f64
** ptrue (p[0-7])\.b, vl64
** faddv d0, \1, z0\.d
** ldp x29, x30, \[sp\], 16
** ret
*/
CALLER (f64, __SVFloat64_t)