1  #ifndef STRUCT_H
       2  #define STRUCT_H 1
       3  
       4  #include <arm_sve.h>
       5  
       6  #ifndef __ARM_FEATURE_SVE_BITS
       7  #error "__ARM_FEATURE_SVE_BITS should be defined"
       8  #endif
       9  
      10  #define FIXED_ATTR \
      11    __attribute__ ((arm_sve_vector_bits (__ARM_FEATURE_SVE_BITS)))
      12  
      13  #define SVE_BYTES (__ARM_FEATURE_SVE_BITS / 8)
      14  
      15  typedef __SVInt8_t fixed_int8_t FIXED_ATTR;
      16  typedef __SVInt16_t fixed_int16_t FIXED_ATTR;
      17  typedef __SVInt32_t fixed_int32_t FIXED_ATTR;
      18  typedef __SVInt64_t fixed_int64_t FIXED_ATTR;
      19  
      20  typedef __SVUint8_t fixed_uint8_t FIXED_ATTR;
      21  typedef __SVUint16_t fixed_uint16_t FIXED_ATTR;
      22  typedef __SVUint32_t fixed_uint32_t FIXED_ATTR;
      23  typedef __SVUint64_t fixed_uint64_t FIXED_ATTR;
      24  
      25  typedef __SVBfloat16_t fixed_bfloat16_t FIXED_ATTR;
      26  typedef __SVFloat16_t fixed_float16_t FIXED_ATTR;
      27  typedef __SVFloat32_t fixed_float32_t FIXED_ATTR;
      28  typedef __SVFloat64_t fixed_float64_t FIXED_ATTR;
      29  
      30  typedef __SVBool_t fixed_bool_t FIXED_ATTR;
      31  
      32  /* Define an asm function called NAME with return type RET_TYPE and
      33     argument list ARG_TYPES.  INSNS contains the body of the function,
      34     except for the final "ret".
      35  
      36     Conservatively mark the function as a variant PCS function,
      37     since many uses are.  */
      38  #define ASM_FUNCTION(NAME, RET_TYPE, ARG_TYPES, INSNS) \
      39  extern RET_TYPE NAME ARG_TYPES;			\
      40    asm(						\
      41  "	.type	" #NAME ", %function\n"		\
      42  #NAME ":\n"					\
      43  "	" INSNS "\n"				\
      44  "	ret\n"					\
      45  "	.size	" #NAME ", .-" #NAME "\n"	\
      46  "	.variant_pcs " #NAME "\n"		\
      47  )
      48  
      49  /* Set the argument registers to fixed values.  */
      50  #define CLEANSE								\
      51    asm volatile ("mov\tx0, #-1\n\t"					\
      52  		"mov\tx1, #-1\n\t"					\
      53  		"mov\tx2, #-1\n\t"					\
      54  		"mov\tx3, #-1\n\t"					\
      55  		"mov\tx4, #-1\n\t"					\
      56  		"mov\tx5, #-1\n\t"					\
      57  		"mov\tx6, #-1\n\t"					\
      58  		"mov\tx7, #-1\n\t"					\
      59  		"mov\tx8, #-1\n\t"					\
      60  		"mov\tz0.b, #0xaf\n\t"					\
      61  		"mov\tz1.b, #0xaf\n\t"					\
      62  		"mov\tz2.b, #0xaf\n\t"					\
      63  		"mov\tz3.b, #0xaf\n\t"					\
      64  		"mov\tz4.b, #0xaf\n\t"					\
      65  		"mov\tz5.b, #0xaf\n\t"					\
      66  		"mov\tz6.b, #0xaf\n\t"					\
      67  		"mov\tz7.b, #0xaf\n\t"					\
      68  		"pfalse\tp0.b\n\t"					\
      69  		"pfalse\tp1.b\n\t"					\
      70  		"pfalse\tp2.b\n\t"					\
      71  		"pfalse\tp3.b"						\
      72  		:::							\
      73  		"x0", "x1", "x2", "x3", "x4", "x5", "x6", "x7", "x8",	\
      74  		"z0", "z1", "z2", "z3", "z4", "z5", "z6", "z7",		\
      75  		"p0", "p1", "p2", "p3")
      76  
      77  #endif