1 2 /* 3 gcc -o v8fpsimd_a v8fpsimd_a.c -march=armv8-a -mfpu=crypto-neon-fp-armv8 \ 4 -I../../.. -Wall -g -marm 5 6 gcc -o v8fpsimd_t v8fpsimd_a.c -march=armv8-a -mfpu=crypto-neon-fp-armv8 \ 7 -I../../.. -Wall -g 8 */ 9 10 #include <stdio.h> 11 #include <assert.h> 12 #include <malloc.h> // memalign 13 #include <string.h> // memset 14 #include "tests/malloc.h" 15 #include <math.h> // isnormal 16 17 typedef unsigned char UChar; 18 typedef unsigned short int UShort; 19 typedef unsigned int UInt; 20 typedef signed int Int; 21 typedef unsigned char UChar; 22 typedef unsigned long long int ULong; 23 typedef signed long long int Long; 24 typedef double Double; 25 typedef float Float; 26 27 typedef unsigned char Bool; 28 #define False ((Bool)0) 29 #define True ((Bool)1) 30 31 32 #define ITERS 1 33 34 typedef 35 enum { TyHF=1234, TySF, TyDF, TyB, TyH, TyS, TyD, TyNONE } 36 LaneTy; 37 38 union _V128 { 39 UChar u8[16]; 40 UShort u16[8]; 41 UInt u32[4]; 42 ULong u64[2]; 43 Float f32[4]; 44 Double f64[2]; 45 }; 46 typedef union _V128 V128; 47 48 static inline UChar randUChar ( void ) 49 { 50 static UInt seed = 80021; 51 seed = 1103515245 * seed + 12345; 52 return (seed >> 17) & 0xFF; 53 } 54 55 //static ULong randULong ( LaneTy ty ) 56 //{ 57 // Int i; 58 // ULong r = 0; 59 // for (i = 0; i < 8; i++) { 60 // r = (r << 8) | (ULong)(0xFF & randUChar()); 61 // } 62 // return r; 63 //} 64 65 /* Generates a random V128. Ensures that that it contains normalised 66 FP numbers when viewed as either F32x4 or F64x2, so that it is 67 reasonable to use in FP test cases. */ 68 static void randV128 ( /*OUT*/V128* v, LaneTy ty ) 69 { 70 static UInt nCalls = 0, nIters = 0; 71 Int i; 72 nCalls++; 73 while (1) { 74 nIters++; 75 for (i = 0; i < 16; i++) { 76 v->u8[i] = randUChar(); 77 } 78 if (randUChar() < 32) { 79 /* once every 8 times, clone one of the lanes */ 80 switch (ty) { 81 case TySF: case TyS: { 82 UInt l1, l2; 83 while (1) { 84 l1 = randUChar() & 3; 85 l2 = randUChar() & 3; 86 if (l1 != l2) break; 87 } 88 assert(l1 < 4 && l2 < 4); 89 v->u32[l1] = v->u32[l2]; 90 printf("randV128: doing v->u32[%u] = v->u32[%u]\n", l1, l2); 91 break; 92 } 93 case TyDF: case TyD: { 94 UInt l1, l2; 95 while (1) { 96 l1 = randUChar() & 1; 97 l2 = randUChar() & 1; 98 if (l1 != l2) break; 99 } 100 assert(l1 < 2 && l2 < 2); 101 printf("randV128: doing v->u64[%u] = v->u64[%u]\n", l1, l2); 102 v->u64[l1] = v->u64[l2]; 103 break; 104 } 105 default: 106 break; 107 } 108 } 109 if (isnormal(v->f32[0]) && isnormal(v->f32[1]) && isnormal(v->f32[2]) 110 && isnormal(v->f32[3]) && isnormal(v->f64[0]) && isnormal(v->f64[1])) 111 break; 112 } 113 if (0 == (nCalls & 0xFF)) 114 printf("randV128: %u calls, %u iters\n", nCalls, nIters); 115 } 116 117 static void showV128 ( V128* v ) 118 { 119 Int i; 120 for (i = 15; i >= 0; i--) 121 printf("%02x", (Int)v->u8[i]); 122 } 123 124 //static void showBlock ( const char* msg, V128* block, Int nBlock ) 125 //{ 126 // Int i; 127 // printf("%s\n", msg); 128 // for (i = 0; i < nBlock; i++) { 129 // printf(" "); 130 // showV128(&block[i]); 131 // printf("\n"); 132 // } 133 //} 134 135 136 /* ---------------------------------------------------------------- */ 137 /* -- Parameterisable test macros -- */ 138 /* ---------------------------------------------------------------- */ 139 140 #define DO50(_action) \ 141 do { \ 142 Int _qq; for (_qq = 0; _qq < 50; _qq++) { _action ; } \ 143 } while (0) 144 145 146 /* Are we compiling for thumb or arm encodings? This has a bearing 147 on the inline assembly syntax needed below. */ 148 149 #if defined(__thumb__) || defined(__thumb2__) 150 # define IT_EQ "it eq ; " 151 # define IT_NE "it ne ; " 152 # define IT_AL /* */ 153 #else 154 # define IT_EQ /* */ 155 # define IT_NE /* */ 156 # define IT_AL /* */ 157 #endif 158 159 160 /* Generate a test that involves two vector regs, 161 with no bias as towards which is input or output. 162 It's OK to use r8 as scratch. 163 164 Note that the insn doesn't *have* to use Q (128 bit) registers -- 165 it can instead mention D (64 bit) and S (32-bit) registers. 166 However, in that case callers of this macro must be very careful to 167 specify QVECREG1NO and QVECREG2NO in such a way as to cover all of 168 the mentioned D and S registers, using the relations 169 170 D<n> == S<2n+1> and S<2n> 171 Q<n> == D<2n+1> and D<2n> 172 173 Failing to do so correctly will make the test meaningless, because 174 it will potentially load test data into the wrong registers before 175 the test, and/or show the values of the wrong registers after the 176 test. The allowed register values are: 177 S: 0 .. 31 178 D: 0 .. 31 179 Q: 0 .. 15 180 Note that Q[15..0] == D[31..0] but S[31..0] only overlaps Q[0..7], 181 so a Q value of 8 or above is definitely invalid for a S register. 182 None of this is checked, though, so be careful when creating the 183 Q numbers. 184 185 It would be clearer and easier to write the Q numbers using integer 186 division. For example, in 187 188 GEN_TWOVEC_QDS_TEST(vcvtn_s32_f64, "vcvtn.s32.f64 s27, d5", 6,2) 189 190 instead of writing "6, 2" at the end, write "(27/4), (5/2)". This 191 would make clear the connection between the register numbers and 192 the Q numbers. Unfortunately those expressions need to expanded to 193 single digits at C-preprocessing time, and cpp won't do that. So 194 we have to do it the hard and error-prone way. 195 */ 196 #define GEN_TWOVEC_QDS_TEST(TESTNAME,INSN_PRE,INSN, \ 197 QVECREG1NO,QVECREG2NO) \ 198 __attribute__((noinline)) \ 199 static void test_##TESTNAME ( LaneTy ty ) { \ 200 Int i; \ 201 assert(QVECREG1NO >= 0 && QVECREG1NO <= 15); \ 202 assert(QVECREG2NO >= 0 && QVECREG2NO <= 15); \ 203 for (i = 0; i < ITERS; i++) { \ 204 V128 block[4+1]; \ 205 memset(block, 0x55, sizeof(block)); \ 206 randV128(&block[0], ty); \ 207 randV128(&block[1], ty); \ 208 randV128(&block[2], ty); \ 209 randV128(&block[3], ty); \ 210 __asm__ __volatile__( \ 211 "mov r9, #0 ; vmsr fpscr, r9 ; " \ 212 "msr apsr_nzcvq, r9 ; " \ 213 "add r9, %0, #0 ; vld1.8 { q"#QVECREG1NO" }, [r9] ; " \ 214 "add r9, %0, #16 ; vld1.8 { q"#QVECREG2NO" }, [r9] ; " \ 215 INSN_PRE INSN " ; " \ 216 "add r9, %0, #32 ; vst1.8 { q"#QVECREG1NO" }, [r9] ; " \ 217 "add r9, %0, #48 ; vst1.8 { q"#QVECREG2NO" }, [r9] ; " \ 218 "vmrs r9, fpscr ; str r9, [%0, #64] " \ 219 : : "r"(&block[0]) \ 220 : "cc", "memory", "q"#QVECREG1NO, "q"#QVECREG2NO, "r8", "r9" \ 221 ); \ 222 /* Don't use INSN_PRE in printing, since that differs */ \ 223 /* between ARM and Thumb and hence makes their outputs differ. */ \ 224 printf(INSN " "); \ 225 UInt fpscr = 0xFFFFFFE0 & block[4].u32[0]; \ 226 showV128(&block[0]); printf(" "); \ 227 showV128(&block[1]); printf(" "); \ 228 showV128(&block[2]); printf(" "); \ 229 showV128(&block[3]); printf(" fpscr=%08x\n", fpscr); \ 230 } \ 231 } 232 233 234 /* Generate a test that involves three vector regs, 235 with no bias as towards which is input or output. It's also OK 236 to use r8 as scratch. */ 237 #define GEN_THREEVEC_QDS_TEST(TESTNAME,INSN_PRE, \ 238 INSN,QVECREG1NO,QVECREG2NO,QVECREG3NO) \ 239 __attribute__((noinline)) \ 240 static void test_##TESTNAME ( LaneTy ty ) { \ 241 Int i; \ 242 assert(QVECREG1NO >= 0 && QVECREG1NO <= 15); \ 243 assert(QVECREG2NO >= 0 && QVECREG2NO <= 15); \ 244 assert(QVECREG3NO >= 0 && QVECREG3NO <= 15); \ 245 for (i = 0; i < ITERS; i++) { \ 246 V128 block[6+1]; \ 247 memset(block, 0x55, sizeof(block)); \ 248 randV128(&block[0], ty); \ 249 randV128(&block[1], ty); \ 250 randV128(&block[2], ty); \ 251 randV128(&block[3], ty); \ 252 randV128(&block[4], ty); \ 253 randV128(&block[5], ty); \ 254 __asm__ __volatile__( \ 255 "mov r9, #0 ; vmsr fpscr, r9 ; " \ 256 "msr apsr_nzcvq, r9 ; " \ 257 "add r9, %0, #0 ; vld1.8 { q"#QVECREG1NO" }, [r9] ; " \ 258 "add r9, %0, #16 ; vld1.8 { q"#QVECREG2NO" }, [r9] ; " \ 259 "add r9, %0, #32 ; vld1.8 { q"#QVECREG3NO" }, [r9] ; " \ 260 INSN_PRE INSN " ; " \ 261 "add r9, %0, #48 ; vst1.8 { q"#QVECREG1NO" }, [r9] ; " \ 262 "add r9, %0, #64 ; vst1.8 { q"#QVECREG2NO" }, [r9] ; " \ 263 "add r9, %0, #80 ; vst1.8 { q"#QVECREG3NO" }, [r9] ; " \ 264 "vmrs r9, fpscr ; str r9, [%0, #96] " \ 265 : : "r"(&block[0]) \ 266 : "cc", "memory", "q"#QVECREG1NO, "q"#QVECREG2NO, "q"#QVECREG3NO, \ 267 "r8", "r9" \ 268 ); \ 269 /* Don't use INSN_PRE in printing, since that differs */ \ 270 /* between ARM and Thumb and hence makes their outputs differ. */ \ 271 printf(INSN " "); \ 272 UInt fpscr = 0xFFFFFFE0 & block[6].u32[0]; \ 273 showV128(&block[0]); printf(" "); \ 274 showV128(&block[1]); printf(" "); \ 275 showV128(&block[2]); printf(" "); \ 276 showV128(&block[3]); printf(" "); \ 277 showV128(&block[4]); printf(" "); \ 278 showV128(&block[5]); printf(" fpscr=%08x\n", fpscr); \ 279 } \ 280 } 281 282 GEN_THREEVEC_QDS_TEST(vselge_f32, IT_AL, "vselge.f32 s15,s16,s20", 3,4,5) 283 GEN_THREEVEC_QDS_TEST(vselge_f64, IT_AL, "vselge.f64 d7, d8, d10", 3,4,5) 284 285 GEN_THREEVEC_QDS_TEST(vselgt_f32, IT_AL, "vselgt.f32 s15,s16,s20", 3,4,5) 286 GEN_THREEVEC_QDS_TEST(vselgt_f64, IT_AL, "vselgt.f64 d7, d8, d10", 3,4,5) 287 288 GEN_THREEVEC_QDS_TEST(vseleq_f32, IT_AL, "vseleq.f32 s15,s16,s20", 3,4,5) 289 GEN_THREEVEC_QDS_TEST(vseleq_f64, IT_AL, "vseleq.f64 d7, d8, d10", 3,4,5) 290 291 GEN_THREEVEC_QDS_TEST(vselvs_f32, IT_AL, "vselvs.f32 s15,s16,s20", 3,4,5) 292 GEN_THREEVEC_QDS_TEST(vselvs_f64, IT_AL, "vselvs.f64 d7, d8, d10", 3,4,5) 293 294 GEN_THREEVEC_QDS_TEST(vmaxnm_f32, IT_AL, "vmaxnm.f32 s15,s16,s20", 3,4,5) 295 GEN_THREEVEC_QDS_TEST(vmaxnm_f64, IT_AL, "vmaxnm.f64 d7, d8, d10", 3,4,5) 296 297 GEN_THREEVEC_QDS_TEST(vminnm_f32, IT_AL, "vminnm.f32 s15,s16,s20", 3,4,5) 298 GEN_THREEVEC_QDS_TEST(vminnm_f64, IT_AL, "vminnm.f64 d7, d8, d10", 3,4,5) 299 300 GEN_TWOVEC_QDS_TEST(vcvtn_s32_f64, IT_AL, "vcvtn.s32.f64 s27, d5", 6,2) 301 GEN_TWOVEC_QDS_TEST(vcvta_s32_f64, IT_AL, "vcvta.s32.f64 s4, d20", 1,10) 302 GEN_TWOVEC_QDS_TEST(vcvtp_s32_f64, IT_AL, "vcvtp.s32.f64 s7, d31", 1,15) 303 GEN_TWOVEC_QDS_TEST(vcvtm_s32_f64, IT_AL, "vcvtm.s32.f64 s1, d0", 0,0) 304 305 GEN_TWOVEC_QDS_TEST(vcvtn_s32_f32, IT_AL, "vcvtn.s32.f32 s27, s5", 6,1) 306 GEN_TWOVEC_QDS_TEST(vcvta_s32_f32, IT_AL, "vcvta.s32.f32 s4, s20", 1,5) 307 GEN_TWOVEC_QDS_TEST(vcvtp_s32_f32, IT_AL, "vcvtp.s32.f32 s7, s31", 1,7) 308 GEN_TWOVEC_QDS_TEST(vcvtm_s32_f32, IT_AL, "vcvtm.s32.f32 s1, s0", 0,0) 309 310 GEN_TWOVEC_QDS_TEST(vcvtn_u32_f64, IT_AL, "vcvtn.u32.f64 s27, d5", 6,2) 311 GEN_TWOVEC_QDS_TEST(vcvta_u32_f64, IT_AL, "vcvta.u32.f64 s4, d20", 1,10) 312 GEN_TWOVEC_QDS_TEST(vcvtp_u32_f64, IT_AL, "vcvtp.u32.f64 s7, d31", 1,15) 313 GEN_TWOVEC_QDS_TEST(vcvtm_u32_f64, IT_AL, "vcvtm.u32.f64 s1, d0", 0,0) 314 315 GEN_TWOVEC_QDS_TEST(vcvtn_u32_f32, IT_AL, "vcvtn.u32.f32 s27, s5", 6,1) 316 GEN_TWOVEC_QDS_TEST(vcvta_u32_f32, IT_AL, "vcvta.u32.f32 s4, s20", 1,5) 317 GEN_TWOVEC_QDS_TEST(vcvtp_u32_f32, IT_AL, "vcvtp.u32.f32 s7, s31", 1,7) 318 GEN_TWOVEC_QDS_TEST(vcvtm_u32_f32, IT_AL, "vcvtm.u32.f32 s1, s0", 0,0) 319 320 GEN_TWOVEC_QDS_TEST(vcvtb_f64_f16, IT_AL, "vcvtb.f64.f16 d27, s18", 13, 4) 321 GEN_TWOVEC_QDS_TEST(vcvtt_f64_f16, IT_AL, "vcvtt.f64.f16 d28, s17", 14, 4) 322 323 GEN_TWOVEC_QDS_TEST(vcvtb_f16_f64, IT_AL, "vcvtb.f16.f64 s9, d17", 2, 8) 324 GEN_TWOVEC_QDS_TEST(vcvtt_f16_f64, IT_AL, "vcvtt.f16.f64 s8, d27", 2, 13) 325 326 GEN_TWOVEC_QDS_TEST(vrintzeq_f64_f64, IT_EQ, "vrintzeq.f64.f64 d0, d9", 0, 4) 327 GEN_TWOVEC_QDS_TEST(vrintzne_f64_f64, IT_NE, "vrintzne.f64.f64 d1, d10", 0, 5) 328 GEN_TWOVEC_QDS_TEST(vrintzal_f64_f64, IT_AL, "vrintz.f64.f64 d2, d11", 1, 5) 329 330 GEN_TWOVEC_QDS_TEST(vrintreq_f64_f64, IT_EQ, "vrintreq.f64.f64 d3, d12", 1, 6) 331 GEN_TWOVEC_QDS_TEST(vrintrne_f64_f64, IT_NE, "vrintrne.f64.f64 d4, d13", 2, 6) 332 GEN_TWOVEC_QDS_TEST(vrintral_f64_f64, IT_AL, "vrintr.f64.f64 d5, d14", 2, 7) 333 334 GEN_TWOVEC_QDS_TEST(vrintxeq_f64_f64, IT_EQ, "vrintxeq.f64.f64 d6, d15", 3, 7) 335 GEN_TWOVEC_QDS_TEST(vrintxne_f64_f64, IT_NE, "vrintxne.f64.f64 d7, d16", 3, 8) 336 GEN_TWOVEC_QDS_TEST(vrintxal_f64_f64, IT_AL, "vrintx.f64.f64 d8, d8", 4, 4) 337 338 GEN_TWOVEC_QDS_TEST(vrintzeq_f32_f32, IT_EQ, "vrintzeq.f32.f32 s0, s9", 0, 2) 339 GEN_TWOVEC_QDS_TEST(vrintzne_f32_f32, IT_NE, "vrintzne.f32.f32 s1, s10", 0, 2) 340 GEN_TWOVEC_QDS_TEST(vrintzal_f32_f32, IT_AL, "vrintz.f32.f32 s2, s11", 0, 2) 341 342 GEN_TWOVEC_QDS_TEST(vrintreq_f32_f32, IT_EQ, "vrintreq.f32.f32 s3, s12", 0, 3) 343 GEN_TWOVEC_QDS_TEST(vrintrne_f32_f32, IT_NE, "vrintrne.f32.f32 s4, s13", 1, 3) 344 GEN_TWOVEC_QDS_TEST(vrintral_f32_f32, IT_AL, "vrintr.f32.f32 s5, s14", 1, 3) 345 346 GEN_TWOVEC_QDS_TEST(vrintxeq_f32_f32, IT_EQ, "vrintxeq.f32.f32 s6, s15", 1, 3) 347 GEN_TWOVEC_QDS_TEST(vrintxne_f32_f32, IT_NE, "vrintxne.f32.f32 s7, s16", 1, 4) 348 GEN_TWOVEC_QDS_TEST(vrintxal_f32_f32, IT_AL, "vrintx.f32.f32 s8, s8", 2, 2) 349 350 GEN_TWOVEC_QDS_TEST(vrintn_f64_f64, IT_AL, "vrintn.f64.f64 d3, d15", 1, 7) 351 GEN_TWOVEC_QDS_TEST(vrinta_f64_f64, IT_AL, "vrinta.f64.f64 d6, d18", 3, 9) 352 GEN_TWOVEC_QDS_TEST(vrintp_f64_f64, IT_AL, "vrintp.f64.f64 d9, d21", 4, 10) 353 GEN_TWOVEC_QDS_TEST(vrintm_f64_f64, IT_AL, "vrintm.f64.f64 d12, d12", 6, 6) 354 355 GEN_TWOVEC_QDS_TEST(vrintn_f32_f32, IT_AL, "vrintn.f32.f32 s3, s15", 0, 3) 356 GEN_TWOVEC_QDS_TEST(vrinta_f32_f32, IT_AL, "vrinta.f32.f32 s6, s18", 1, 4) 357 GEN_TWOVEC_QDS_TEST(vrintp_f32_f32, IT_AL, "vrintp.f32.f32 s9, s21", 2, 5) 358 GEN_TWOVEC_QDS_TEST(vrintm_f32_f32, IT_AL, "vrintm.f32.f32 s12, s12", 3, 3) 359 360 GEN_THREEVEC_QDS_TEST(vmaxnm_f32_vec64, 361 IT_AL, "vmaxnm.f32 d15,d16,d20", 7,8,10) 362 GEN_THREEVEC_QDS_TEST(vmaxnm_f32_vec128, 363 IT_AL, "vmaxnm.f32 q7, q8, q10", 7,8,10) 364 365 GEN_THREEVEC_QDS_TEST(vminnm_f32_vec64, 366 IT_AL, "vminnm.f32 d15,d16,d20", 7,8,10) 367 GEN_THREEVEC_QDS_TEST(vminnm_f32_vec128, 368 IT_AL, "vminnm.f32 q7, q8, q10", 7,8,10) 369 370 GEN_TWOVEC_QDS_TEST(vcvtn_s32_f32_vec64, 371 IT_AL, "vcvtn.s32.f32 d0, d20", 0, 10) 372 GEN_TWOVEC_QDS_TEST(vcvta_s32_f32_vec64, 373 IT_AL, "vcvta.s32.f32 d5, d25", 2, 12) 374 GEN_TWOVEC_QDS_TEST(vcvtp_s32_f32_vec64, 375 IT_AL, "vcvtp.s32.f32 d10, d30", 5, 15) 376 GEN_TWOVEC_QDS_TEST(vcvtm_s32_f32_vec64, 377 IT_AL, "vcvtm.s32.f32 d15, d15", 7, 7) 378 379 GEN_TWOVEC_QDS_TEST(vcvtn_s32_f32_vec128, 380 IT_AL, "vcvtn.s32.f32 q15, q0", 15, 0) 381 GEN_TWOVEC_QDS_TEST(vcvta_s32_f32_vec128, 382 IT_AL, "vcvta.s32.f32 q14, q1", 14, 1) 383 GEN_TWOVEC_QDS_TEST(vcvtp_s32_f32_vec128, 384 IT_AL, "vcvtp.s32.f32 q13, q2", 13, 2) 385 GEN_TWOVEC_QDS_TEST(vcvtm_s32_f32_vec128, 386 IT_AL, "vcvtm.s32.f32 q12, q3", 12, 3) 387 388 GEN_TWOVEC_QDS_TEST(vcvtn_u32_f32_vec64, 389 IT_AL, "vcvtn.u32.f32 d0, d20", 0, 10) 390 GEN_TWOVEC_QDS_TEST(vcvta_u32_f32_vec64, 391 IT_AL, "vcvta.u32.f32 d5, d25", 2, 12) 392 GEN_TWOVEC_QDS_TEST(vcvtp_u32_f32_vec64, 393 IT_AL, "vcvtp.u32.f32 d10, d30", 5, 15) 394 GEN_TWOVEC_QDS_TEST(vcvtm_u32_f32_vec64, 395 IT_AL, "vcvtm.u32.f32 d15, d15", 7, 7) 396 397 GEN_TWOVEC_QDS_TEST(vcvtn_u32_f32_vec128, 398 IT_AL, "vcvtn.u32.f32 q15, q0", 15, 0) 399 GEN_TWOVEC_QDS_TEST(vcvta_u32_f32_vec128, 400 IT_AL, "vcvta.u32.f32 q14, q1", 14, 1) 401 GEN_TWOVEC_QDS_TEST(vcvtp_u32_f32_vec128, 402 IT_AL, "vcvtp.u32.f32 q13, q2", 13, 2) 403 GEN_TWOVEC_QDS_TEST(vcvtm_u32_f32_vec128, 404 IT_AL, "vcvtm.u32.f32 q12, q3", 12, 3) 405 406 GEN_TWOVEC_QDS_TEST(vrintn_f32_f32_vec64, 407 IT_AL, "vrintn.f32.f32 d0, d18", 0, 9) 408 GEN_TWOVEC_QDS_TEST(vrinta_f32_f32_vec64, 409 IT_AL, "vrinta.f32.f32 d3, d21", 1, 10) 410 GEN_TWOVEC_QDS_TEST(vrintp_f32_f32_vec64, 411 IT_AL, "vrintp.f32.f32 d6, d24", 3, 12) 412 GEN_TWOVEC_QDS_TEST(vrintm_f32_f32_vec64, 413 IT_AL, "vrintm.f32.f32 d9, d27", 4, 13) 414 GEN_TWOVEC_QDS_TEST(vrintz_f32_f32_vec64, 415 IT_AL, "vrintz.f32.f32 d12, d30", 6, 15) 416 GEN_TWOVEC_QDS_TEST(vrintx_f32_f32_vec64, 417 IT_AL, "vrintx.f32.f32 d15, d15", 7, 7) 418 419 GEN_TWOVEC_QDS_TEST(vrintn_f32_f32_vec128, 420 IT_AL, "vrintn.f32.f32 q0, q2", 0, 2) 421 GEN_TWOVEC_QDS_TEST(vrinta_f32_f32_vec128, 422 IT_AL, "vrinta.f32.f32 q3, q5", 3, 5) 423 GEN_TWOVEC_QDS_TEST(vrintp_f32_f32_vec128, 424 IT_AL, "vrintp.f32.f32 q6, q8", 6, 8) 425 GEN_TWOVEC_QDS_TEST(vrintm_f32_f32_vec128, 426 IT_AL, "vrintm.f32.f32 q9, q11", 9, 11) 427 GEN_TWOVEC_QDS_TEST(vrintz_f32_f32_vec128, 428 IT_AL, "vrintz.f32.f32 q12, q14", 12, 14) 429 GEN_TWOVEC_QDS_TEST(vrintx_f32_f32_vec128, 430 IT_AL, "vrintx.f32.f32 q15, q15", 15, 15) 431 432 int main ( void ) 433 { 434 if (1) DO50( test_vselge_f32(TySF) ); 435 if (1) DO50( test_vselge_f64(TyDF) ); 436 437 if (1) DO50( test_vselgt_f32(TySF) ); 438 if (1) DO50( test_vselgt_f64(TyDF) ); 439 440 if (1) DO50( test_vseleq_f32(TySF) ); 441 if (1) DO50( test_vseleq_f64(TyDF) ); 442 443 if (1) DO50( test_vselvs_f32(TySF) ); 444 if (1) DO50( test_vselvs_f64(TyDF) ); 445 446 if (1) DO50( test_vmaxnm_f32(TySF) ); 447 if (1) DO50( test_vmaxnm_f64(TyDF) ); 448 449 if (1) DO50( test_vminnm_f32(TySF) ); 450 if (1) DO50( test_vminnm_f64(TyDF) ); 451 452 if (1) DO50( test_vcvtn_s32_f64(TyDF) ); 453 if (1) DO50( test_vcvta_s32_f64(TyDF) ); 454 if (1) DO50( test_vcvtp_s32_f64(TyDF) ); 455 if (1) DO50( test_vcvtm_s32_f64(TyDF) ); 456 457 if (1) DO50( test_vcvtn_s32_f32(TySF) ); 458 if (1) DO50( test_vcvta_s32_f32(TySF) ); 459 if (1) DO50( test_vcvtp_s32_f32(TySF) ); 460 if (1) DO50( test_vcvtm_s32_f32(TySF) ); 461 462 if (1) DO50( test_vcvtn_u32_f64(TyDF) ); 463 if (1) DO50( test_vcvta_u32_f64(TyDF) ); 464 if (1) DO50( test_vcvtp_u32_f64(TyDF) ); 465 if (1) DO50( test_vcvtm_u32_f64(TyDF) ); 466 467 if (1) DO50( test_vcvtn_u32_f32(TySF) ); 468 if (1) DO50( test_vcvta_u32_f32(TySF) ); 469 if (1) DO50( test_vcvtp_u32_f32(TySF) ); 470 if (1) DO50( test_vcvtm_u32_f32(TySF) ); 471 472 if (0) DO50( test_vcvtb_f64_f16(TyDF) ); 473 if (0) DO50( test_vcvtt_f64_f16(TyDF) ); 474 475 if (0) DO50( test_vcvtb_f16_f64(TyHF) ); 476 if (0) DO50( test_vcvtt_f16_f64(TyHF) ); 477 478 if (1) DO50( test_vrintzeq_f64_f64(TyDF) ); 479 if (1) DO50( test_vrintzne_f64_f64(TyDF) ); 480 if (1) DO50( test_vrintzal_f64_f64(TyDF) ); 481 482 if (1) DO50( test_vrintreq_f64_f64(TyDF) ); 483 if (1) DO50( test_vrintrne_f64_f64(TyDF) ); 484 if (1) DO50( test_vrintral_f64_f64(TyDF) ); 485 486 if (1) DO50( test_vrintxeq_f64_f64(TyDF) ); 487 if (1) DO50( test_vrintxne_f64_f64(TyDF) ); 488 if (1) DO50( test_vrintxal_f64_f64(TyDF) ); 489 490 if (1) DO50( test_vrintzeq_f32_f32(TySF) ); 491 if (1) DO50( test_vrintzne_f32_f32(TySF) ); 492 if (1) DO50( test_vrintzal_f32_f32(TySF) ); 493 494 if (1) DO50( test_vrintreq_f32_f32(TySF) ); 495 if (1) DO50( test_vrintrne_f32_f32(TySF) ); 496 if (1) DO50( test_vrintral_f32_f32(TySF) ); 497 498 if (1) DO50( test_vrintxeq_f32_f32(TySF) ); 499 if (1) DO50( test_vrintxne_f32_f32(TySF) ); 500 if (1) DO50( test_vrintxal_f32_f32(TySF) ); 501 502 if (1) DO50( test_vrintn_f64_f64(TyDF) ); 503 if (1) DO50( test_vrinta_f64_f64(TyDF) ); 504 if (1) DO50( test_vrintp_f64_f64(TyDF) ); 505 if (1) DO50( test_vrintm_f64_f64(TyDF) ); 506 507 if (1) DO50( test_vrintn_f32_f32(TySF) ); 508 if (1) DO50( test_vrinta_f32_f32(TySF) ); 509 if (1) DO50( test_vrintp_f32_f32(TySF) ); 510 if (1) DO50( test_vrintm_f32_f32(TySF) ); 511 512 if (1) DO50( test_vmaxnm_f32_vec64(TySF) ); 513 if (1) DO50( test_vmaxnm_f32_vec128(TySF) ); 514 515 if (1) DO50( test_vminnm_f32_vec64(TySF) ); 516 if (1) DO50( test_vminnm_f32_vec128(TySF) ); 517 518 if (1) DO50( test_vcvtn_s32_f32_vec64(TySF) ); 519 if (1) DO50( test_vcvta_s32_f32_vec64(TySF) ); 520 if (1) DO50( test_vcvtp_s32_f32_vec64(TySF) ); 521 if (1) DO50( test_vcvtm_s32_f32_vec64(TySF) ); 522 523 if (1) DO50( test_vcvtn_s32_f32_vec128(TySF) ); 524 if (1) DO50( test_vcvta_s32_f32_vec128(TySF) ); 525 if (1) DO50( test_vcvtp_s32_f32_vec128(TySF) ); 526 if (1) DO50( test_vcvtm_s32_f32_vec128(TySF) ); 527 528 if (1) DO50( test_vcvtn_u32_f32_vec64(TySF) ); 529 if (1) DO50( test_vcvta_u32_f32_vec64(TySF) ); 530 if (1) DO50( test_vcvtp_u32_f32_vec64(TySF) ); 531 if (1) DO50( test_vcvtm_u32_f32_vec64(TySF) ); 532 533 if (1) DO50( test_vcvtn_u32_f32_vec128(TySF) ); 534 if (1) DO50( test_vcvta_u32_f32_vec128(TySF) ); 535 if (1) DO50( test_vcvtp_u32_f32_vec128(TySF) ); 536 if (1) DO50( test_vcvtm_u32_f32_vec128(TySF) ); 537 538 if (1) DO50( test_vrintn_f32_f32_vec64(TySF) ); 539 if (1) DO50( test_vrinta_f32_f32_vec64(TySF) ); 540 if (1) DO50( test_vrintp_f32_f32_vec64(TySF) ); 541 if (1) DO50( test_vrintm_f32_f32_vec64(TySF) ); 542 if (1) DO50( test_vrintz_f32_f32_vec64(TySF) ); 543 if (1) DO50( test_vrintx_f32_f32_vec64(TySF) ); 544 545 if (1) DO50( test_vrintn_f32_f32_vec128(TySF) ); 546 if (1) DO50( test_vrinta_f32_f32_vec128(TySF) ); 547 if (1) DO50( test_vrintp_f32_f32_vec128(TySF) ); 548 if (1) DO50( test_vrintm_f32_f32_vec128(TySF) ); 549 if (1) DO50( test_vrintz_f32_f32_vec128(TySF) ); 550 if (1) DO50( test_vrintx_f32_f32_vec128(TySF) ); 551 552 return 0; 553 } 554