1 /* { dg-do compile } */ 2 /* { dg-options "-O -msve-vector-bits=128 -g" } */ 3 /* { dg-final { check-function-bodies "**" "" "" { target { aarch64_little_endian && lp64 } } } } */ 4 5 #include <stdint.h> 6 7 typedef int8_t svint8_t __attribute__ ((vector_size (16))); 8 typedef uint8_t svuint8_t __attribute__ ((vector_size (16))); 9 10 typedef int16_t svint16_t __attribute__ ((vector_size (16))); 11 typedef uint16_t svuint16_t __attribute__ ((vector_size (16))); 12 typedef __fp16 svfloat16_t __attribute__ ((vector_size (16))); 13 typedef __bf16 svbfloat16_t __attribute__ ((vector_size (16))); 14 15 typedef int32_t svint32_t __attribute__ ((vector_size (16))); 16 typedef uint32_t svuint32_t __attribute__ ((vector_size (16))); 17 typedef float svfloat32_t __attribute__ ((vector_size (16))); 18 19 typedef int64_t svint64_t __attribute__ ((vector_size (16))); 20 typedef uint64_t svuint64_t __attribute__ ((vector_size (16))); 21 typedef double svfloat64_t __attribute__ ((vector_size (16))); 22 23 #define CALLEE(SUFFIX, TYPE) \ 24 TYPE __attribute__((noipa)) \ 25 callee_##SUFFIX (TYPE *ptr) \ 26 { \ 27 return *ptr; \ 28 } 29 30 /* 31 ** callee_s8: 32 ** ldr q0, \[x0\] 33 ** ret 34 */ 35 CALLEE (s8, svint8_t) 36 37 /* 38 ** callee_u8: 39 ** ldr q0, \[x0\] 40 ** ret 41 */ 42 CALLEE (u8, svuint8_t) 43 44 /* 45 ** callee_s16: 46 ** ldr q0, \[x0\] 47 ** ret 48 */ 49 CALLEE (s16, svint16_t) 50 51 /* 52 ** callee_u16: 53 ** ldr q0, \[x0\] 54 ** ret 55 */ 56 CALLEE (u16, svuint16_t) 57 58 /* 59 ** callee_f16: 60 ** ldr q0, \[x0\] 61 ** ret 62 */ 63 CALLEE (f16, svfloat16_t) 64 65 /* 66 ** callee_bf16: 67 ** ldr q0, \[x0\] 68 ** ret 69 */ 70 CALLEE (bf16, svbfloat16_t) 71 72 /* 73 ** callee_s32: 74 ** ldr q0, \[x0\] 75 ** ret 76 */ 77 CALLEE (s32, svint32_t) 78 79 /* 80 ** callee_u32: 81 ** ldr q0, \[x0\] 82 ** ret 83 */ 84 CALLEE (u32, svuint32_t) 85 86 /* 87 ** callee_f32: 88 ** ldr q0, \[x0\] 89 ** ret 90 */ 91 CALLEE (f32, svfloat32_t) 92 93 /* 94 ** callee_s64: 95 ** ldr q0, \[x0\] 96 ** ret 97 */ 98 CALLEE (s64, svint64_t) 99 100 /* 101 ** callee_u64: 102 ** ldr q0, \[x0\] 103 ** ret 104 */ 105 CALLEE (u64, svuint64_t) 106 107 /* 108 ** callee_f64: 109 ** ldr q0, \[x0\] 110 ** ret 111 */ 112 CALLEE (f64, svfloat64_t) 113 114 #define CALLER(SUFFIX, TYPE) \ 115 void __attribute__((noipa)) \ 116 caller_##SUFFIX (TYPE *ptr1, TYPE *ptr2) \ 117 { \ 118 *ptr2 = callee_##SUFFIX (ptr1); \ 119 } 120 121 /* 122 ** caller_s8: 123 ** ... 124 ** bl callee_s8 125 ** ... 126 ** str q0, \[[^]]*\] 127 ** ... 128 ** ret 129 */ 130 CALLER (s8, svint8_t) 131 132 /* 133 ** caller_u8: 134 ** ... 135 ** bl callee_u8 136 ** ... 137 ** str q0, \[[^]]*\] 138 ** ... 139 ** ret 140 */ 141 CALLER (u8, svuint8_t) 142 143 /* 144 ** caller_s16: 145 ** ... 146 ** bl callee_s16 147 ** ... 148 ** str q0, \[[^]]*\] 149 ** ... 150 ** ret 151 */ 152 CALLER (s16, svint16_t) 153 154 /* 155 ** caller_u16: 156 ** ... 157 ** bl callee_u16 158 ** ... 159 ** str q0, \[[^]]*\] 160 ** ... 161 ** ret 162 */ 163 CALLER (u16, svuint16_t) 164 165 /* 166 ** caller_f16: 167 ** ... 168 ** bl callee_f16 169 ** ... 170 ** str q0, \[[^]]*\] 171 ** ... 172 ** ret 173 */ 174 CALLER (f16, svfloat16_t) 175 176 /* 177 ** caller_bf16: 178 ** ... 179 ** bl callee_bf16 180 ** ... 181 ** str q0, \[[^]]*\] 182 ** ... 183 ** ret 184 */ 185 CALLER (bf16, svbfloat16_t) 186 187 /* 188 ** caller_s32: 189 ** ... 190 ** bl callee_s32 191 ** ... 192 ** str q0, \[[^]]*\] 193 ** ... 194 ** ret 195 */ 196 CALLER (s32, svint32_t) 197 198 /* 199 ** caller_u32: 200 ** ... 201 ** bl callee_u32 202 ** ... 203 ** str q0, \[[^]]*\] 204 ** ... 205 ** ret 206 */ 207 CALLER (u32, svuint32_t) 208 209 /* 210 ** caller_f32: 211 ** ... 212 ** bl callee_f32 213 ** ... 214 ** str q0, \[[^]]*\] 215 ** ... 216 ** ret 217 */ 218 CALLER (f32, svfloat32_t) 219 220 /* 221 ** caller_s64: 222 ** ... 223 ** bl callee_s64 224 ** ... 225 ** str q0, \[[^]]*\] 226 ** ... 227 ** ret 228 */ 229 CALLER (s64, svint64_t) 230 231 /* 232 ** caller_u64: 233 ** ... 234 ** bl callee_u64 235 ** ... 236 ** str q0, \[[^]]*\] 237 ** ... 238 ** ret 239 */ 240 CALLER (u64, svuint64_t) 241 242 /* 243 ** caller_f64: 244 ** ... 245 ** bl callee_f64 246 ** ... 247 ** str q0, \[[^]]*\] 248 ** ... 249 ** ret 250 */ 251 CALLER (f64, svfloat64_t) 252