arm64-scalar-test.c revision 651f13cea278ec967336033dd032faef0e9fc2ec
1// REQUIRES: arm64-registered-target 2// RUN: %clang_cc1 -triple arm64-apple-ios7.0 \ 3// RUN: -S -O1 -o - -ffreestanding %s | FileCheck %s 4 5// We're explicitly using arm_neon.h here: some types probably don't match 6// the ACLE definitions, but we want to check current codegen. 7#include <arm_neon.h> 8 9float test_vrsqrtss_f32(float a, float b) { 10// CHECK: test_vrsqrtss_f32 11 return vrsqrtss_f32(a, b); 12// CHECK: frsqrts {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 13} 14 15double test_vrsqrtsd_f64(double a, double b) { 16// CHECK: test_vrsqrtsd_f64 17 return vrsqrtsd_f64(a, b); 18// CHECK: frsqrts {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 19} 20 21int64x1_t test_vrshl_s64(int64x1_t a, int64x1_t b) { 22// CHECK: test_vrshl_s64 23 return vrshl_s64(a, b); 24// CHECK: srshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 25} 26 27uint64x1_t test_vrshl_u64(uint64x1_t a, int64x1_t b) { 28// CHECK: test_vrshl_u64 29 return vrshl_u64(a, b); 30// CHECK: urshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 31} 32 33// CHECK: test_vrshld_s64 34int64_t test_vrshld_s64(int64_t a, int64_t b) { 35 return vrshld_s64(a, b); 36// CHECK: srshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 37} 38 39// CHECK: test_vrshld_u64 40uint64_t test_vrshld_u64(uint64_t a, uint64_t b) { 41 return vrshld_u64(a, b); 42// CHECK: urshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 43} 44 45// CHECK: test_vqrshlb_s8 46int8_t test_vqrshlb_s8(int8_t a, int8_t b) { 47 return vqrshlb_s8(a, b); 48// CHECK: sqrshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 49} 50 51// CHECK: test_vqrshlh_s16 52int16_t test_vqrshlh_s16(int16_t a, int16_t b) { 53 return vqrshlh_s16(a, b); 54// CHECK: sqrshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 55} 56 57// CHECK: test_vqrshls_s32 58int32_t test_vqrshls_s32(int32_t a, int32_t b) { 59 return vqrshls_s32(a, b); 60// CHECK: sqrshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 61} 62 63// CHECK: test_vqrshld_s64 64int64_t test_vqrshld_s64(int64_t a, int64_t b) { 65 return vqrshld_s64(a, b); 66// CHECK: sqrshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 67} 68 69// CHECK: test_vqrshlb_u8 70uint8_t test_vqrshlb_u8(uint8_t a, uint8_t b) { 71 return vqrshlb_u8(a, b); 72// CHECK: uqrshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 73} 74 75// CHECK: test_vqrshlh_u16 76uint16_t test_vqrshlh_u16(uint16_t a, uint16_t b) { 77 return vqrshlh_u16(a, b); 78// CHECK: uqrshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 79} 80 81// CHECK: test_vqrshls_u32 82uint32_t test_vqrshls_u32(uint32_t a, uint32_t b) { 83 return vqrshls_u32(a, b); 84// CHECK: uqrshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 85} 86 87// CHECK: test_vqrshld_u64 88uint64_t test_vqrshld_u64(uint64_t a, uint64_t b) { 89 return vqrshld_u64(a, b); 90// CHECK: uqrshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 91} 92 93// CHECK: test_vqshlb_s8 94int8_t test_vqshlb_s8(int8_t a, int8_t b) { 95 return vqshlb_s8(a, b); 96// CHECK: sqshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 97} 98 99// CHECK: test_vqshlh_s16 100int16_t test_vqshlh_s16(int16_t a, int16_t b) { 101 return vqshlh_s16(a, b); 102// CHECK: sqshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 103} 104 105// CHECK: test_vqshls_s32 106int32_t test_vqshls_s32(int32_t a, int32_t b) { 107 return vqshls_s32(a, b); 108// CHECK: sqshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 109} 110 111// CHECK: test_vqshld_s64 112int64_t test_vqshld_s64(int64_t a, int64_t b) { 113 return vqshld_s64(a, b); 114// CHECK: sqshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 115} 116 117// CHECK: test_vqshlb_u8 118uint8_t test_vqshlb_u8(uint8_t a, uint8_t b) { 119 return vqshlb_u8(a, b); 120// CHECK: uqshl.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 121} 122 123// CHECK: test_vqshlh_u16 124uint16_t test_vqshlh_u16(uint16_t a, uint16_t b) { 125 return vqshlh_u16(a, b); 126// CHECK: uqshl.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 127} 128 129// CHECK: test_vqshls_u32 130uint32_t test_vqshls_u32(uint32_t a, uint32_t b) { 131 return vqshls_u32(a, b); 132// CHECK: uqshl {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 133} 134 135// CHECK: test_vqshld_u64 136uint64_t test_vqshld_u64(uint64_t a, uint64_t b) { 137 return vqshld_u64(a, b); 138// CHECK: uqshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 139} 140 141// CHECK: test_vshld_u64 142uint64_t test_vshld_u64(uint64_t a, uint64_t b) { 143 return vshld_u64(a, b); 144// CHECK: ushl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 145} 146 147// CHECK: test_vshld_s64 148int64_t test_vshld_s64(int64_t a, int64_t b) { 149 return vshld_s64(a, b); 150// CHECK: sshl {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 151} 152 153// CHECK: test_vqdmullh_s16 154int32_t test_vqdmullh_s16(int16_t a, int16_t b) { 155 return vqdmullh_s16(a, b); 156// CHECK: sqdmull.4s {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 157} 158 159// CHECK: test_vqdmulls_s32 160int64_t test_vqdmulls_s32(int32_t a, int32_t b) { 161 return vqdmulls_s32(a, b); 162// CHECK: sqdmull {{d[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 163} 164 165// CHECK: test_vqaddb_s8 166int8_t test_vqaddb_s8(int8_t a, int8_t b) { 167 return vqaddb_s8(a, b); 168// CHECK: sqadd.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 169} 170 171// CHECK: test_vqaddh_s16 172int16_t test_vqaddh_s16(int16_t a, int16_t b) { 173 return vqaddh_s16(a, b); 174// CHECK: sqadd.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 175} 176 177// CHECK: test_vqadds_s32 178int32_t test_vqadds_s32(int32_t a, int32_t b) { 179 return vqadds_s32(a, b); 180// CHECK: sqadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 181} 182 183// CHECK: test_vqaddd_s64 184int64_t test_vqaddd_s64(int64_t a, int64_t b) { 185 return vqaddd_s64(a, b); 186// CHECK: sqadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 187} 188 189// CHECK: test_vqaddb_u8 190uint8_t test_vqaddb_u8(uint8_t a, uint8_t b) { 191 return vqaddb_u8(a, b); 192// CHECK: uqadd.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 193} 194 195// CHECK: test_vqaddh_u16 196uint16_t test_vqaddh_u16(uint16_t a, uint16_t b) { 197 return vqaddh_u16(a, b); 198// CHECK: uqadd.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 199} 200 201// CHECK: test_vqadds_u32 202uint32_t test_vqadds_u32(uint32_t a, uint32_t b) { 203 return vqadds_u32(a, b); 204// CHECK: uqadd {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 205} 206 207// CHECK: test_vqaddd_u64 208uint64_t test_vqaddd_u64(uint64_t a, uint64_t b) { 209 return vqaddd_u64(a, b); 210// CHECK: uqadd {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 211} 212 213// CHECK: test_vqsubb_s8 214int8_t test_vqsubb_s8(int8_t a, int8_t b) { 215 return vqsubb_s8(a, b); 216// CHECK: sqsub.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 217} 218 219// CHECK: test_vqsubh_s16 220int16_t test_vqsubh_s16(int16_t a, int16_t b) { 221 return vqsubh_s16(a, b); 222// CHECK: sqsub.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 223} 224 225// CHECK: test_vqsubs_s32 226int32_t test_vqsubs_s32(int32_t a, int32_t b) { 227 return vqsubs_s32(a, b); 228// CHECK: sqsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 229} 230 231// CHECK: test_vqsubd_s64 232int64_t test_vqsubd_s64(int64_t a, int64_t b) { 233 return vqsubd_s64(a, b); 234// CHECK: sqsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 235} 236 237// CHECK: test_vqsubb_u8 238uint8_t test_vqsubb_u8(uint8_t a, uint8_t b) { 239 return vqsubb_u8(a, b); 240// CHECK: uqsub.8b {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 241} 242 243// CHECK: test_vqsubh_u16 244uint16_t test_vqsubh_u16(uint16_t a, uint16_t b) { 245 return vqsubh_u16(a, b); 246// CHECK: uqsub.4h {{v[0-9]+}}, {{v[0-9]+}}, {{v[0-9]+}} 247} 248 249// CHECK: test_vqsubs_u32 250uint32_t test_vqsubs_u32(uint32_t a, uint32_t b) { 251 return vqsubs_u32(a, b); 252// CHECK: uqsub {{s[0-9]+}}, {{s[0-9]+}}, {{s[0-9]+}} 253} 254 255// CHECK: test_vqsubd_u64 256uint64_t test_vqsubd_u64(uint64_t a, uint64_t b) { 257 return vqsubd_u64(a, b); 258// CHECK: uqsub {{d[0-9]+}}, {{d[0-9]+}}, {{d[0-9]+}} 259} 260 261// CHECK: test_vqmovnh_s16 262int8_t test_vqmovnh_s16(int16_t a) { 263 return vqmovnh_s16(a); 264// CHECK: sqxtn.8b {{v[0-9]+}}, {{v[0-9]+}} 265} 266 267// CHECK: test_vqmovnh_u16 268uint8_t test_vqmovnh_u16(uint16_t a) { 269 return vqmovnh_u16(a); 270// CHECK: uqxtn.8b {{v[0-9]+}}, {{v[0-9]+}} 271} 272 273// CHECK: test_vqmovns_s32 274int16_t test_vqmovns_s32(int32_t a) { 275 return vqmovns_s32(a); 276// CHECK: sqxtn.4h {{v[0-9]+}}, {{v[0-9]+}} 277} 278 279// CHECK: test_vqmovns_u32 280uint16_t test_vqmovns_u32(uint32_t a) { 281 return vqmovns_u32(a); 282// CHECK: uqxtn.4h {{v[0-9]+}}, {{v[0-9]+}} 283} 284 285// CHECK: test_vqmovnd_s64 286int32_t test_vqmovnd_s64(int64_t a) { 287 return vqmovnd_s64(a); 288// CHECK: sqxtn {{s[0-9]+}}, {{d[0-9]+}} 289} 290 291// CHECK: test_vqmovnd_u64 292uint32_t test_vqmovnd_u64(uint64_t a) { 293 return vqmovnd_u64(a); 294// CHECK: uqxtn {{s[0-9]+}}, {{d[0-9]+}} 295} 296 297// CHECK: test_vqmovunh_s16 298int8_t test_vqmovunh_s16(int16_t a) { 299 return vqmovunh_s16(a); 300// CHECK: sqxtun.8b {{v[0-9]+}}, {{v[0-9]+}} 301} 302 303// CHECK: test_vqmovuns_s32 304int16_t test_vqmovuns_s32(int32_t a) { 305 return vqmovuns_s32(a); 306// CHECK: sqxtun.4h {{v[0-9]+}}, {{v[0-9]+}} 307} 308 309// CHECK: test_vqmovund_s64 310int32_t test_vqmovund_s64(int64_t a) { 311 return vqmovund_s64(a); 312// CHECK: sqxtun {{s[0-9]+}}, {{d[0-9]+}} 313} 314 315// CHECK: test_vqabsb_s8 316int8_t test_vqabsb_s8(int8_t a) { 317 return vqabsb_s8(a); 318// CHECK: sqabs.8b {{v[0-9]+}}, {{v[0-9]+}} 319} 320 321// CHECK: test_vqabsh_s16 322int16_t test_vqabsh_s16(int16_t a) { 323 return vqabsh_s16(a); 324// CHECK: sqabs.4h {{v[0-9]+}}, {{v[0-9]+}} 325} 326 327// CHECK: test_vqabss_s32 328int32_t test_vqabss_s32(int32_t a) { 329 return vqabss_s32(a); 330// CHECK: sqabs {{s[0-9]+}}, {{s[0-9]+}} 331} 332 333// CHECK: test_vqabsd_s64 334int64_t test_vqabsd_s64(int64_t a) { 335 return vqabsd_s64(a); 336// CHECK: sqabs {{d[0-9]+}}, {{d[0-9]+}} 337} 338 339// CHECK: test_vqnegb_s8 340int8_t test_vqnegb_s8(int8_t a) { 341 return vqnegb_s8(a); 342// CHECK: sqneg.8b {{v[0-9]+}}, {{v[0-9]+}} 343} 344 345// CHECK: test_vqnegh_s16 346int16_t test_vqnegh_s16(int16_t a) { 347 return vqnegh_s16(a); 348// CHECK: sqneg.4h {{v[0-9]+}}, {{v[0-9]+}} 349} 350 351// CHECK: test_vqnegs_s32 352int32_t test_vqnegs_s32(int32_t a) { 353 return vqnegs_s32(a); 354// CHECK: sqneg {{s[0-9]+}}, {{s[0-9]+}} 355} 356 357// CHECK: test_vqnegd_s64 358int64_t test_vqnegd_s64(int64_t a) { 359 return vqnegd_s64(a); 360// CHECK: sqneg {{d[0-9]+}}, {{d[0-9]+}} 361} 362 363// CHECK: test_vcvts_n_f32_s32 364float32_t test_vcvts_n_f32_s32(int32_t a) { 365 return vcvts_n_f32_s32(a, 3); 366// CHECK: scvtf {{s[0-9]+}}, {{s[0-9]+}}, #3 367} 368 369// CHECK: test_vcvts_n_f32_u32 370float32_t test_vcvts_n_f32_u32(uint32_t a) { 371 return vcvts_n_f32_u32(a, 3); 372// CHECK: ucvtf {{s[0-9]+}}, {{s[0-9]+}}, #3 373} 374 375// CHECK: test_vcvtd_n_f64_s64 376float64_t test_vcvtd_n_f64_s64(int64_t a) { 377 return vcvtd_n_f64_s64(a, 3); 378// CHECK: scvtf {{d[0-9]+}}, {{d[0-9]+}}, #3 379} 380 381// CHECK: test_vcvtd_n_f64_u64 382float64_t test_vcvtd_n_f64_u64(uint64_t a) { 383 return vcvtd_n_f64_u64(a, 3); 384// CHECK: ucvtf {{d[0-9]+}}, {{d[0-9]+}}, #3 385} 386 387// CHECK: test_vcvts_n_s32_f32 388int32_t test_vcvts_n_s32_f32(float32_t a) { 389 return vcvts_n_s32_f32(a, 3); 390// CHECK: fcvtzs {{s[0-9]+}}, {{s[0-9]+}}, #3 391} 392 393// CHECK: test_vcvts_n_u32_f32 394uint32_t test_vcvts_n_u32_f32(float32_t a) { 395 return vcvts_n_u32_f32(a, 3); 396// CHECK: fcvtzu {{s[0-9]+}}, {{s[0-9]+}}, #3 397} 398 399// CHECK: test_vcvtd_n_s64_f64 400int64_t test_vcvtd_n_s64_f64(float64_t a) { 401 return vcvtd_n_s64_f64(a, 3); 402// CHECK: fcvtzs {{d[0-9]+}}, {{d[0-9]+}}, #3 403} 404 405// CHECK: test_vcvtd_n_u64_f64 406uint64_t test_vcvtd_n_u64_f64(float64_t a) { 407 return vcvtd_n_u64_f64(a, 3); 408// CHECK: fcvtzu {{d[0-9]+}}, {{d[0-9]+}}, #3 409} 410 411// CHECK: test_vcvtas_s32_f32 412int32_t test_vcvtas_s32_f32(float32_t a) { 413 return vcvtas_s32_f32(a); 414// CHECK: fcvtas {{w[0-9]+}}, {{s[0-9]+}} 415} 416 417// CHECK: test_vcvtas_u32_f32 418uint32_t test_vcvtas_u32_f32(float32_t a) { 419 return vcvtas_u32_f32(a); 420// CHECK: fcvtau {{w[0-9]+}}, {{s[0-9]+}} 421} 422 423// CHECK: test_vcvtad_s64_f64 424int64_t test_vcvtad_s64_f64(float64_t a) { 425 return vcvtad_s64_f64(a); 426// CHECK: fcvtas {{x[0-9]+}}, {{d[0-9]+}} 427} 428 429// CHECK: test_vcvtad_u64_f64 430uint64_t test_vcvtad_u64_f64(float64_t a) { 431 return vcvtad_u64_f64(a); 432// CHECK: fcvtau {{x[0-9]+}}, {{d[0-9]+}} 433} 434 435// CHECK: test_vcvtms_s32_f32 436int32_t test_vcvtms_s32_f32(float32_t a) { 437 return vcvtms_s32_f32(a); 438// CHECK: fcvtms {{w[0-9]+}}, {{s[0-9]+}} 439} 440 441// CHECK: test_vcvtms_u32_f32 442uint32_t test_vcvtms_u32_f32(float32_t a) { 443 return vcvtms_u32_f32(a); 444// CHECK: fcvtmu {{w[0-9]+}}, {{s[0-9]+}} 445} 446 447// CHECK: test_vcvtmd_s64_f64 448int64_t test_vcvtmd_s64_f64(float64_t a) { 449 return vcvtmd_s64_f64(a); 450// CHECK: fcvtms {{x[0-9]+}}, {{d[0-9]+}} 451} 452 453// CHECK: test_vcvtmd_u64_f64 454uint64_t test_vcvtmd_u64_f64(float64_t a) { 455 return vcvtmd_u64_f64(a); 456// CHECK: fcvtmu {{x[0-9]+}}, {{d[0-9]+}} 457} 458 459// CHECK: test_vcvtns_s32_f32 460int32_t test_vcvtns_s32_f32(float32_t a) { 461 return vcvtns_s32_f32(a); 462// CHECK: fcvtns {{w[0-9]+}}, {{s[0-9]+}} 463} 464 465// CHECK: test_vcvtns_u32_f32 466uint32_t test_vcvtns_u32_f32(float32_t a) { 467 return vcvtns_u32_f32(a); 468// CHECK: fcvtnu {{w[0-9]+}}, {{s[0-9]+}} 469} 470 471// CHECK: test_vcvtnd_s64_f64 472int64_t test_vcvtnd_s64_f64(float64_t a) { 473 return vcvtnd_s64_f64(a); 474// CHECK: fcvtns {{x[0-9]+}}, {{d[0-9]+}} 475} 476 477// CHECK: test_vcvtnd_u64_f64 478uint64_t test_vcvtnd_u64_f64(float64_t a) { 479 return vcvtnd_u64_f64(a); 480// CHECK: fcvtnu {{x[0-9]+}}, {{d[0-9]+}} 481} 482 483// CHECK: test_vcvtps_s32_f32 484int32_t test_vcvtps_s32_f32(float32_t a) { 485 return vcvtps_s32_f32(a); 486// CHECK: fcvtps {{w[0-9]+}}, {{s[0-9]+}} 487} 488 489// CHECK: test_vcvtps_u32_f32 490uint32_t test_vcvtps_u32_f32(float32_t a) { 491 return vcvtps_u32_f32(a); 492// CHECK: fcvtpu {{w[0-9]+}}, {{s[0-9]+}} 493} 494 495// CHECK: test_vcvtpd_s64_f64 496int64_t test_vcvtpd_s64_f64(float64_t a) { 497 return vcvtpd_s64_f64(a); 498// CHECK: fcvtps {{x[0-9]+}}, {{d[0-9]+}} 499} 500 501// CHECK: test_vcvtpd_u64_f64 502uint64_t test_vcvtpd_u64_f64(float64_t a) { 503 return vcvtpd_u64_f64(a); 504// CHECK: fcvtpu {{x[0-9]+}}, {{d[0-9]+}} 505} 506 507// CHECK: test_vcvtxd_f32_f64 508float32_t test_vcvtxd_f32_f64(float64_t a) { 509 return vcvtxd_f32_f64(a); 510// CHECK: fcvtxn {{s[0-9]+}}, {{d[0-9]+}} 511} 512 513// CHECK: test_vabds_f32 514float32_t test_vabds_f32(float32_t a, float32_t b) { 515 return vabds_f32(a, b); 516 // CHECK: fabd {{s[0-9]+}}, {{s[0-9]+}} 517} 518 519// CHECK: test_vabdd_f64 520float64_t test_vabdd_f64(float64_t a, float64_t b) { 521 return vabdd_f64(a, b); 522 // CHECK: fabd {{d[0-9]+}}, {{d[0-9]+}} 523} 524 525// CHECK: test_vmulxs_f32 526float32_t test_vmulxs_f32(float32_t a, float32_t b) { 527 return vmulxs_f32(a, b); 528 // CHECK: fmulx {{s[0-9]+}}, {{s[0-9]+}} 529} 530 531// CHECK: test_vmulxd_f64 532float64_t test_vmulxd_f64(float64_t a, float64_t b) { 533 return vmulxd_f64(a, b); 534 // CHECK: fmulx {{d[0-9]+}}, {{d[0-9]+}} 535} 536