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 <arm_sve.h> 6 7 #define CALLEE(SUFFIX, TYPE) \ 8 TYPE __attribute__((noipa)) \ 9 callee_##SUFFIX (TYPE *ptr) \ 10 { \ 11 return *ptr; \ 12 } 13 14 /* 15 ** callee_s8: 16 ** ptrue (p[0-7])\.b, vl16 17 ** ld1b z0\.b, \1/z, \[x0\] 18 ** ret 19 */ 20 CALLEE (s8, svint8_t) 21 22 /* 23 ** callee_u8: 24 ** ptrue (p[0-7])\.b, vl16 25 ** ld1b z0\.b, \1/z, \[x0\] 26 ** ret 27 */ 28 CALLEE (u8, svuint8_t) 29 30 /* 31 ** callee_s16: 32 ** ptrue (p[0-7])\.b, vl16 33 ** ld1h z0\.h, \1/z, \[x0\] 34 ** ret 35 */ 36 CALLEE (s16, svint16_t) 37 38 /* 39 ** callee_u16: 40 ** ptrue (p[0-7])\.b, vl16 41 ** ld1h z0\.h, \1/z, \[x0\] 42 ** ret 43 */ 44 CALLEE (u16, svuint16_t) 45 46 /* 47 ** callee_f16: 48 ** ptrue (p[0-7])\.b, vl16 49 ** ld1h z0\.h, \1/z, \[x0\] 50 ** ret 51 */ 52 CALLEE (f16, svfloat16_t) 53 54 /* 55 ** callee_bf16: 56 ** ptrue (p[0-7])\.b, vl16 57 ** ld1h z0\.h, \1/z, \[x0\] 58 ** ret 59 */ 60 CALLEE (bf16, svbfloat16_t) 61 62 /* 63 ** callee_s32: 64 ** ptrue (p[0-7])\.b, vl16 65 ** ld1w z0\.s, \1/z, \[x0\] 66 ** ret 67 */ 68 CALLEE (s32, svint32_t) 69 70 /* 71 ** callee_u32: 72 ** ptrue (p[0-7])\.b, vl16 73 ** ld1w z0\.s, \1/z, \[x0\] 74 ** ret 75 */ 76 CALLEE (u32, svuint32_t) 77 78 /* 79 ** callee_f32: 80 ** ptrue (p[0-7])\.b, vl16 81 ** ld1w z0\.s, \1/z, \[x0\] 82 ** ret 83 */ 84 CALLEE (f32, svfloat32_t) 85 86 /* 87 ** callee_s64: 88 ** ptrue (p[0-7])\.b, vl16 89 ** ld1d z0\.d, \1/z, \[x0\] 90 ** ret 91 */ 92 CALLEE (s64, svint64_t) 93 94 /* 95 ** callee_u64: 96 ** ptrue (p[0-7])\.b, vl16 97 ** ld1d z0\.d, \1/z, \[x0\] 98 ** ret 99 */ 100 CALLEE (u64, svuint64_t) 101 102 /* 103 ** callee_f64: 104 ** ptrue (p[0-7])\.b, vl16 105 ** ld1d z0\.d, \1/z, \[x0\] 106 ** ret 107 */ 108 CALLEE (f64, svfloat64_t) 109 110 #define CALLER(SUFFIX, TYPE) \ 111 typeof (svaddv (svptrue_b8 (), *(TYPE *) 0)) \ 112 __attribute__((noipa)) \ 113 caller_##SUFFIX (TYPE *ptr1) \ 114 { \ 115 return svaddv (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ 116 } 117 118 #define CALLER_BF16(SUFFIX, TYPE) \ 119 typeof (svlasta (svptrue_b8 (), *(TYPE *) 0)) \ 120 __attribute__((noipa)) \ 121 caller_##SUFFIX (TYPE *ptr1) \ 122 { \ 123 return svlasta (svptrue_b8 (), callee_##SUFFIX (ptr1)); \ 124 } 125 126 /* 127 ** caller_s8: 128 ** ... 129 ** bl callee_s8 130 ** ptrue (p[0-7])\.b, vl16 131 ** saddv (d[0-9]+), \1, z0\.b 132 ** fmov x0, \2 133 ** ldp x29, x30, \[sp\], 16 134 ** ret 135 */ 136 CALLER (s8, svint8_t) 137 138 /* 139 ** caller_u8: 140 ** ... 141 ** bl callee_u8 142 ** ptrue (p[0-7])\.b, vl16 143 ** uaddv (d[0-9]+), \1, z0\.b 144 ** fmov x0, \2 145 ** ldp x29, x30, \[sp\], 16 146 ** ret 147 */ 148 CALLER (u8, svuint8_t) 149 150 /* 151 ** caller_s16: 152 ** ... 153 ** bl callee_s16 154 ** ptrue (p[0-7])\.b, vl16 155 ** saddv (d[0-9]+), \1, z0\.h 156 ** fmov x0, \2 157 ** ldp x29, x30, \[sp\], 16 158 ** ret 159 */ 160 CALLER (s16, svint16_t) 161 162 /* 163 ** caller_u16: 164 ** ... 165 ** bl callee_u16 166 ** ptrue (p[0-7])\.b, vl16 167 ** uaddv (d[0-9]+), \1, z0\.h 168 ** fmov x0, \2 169 ** ldp x29, x30, \[sp\], 16 170 ** ret 171 */ 172 CALLER (u16, svuint16_t) 173 174 /* 175 ** caller_f16: 176 ** ... 177 ** bl callee_f16 178 ** ptrue (p[0-7])\.b, vl16 179 ** faddv h0, \1, z0\.h 180 ** ldp x29, x30, \[sp\], 16 181 ** ret 182 */ 183 CALLER (f16, svfloat16_t) 184 185 /* 186 ** caller_bf16: 187 ** ... 188 ** bl callee_bf16 189 ** ptrue (p[0-7])\.b, vl16 190 ** lasta h0, \1, z0\.h 191 ** ldp x29, x30, \[sp\], 16 192 ** ret 193 */ 194 CALLER_BF16 (bf16, svbfloat16_t) 195 196 /* 197 ** caller_s32: 198 ** ... 199 ** bl callee_s32 200 ** ptrue (p[0-7])\.b, vl16 201 ** saddv (d[0-9]+), \1, z0\.s 202 ** fmov x0, \2 203 ** ldp x29, x30, \[sp\], 16 204 ** ret 205 */ 206 CALLER (s32, svint32_t) 207 208 /* 209 ** caller_u32: 210 ** ... 211 ** bl callee_u32 212 ** ptrue (p[0-7])\.b, vl16 213 ** uaddv (d[0-9]+), \1, z0\.s 214 ** fmov x0, \2 215 ** ldp x29, x30, \[sp\], 16 216 ** ret 217 */ 218 CALLER (u32, svuint32_t) 219 220 /* 221 ** caller_f32: 222 ** ... 223 ** bl callee_f32 224 ** ptrue (p[0-7])\.b, vl16 225 ** faddv s0, \1, z0\.s 226 ** ldp x29, x30, \[sp\], 16 227 ** ret 228 */ 229 CALLER (f32, svfloat32_t) 230 231 /* 232 ** caller_s64: 233 ** ... 234 ** bl callee_s64 235 ** ptrue (p[0-7])\.b, vl16 236 ** uaddv (d[0-9]+), \1, z0\.d 237 ** fmov x0, \2 238 ** ldp x29, x30, \[sp\], 16 239 ** ret 240 */ 241 CALLER (s64, svint64_t) 242 243 /* 244 ** caller_u64: 245 ** ... 246 ** bl callee_u64 247 ** ptrue (p[0-7])\.b, vl16 248 ** uaddv (d[0-9]+), \1, z0\.d 249 ** fmov x0, \2 250 ** ldp x29, x30, \[sp\], 16 251 ** ret 252 */ 253 CALLER (u64, svuint64_t) 254 255 /* 256 ** caller_f64: 257 ** ... 258 ** bl callee_f64 259 ** ptrue (p[0-7])\.b, vl16 260 ** faddv d0, \1, z0\.d 261 ** ldp x29, x30, \[sp\], 16 262 ** ret 263 */ 264 CALLER (f64, svfloat64_t) 265