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