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 78