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