1 /* 2 * Copyright(c) 2022 Qualcomm Innovation Center, Inc. All Rights Reserved. 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License as published by 6 * the Free Software Foundation; either version 2 of the License, or 7 * (at your option) any later version. 8 * 9 * This program is distributed in the hope that it will be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, see <http://www.gnu.org/licenses/>. 16 */ 17 18 /* 19 * Test instructions that might set bits in user status register (USR) 20 */ 21 22 #include <stdio.h> 23 #include <stdint.h> 24 25 int err; 26 27 static void __check(int line, uint32_t val, uint32_t expect) 28 { 29 if (val != expect) { 30 printf("ERROR at line %d: %d != %d\n", line, val, expect); 31 err++; 32 } 33 } 34 35 #define check(RES, EXP) __check(__LINE__, RES, EXP) 36 37 static void __check32(int line, uint32_t val, uint32_t expect) 38 { 39 if (val != expect) { 40 printf("ERROR at line %d: 0x%08x != 0x%08x\n", line, val, expect); 41 err++; 42 } 43 } 44 45 #define check32(RES, EXP) __check32(__LINE__, RES, EXP) 46 47 static void __check64(int line, uint64_t val, uint64_t expect) 48 { 49 if (val != expect) { 50 printf("ERROR at line %d: 0x%016llx != 0x%016llx\n", line, val, expect); 51 err++; 52 } 53 } 54 55 #define check64(RES, EXP) __check64(__LINE__, RES, EXP) 56 57 /* 58 * Some of the instructions tested are only available on certain versions 59 * of the Hexagon core 60 */ 61 #define CORE_HAS_AUDIO (__HEXAGON_ARCH__ >= 67 && defined(__HEXAGON_AUDIO__)) 62 #define CORE_IS_V67 (__HEXAGON_ARCH__ >= 67) 63 64 /* Define the bits in Hexagon USR register */ 65 #define USR_OVF_BIT 0 /* Sticky saturation overflow */ 66 #define USR_FPINVF_BIT 1 /* IEEE FP invalid sticky flag */ 67 #define USR_FPDBZF_BIT 2 /* IEEE FP divide-by-zero sticky flag */ 68 #define USR_FPOVFF_BIT 3 /* IEEE FP overflow sticky flag */ 69 #define USR_FPUNFF_BIT 4 /* IEEE FP underflow sticky flag */ 70 #define USR_FPINPF_BIT 5 /* IEEE FP inexact sticky flag */ 71 72 /* Corresponding values in USR */ 73 #define USR_CLEAR 0 74 #define USR_OVF (1 << USR_OVF_BIT) 75 #define USR_FPINVF (1 << USR_FPINVF_BIT) 76 #define USR_FPDBZF (1 << USR_FPDBZF_BIT) 77 #define USR_FPOVFF (1 << USR_FPOVFF_BIT) 78 #define USR_FPUNFF (1 << USR_FPUNFF_BIT) 79 #define USR_FPINPF (1 << USR_FPINPF_BIT) 80 81 /* Some useful floating point values */ 82 const uint32_t SF_INF = 0x7f800000; 83 const uint32_t SF_QNaN = 0x7fc00000; 84 const uint32_t SF_SNaN = 0x7fb00000; 85 const uint32_t SF_QNaN_neg = 0xffc00000; 86 const uint32_t SF_SNaN_neg = 0xffb00000; 87 const uint32_t SF_HEX_NaN = 0xffffffff; 88 const uint32_t SF_zero = 0x00000000; 89 const uint32_t SF_zero_neg = 0x80000000; 90 const uint32_t SF_one = 0x3f800000; 91 const uint32_t SF_one_recip = 0x3f7f0001; /* 0.9960... */ 92 const uint32_t SF_one_invsqrta = 0x3f7f0000; /* 0.99609375 */ 93 const uint32_t SF_two = 0x40000000; 94 const uint32_t SF_four = 0x40800000; 95 const uint32_t SF_small_neg = 0xab98fba8; 96 const uint32_t SF_large_pos = 0x5afa572e; 97 98 const uint64_t DF_QNaN = 0x7ff8000000000000ULL; 99 const uint64_t DF_SNaN = 0x7ff7000000000000ULL; 100 const uint64_t DF_QNaN_neg = 0xfff8000000000000ULL; 101 const uint64_t DF_SNaN_neg = 0xfff7000000000000ULL; 102 const uint64_t DF_HEX_NaN = 0xffffffffffffffffULL; 103 const uint64_t DF_zero = 0x0000000000000000ULL; 104 const uint64_t DF_zero_neg = 0x8000000000000000ULL; 105 const uint64_t DF_any = 0x3f80000000000000ULL; 106 const uint64_t DF_one = 0x3ff0000000000000ULL; 107 const uint64_t DF_one_hh = 0x3ff001ff80000000ULL; /* 1.00048... */ 108 const uint64_t DF_small_neg = 0xbd731f7500000000ULL; 109 const uint64_t DF_large_pos = 0x7f80000000000001ULL; 110 111 /* 112 * Templates for functions to execute an instruction 113 * 114 * The templates vary by the number of arguments and the types of the args 115 * and result. We use one letter in the macro name for the result and each 116 * argument: 117 * x unknown (specified in a subsequent template) or don't care 118 * R register (32 bits) 119 * P pair (64 bits) 120 * p predicate 121 * I immediate 122 * Xx read/write 123 */ 124 125 /* Clear bits 0-5 in USR */ 126 #define CLEAR_USRBITS \ 127 "r2 = usr\n\t" \ 128 "r2 = and(r2, #0xffffffc0)\n\t" \ 129 "usr = r2\n\t" 130 131 /* Template for instructions with one register operand */ 132 #define FUNC_x_OP_x(RESTYPE, SRCTYPE, NAME, INSN) \ 133 static RESTYPE NAME(SRCTYPE src, uint32_t *usr_result) \ 134 { \ 135 RESTYPE result; \ 136 uint32_t usr; \ 137 asm(CLEAR_USRBITS \ 138 INSN "\n\t" \ 139 "%1 = usr\n\t" \ 140 : "=r"(result), "=r"(usr) \ 141 : "r"(src) \ 142 : "r2", "usr"); \ 143 *usr_result = usr & 0x3f; \ 144 return result; \ 145 } 146 147 #define FUNC_R_OP_R(NAME, INSN) \ 148 FUNC_x_OP_x(uint32_t, uint32_t, NAME, INSN) 149 150 #define FUNC_R_OP_P(NAME, INSN) \ 151 FUNC_x_OP_x(uint32_t, uint64_t, NAME, INSN) 152 153 #define FUNC_P_OP_P(NAME, INSN) \ 154 FUNC_x_OP_x(uint64_t, uint64_t, NAME, INSN) 155 156 #define FUNC_P_OP_R(NAME, INSN) \ 157 FUNC_x_OP_x(uint64_t, uint32_t, NAME, INSN) 158 159 /* 160 * Template for instructions with a register and predicate result 161 * and one register operand 162 */ 163 #define FUNC_xp_OP_x(RESTYPE, SRCTYPE, NAME, INSN) \ 164 static RESTYPE NAME(SRCTYPE src, uint8_t *pred_result, uint32_t *usr_result) \ 165 { \ 166 RESTYPE result; \ 167 uint8_t pred; \ 168 uint32_t usr; \ 169 asm(CLEAR_USRBITS \ 170 INSN "\n\t" \ 171 "%1 = p2\n\t" \ 172 "%2 = usr\n\t" \ 173 : "=r"(result), "=r"(pred), "=r"(usr) \ 174 : "r"(src) \ 175 : "r2", "p2", "usr"); \ 176 *pred_result = pred; \ 177 *usr_result = usr & 0x3f; \ 178 return result; \ 179 } 180 181 #define FUNC_Rp_OP_R(NAME, INSN) \ 182 FUNC_xp_OP_x(uint32_t, uint32_t, NAME, INSN) 183 184 /* Template for instructions with two register operands */ 185 #define FUNC_x_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \ 186 static RESTYPE NAME(SRC1TYPE src1, SRC2TYPE src2, uint32_t *usr_result) \ 187 { \ 188 RESTYPE result; \ 189 uint32_t usr; \ 190 asm(CLEAR_USRBITS \ 191 INSN "\n\t" \ 192 "%1 = usr\n\t" \ 193 : "=r"(result), "=r"(usr) \ 194 : "r"(src1), "r"(src2) \ 195 : "r2", "usr"); \ 196 *usr_result = usr & 0x3f; \ 197 return result; \ 198 } 199 200 #define FUNC_P_OP_PP(NAME, INSN) \ 201 FUNC_x_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN) 202 203 #define FUNC_R_OP_PP(NAME, INSN) \ 204 FUNC_x_OP_xx(uint32_t, uint64_t, uint64_t, NAME, INSN) 205 206 #define FUNC_P_OP_RR(NAME, INSN) \ 207 FUNC_x_OP_xx(uint64_t, uint32_t, uint32_t, NAME, INSN) 208 209 #define FUNC_R_OP_RR(NAME, INSN) \ 210 FUNC_x_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN) 211 212 #define FUNC_R_OP_PR(NAME, INSN) \ 213 FUNC_x_OP_xx(uint32_t, uint64_t, uint32_t, NAME, INSN) 214 215 #define FUNC_P_OP_PR(NAME, INSN) \ 216 FUNC_x_OP_xx(uint64_t, uint64_t, uint32_t, NAME, INSN) 217 218 /* 219 * Template for instructions with a register and predicate result 220 * and two register operands 221 */ 222 #define FUNC_xp_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \ 223 static RESTYPE NAME(SRC1TYPE src1, SRC2TYPE src2, \ 224 uint8_t *pred_result, uint32_t *usr_result) \ 225 { \ 226 RESTYPE result; \ 227 uint8_t pred; \ 228 uint32_t usr; \ 229 asm(CLEAR_USRBITS \ 230 INSN "\n\t" \ 231 "%1 = p2\n\t" \ 232 "%2 = usr\n\t" \ 233 : "=r"(result), "=r"(pred), "=r"(usr) \ 234 : "r"(src1), "r"(src2) \ 235 : "r2", "p2", "usr"); \ 236 *pred_result = pred; \ 237 *usr_result = usr & 0x3f; \ 238 return result; \ 239 } 240 241 #define FUNC_Rp_OP_RR(NAME, INSN) \ 242 FUNC_xp_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN) 243 244 /* Template for instructions with one register and one immediate */ 245 #define FUNC_x_OP_xI(RESTYPE, SRC1TYPE, NAME, INSN) \ 246 static RESTYPE NAME(SRC1TYPE src1, int32_t src2, uint32_t *usr_result) \ 247 { \ 248 RESTYPE result; \ 249 uint32_t usr; \ 250 asm(CLEAR_USRBITS \ 251 INSN "\n\t" \ 252 "%1 = usr\n\t" \ 253 : "=r"(result), "=r"(usr) \ 254 : "r"(src1), "i"(src2) \ 255 : "r2", "usr"); \ 256 *usr_result = usr & 0x3f; \ 257 return result; \ 258 } 259 260 #define FUNC_R_OP_RI(NAME, INSN) \ 261 FUNC_x_OP_xI(uint32_t, uint32_t, NAME, INSN) 262 263 #define FUNC_R_OP_PI(NAME, INSN) \ 264 FUNC_x_OP_xI(uint32_t, uint64_t, NAME, INSN) 265 266 /* 267 * Template for instructions with a read/write result 268 * and two register operands 269 */ 270 #define FUNC_Xx_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \ 271 static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, \ 272 uint32_t *usr_result) \ 273 { \ 274 uint32_t usr; \ 275 asm(CLEAR_USRBITS \ 276 INSN "\n\t" \ 277 "%1 = usr\n\t" \ 278 : "+r"(result), "=r"(usr) \ 279 : "r"(src1), "r"(src2) \ 280 : "r2", "usr"); \ 281 *usr_result = usr & 0x3f; \ 282 return result; \ 283 } 284 285 #define FUNC_XR_OP_RR(NAME, INSN) \ 286 FUNC_Xx_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN) 287 288 #define FUNC_XP_OP_PP(NAME, INSN) \ 289 FUNC_Xx_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN) 290 291 #define FUNC_XP_OP_RR(NAME, INSN) \ 292 FUNC_Xx_OP_xx(uint64_t, uint32_t, uint32_t, NAME, INSN) 293 294 /* 295 * Template for instructions with a read/write result 296 * and two register operands 297 */ 298 #define FUNC_Xxp_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \ 299 static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, \ 300 uint8_t *pred_result, uint32_t *usr_result) \ 301 { \ 302 uint32_t usr; \ 303 uint8_t pred; \ 304 asm(CLEAR_USRBITS \ 305 INSN "\n\t" \ 306 "%1 = p2\n\t" \ 307 "%2 = usr\n\t" \ 308 : "+r"(result), "=r"(pred), "=r"(usr) \ 309 : "r"(src1), "r"(src2) \ 310 : "r2", "usr"); \ 311 *pred_result = pred; \ 312 *usr_result = usr & 0x3f; \ 313 return result; \ 314 } 315 316 #define FUNC_XPp_OP_PP(NAME, INSN) \ 317 FUNC_Xxp_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN) 318 319 /* 320 * Template for instructions with a read/write result and 321 * two register and one predicate operands 322 */ 323 #define FUNC_Xx_OP_xxp(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \ 324 static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, uint8_t pred,\ 325 uint32_t *usr_result) \ 326 { \ 327 uint32_t usr; \ 328 asm(CLEAR_USRBITS \ 329 "p2 = %4\n\t" \ 330 INSN "\n\t" \ 331 "%1 = usr\n\t" \ 332 : "+r"(result), "=r"(usr) \ 333 : "r"(src1), "r"(src2), "r"(pred) \ 334 : "r2", "p2", "usr"); \ 335 *usr_result = usr & 0x3f; \ 336 return result; \ 337 } 338 339 #define FUNC_XR_OP_RRp(NAME, INSN) \ 340 FUNC_Xx_OP_xxp(uint32_t, uint32_t, uint32_t, NAME, INSN) 341 342 /* Template for compare instructions with two register operands */ 343 #define FUNC_CMP_xx(SRC1TYPE, SRC2TYPE, NAME, INSN) \ 344 static uint32_t NAME(SRC1TYPE src1, SRC2TYPE src2, uint32_t *usr_result) \ 345 { \ 346 uint32_t result; \ 347 uint32_t usr; \ 348 asm(CLEAR_USRBITS \ 349 INSN "\n\t" \ 350 "%0 = p1\n\t" \ 351 "%1 = usr\n\t" \ 352 : "=r"(result), "=r"(usr) \ 353 : "r"(src1), "r"(src2) \ 354 : "p1", "r2", "usr"); \ 355 *usr_result = usr & 0x3f; \ 356 return result; \ 357 } 358 359 #define FUNC_CMP_RR(NAME, INSN) \ 360 FUNC_CMP_xx(uint32_t, uint32_t, NAME, INSN) 361 362 #define FUNC_CMP_PP(NAME, INSN) \ 363 FUNC_CMP_xx(uint64_t, uint64_t, NAME, INSN) 364 365 /* 366 * Function declarations using the templates 367 */ 368 FUNC_R_OP_R(satub, "%0 = satub(%2)") 369 FUNC_P_OP_PP(vaddubs, "%0 = vaddub(%2, %3):sat") 370 FUNC_P_OP_PP(vadduhs, "%0 = vadduh(%2, %3):sat") 371 FUNC_P_OP_PP(vsububs, "%0 = vsubub(%2, %3):sat") 372 FUNC_P_OP_PP(vsubuhs, "%0 = vsubuh(%2, %3):sat") 373 374 /* Add vector of half integers with saturation and pack to unsigned bytes */ 375 FUNC_R_OP_PP(vaddhubs, "%0 = vaddhub(%2, %3):sat") 376 377 /* Vector saturate half to unsigned byte */ 378 FUNC_R_OP_P(vsathub, "%0 = vsathub(%2)") 379 380 /* Similar to above but takes a 32-bit argument */ 381 FUNC_R_OP_R(svsathub, "%0 = vsathub(%2)") 382 383 /* Vector saturate word to unsigned half */ 384 FUNC_P_OP_P(vsatwuh_nopack, "%0 = vsatwuh(%2)") 385 386 /* Similar to above but returns a 32-bit result */ 387 FUNC_R_OP_P(vsatwuh, "%0 = vsatwuh(%2)") 388 389 /* Vector arithmetic shift halfwords with saturate and pack */ 390 FUNC_R_OP_PI(asrhub_sat, "%0 = vasrhub(%2, #%3):sat") 391 392 /* Vector arithmetic shift halfwords with round, saturate and pack */ 393 FUNC_R_OP_PI(asrhub_rnd_sat, "%0 = vasrhub(%2, #%3):raw") 394 395 FUNC_R_OP_RR(addsat, "%0 = add(%2, %3):sat") 396 /* Similar to above but with register pairs */ 397 FUNC_P_OP_PP(addpsat, "%0 = add(%2, %3):sat") 398 399 FUNC_XR_OP_RR(mpy_acc_sat_hh_s0, "%0 += mpy(%2.H, %3.H):sat") 400 FUNC_R_OP_RR(mpy_sat_hh_s1, "%0 = mpy(%2.H, %3.H):<<1:sat") 401 FUNC_R_OP_RR(mpy_sat_rnd_hh_s1, "%0 = mpy(%2.H, %3.H):<<1:rnd:sat") 402 FUNC_R_OP_RR(mpy_up_s1_sat, "%0 = mpy(%2, %3):<<1:sat") 403 FUNC_P_OP_RR(vmpy2s_s1, "%0 = vmpyh(%2, %3):<<1:sat") 404 FUNC_P_OP_RR(vmpy2su_s1, "%0 = vmpyhsu(%2, %3):<<1:sat") 405 FUNC_R_OP_RR(vmpy2s_s1pack, "%0 = vmpyh(%2, %3):<<1:rnd:sat") 406 FUNC_P_OP_PP(vmpy2es_s1, "%0 = vmpyeh(%2, %3):<<1:sat") 407 FUNC_R_OP_PP(vdmpyrs_s1, "%0 = vdmpy(%2, %3):<<1:rnd:sat") 408 FUNC_XP_OP_PP(vdmacs_s0, "%0 += vdmpy(%2, %3):sat") 409 FUNC_R_OP_RR(cmpyrs_s0, "%0 = cmpy(%2, %3):rnd:sat") 410 FUNC_XP_OP_RR(cmacs_s0, "%0 += cmpy(%2, %3):sat") 411 FUNC_XP_OP_RR(cnacs_s0, "%0 -= cmpy(%2, %3):sat") 412 FUNC_P_OP_PP(vrcmpys_s1_h, "%0 = vrcmpys(%2, %3):<<1:sat:raw:hi") 413 FUNC_XP_OP_PP(mmacls_s0, "%0 += vmpyweh(%2, %3):sat") 414 FUNC_R_OP_RR(hmmpyl_rs1, "%0 = mpy(%2, %3.L):<<1:rnd:sat") 415 FUNC_XP_OP_PP(mmaculs_s0, "%0 += vmpyweuh(%2, %3):sat") 416 FUNC_R_OP_PR(cmpyi_wh, "%0 = cmpyiwh(%2, %3):<<1:rnd:sat") 417 FUNC_P_OP_PP(vcmpy_s0_sat_i, "%0 = vcmpyi(%2, %3):sat") 418 FUNC_P_OP_PR(vcrotate, "%0 = vcrotate(%2, %3)") 419 FUNC_P_OP_PR(vcnegh, "%0 = vcnegh(%2, %3)") 420 421 #if CORE_HAS_AUDIO 422 FUNC_R_OP_PP(wcmpyrw, "%0 = cmpyrw(%2, %3):<<1:sat") 423 #endif 424 425 FUNC_R_OP_RR(addh_l16_sat_ll, "%0 = add(%2.L, %3.L):sat") 426 FUNC_P_OP_P(vconj, "%0 = vconj(%2):sat") 427 FUNC_P_OP_PP(vxaddsubw, "%0 = vxaddsubw(%2, %3):sat") 428 FUNC_P_OP_P(vabshsat, "%0 = vabsh(%2):sat") 429 FUNC_P_OP_PP(vnavgwr, "%0 = vnavgw(%2, %3):rnd:sat") 430 FUNC_R_OP_RI(round_ri_sat, "%0 = round(%2, #%3):sat") 431 FUNC_R_OP_RR(asr_r_r_sat, "%0 = asr(%2, %3):sat") 432 433 FUNC_XPp_OP_PP(ACS, "%0, p2 = vacsh(%3, %4)") 434 435 /* Floating point */ 436 FUNC_R_OP_RR(sfmin, "%0 = sfmin(%2, %3)") 437 FUNC_R_OP_RR(sfmax, "%0 = sfmax(%2, %3)") 438 FUNC_R_OP_RR(sfadd, "%0 = sfadd(%2, %3)") 439 FUNC_R_OP_RR(sfsub, "%0 = sfsub(%2, %3)") 440 FUNC_R_OP_RR(sfmpy, "%0 = sfmpy(%2, %3)") 441 FUNC_XR_OP_RR(sffma, "%0 += sfmpy(%2, %3)") 442 FUNC_XR_OP_RR(sffms, "%0 -= sfmpy(%2, %3)") 443 FUNC_CMP_RR(sfcmpuo, "p1 = sfcmp.uo(%2, %3)") 444 FUNC_CMP_RR(sfcmpeq, "p1 = sfcmp.eq(%2, %3)") 445 FUNC_CMP_RR(sfcmpgt, "p1 = sfcmp.gt(%2, %3)") 446 FUNC_CMP_RR(sfcmpge, "p1 = sfcmp.ge(%2, %3)") 447 448 FUNC_P_OP_PP(dfadd, "%0 = dfadd(%2, %3)") 449 FUNC_P_OP_PP(dfsub, "%0 = dfsub(%2, %3)") 450 451 #if CORE_IS_V67 452 FUNC_P_OP_PP(dfmin, "%0 = dfmin(%2, %3)") 453 FUNC_P_OP_PP(dfmax, "%0 = dfmax(%2, %3)") 454 FUNC_XP_OP_PP(dfmpyhh, "%0 += dfmpyhh(%2, %3)") 455 #endif 456 457 FUNC_CMP_PP(dfcmpuo, "p1 = dfcmp.uo(%2, %3)") 458 FUNC_CMP_PP(dfcmpeq, "p1 = dfcmp.eq(%2, %3)") 459 FUNC_CMP_PP(dfcmpgt, "p1 = dfcmp.gt(%2, %3)") 460 FUNC_CMP_PP(dfcmpge, "p1 = dfcmp.ge(%2, %3)") 461 462 /* Conversions from sf */ 463 FUNC_P_OP_R(conv_sf2df, "%0 = convert_sf2df(%2)") 464 FUNC_R_OP_R(conv_sf2uw, "%0 = convert_sf2uw(%2)") 465 FUNC_R_OP_R(conv_sf2w, "%0 = convert_sf2w(%2)") 466 FUNC_P_OP_R(conv_sf2ud, "%0 = convert_sf2ud(%2)") 467 FUNC_P_OP_R(conv_sf2d, "%0 = convert_sf2d(%2)") 468 FUNC_R_OP_R(conv_sf2uw_chop, "%0 = convert_sf2uw(%2):chop") 469 FUNC_R_OP_R(conv_sf2w_chop, "%0 = convert_sf2w(%2):chop") 470 FUNC_P_OP_R(conv_sf2ud_chop, "%0 = convert_sf2ud(%2):chop") 471 FUNC_P_OP_R(conv_sf2d_chop, "%0 = convert_sf2d(%2):chop") 472 473 /* Conversions from df */ 474 FUNC_R_OP_P(conv_df2sf, "%0 = convert_df2sf(%2)") 475 FUNC_R_OP_P(conv_df2uw, "%0 = convert_df2uw(%2)") 476 FUNC_R_OP_P(conv_df2w, "%0 = convert_df2w(%2)") 477 FUNC_P_OP_P(conv_df2ud, "%0 = convert_df2ud(%2)") 478 FUNC_P_OP_P(conv_df2d, "%0 = convert_df2d(%2)") 479 FUNC_R_OP_P(conv_df2uw_chop, "%0 = convert_df2uw(%2):chop") 480 FUNC_R_OP_P(conv_df2w_chop, "%0 = convert_df2w(%2):chop") 481 FUNC_P_OP_P(conv_df2ud_chop, "%0 = convert_df2ud(%2):chop") 482 FUNC_P_OP_P(conv_df2d_chop, "%0 = convert_df2d(%2):chop") 483 484 /* Integer to float conversions */ 485 FUNC_R_OP_R(conv_uw2sf, "%0 = convert_uw2sf(%2)") 486 FUNC_R_OP_R(conv_w2sf, "%0 = convert_w2sf(%2)") 487 FUNC_R_OP_P(conv_ud2sf, "%0 = convert_ud2sf(%2)") 488 FUNC_R_OP_P(conv_d2sf, "%0 = convert_d2sf(%2)") 489 490 /* Special purpose floating point instructions */ 491 FUNC_XR_OP_RRp(sffma_sc, "%0 += sfmpy(%2, %3, p2):scale") 492 FUNC_Rp_OP_RR(sfrecipa, "%0, p2 = sfrecipa(%3, %4)") 493 FUNC_R_OP_RR(sffixupn, "%0 = sffixupn(%2, %3)") 494 FUNC_R_OP_RR(sffixupd, "%0 = sffixupd(%2, %3)") 495 FUNC_R_OP_R(sffixupr, "%0 = sffixupr(%2)") 496 FUNC_Rp_OP_R(sfinvsqrta, "%0, p2 = sfinvsqrta(%3)") 497 498 /* 499 * Templates for test cases 500 * 501 * Same naming convention as the function templates 502 */ 503 #define TEST_x_OP_x(RESTYPE, CHECKFN, SRCTYPE, FUNC, SRC, RES, USR_RES) \ 504 do { \ 505 RESTYPE result; \ 506 SRCTYPE src = SRC; \ 507 uint32_t usr_result; \ 508 result = FUNC(src, &usr_result); \ 509 CHECKFN(result, RES); \ 510 check(usr_result, USR_RES); \ 511 } while (0) 512 513 #define TEST_R_OP_R(FUNC, SRC, RES, USR_RES) \ 514 TEST_x_OP_x(uint32_t, check32, uint32_t, FUNC, SRC, RES, USR_RES) 515 516 #define TEST_R_OP_P(FUNC, SRC, RES, USR_RES) \ 517 TEST_x_OP_x(uint32_t, check32, uint64_t, FUNC, SRC, RES, USR_RES) 518 519 #define TEST_P_OP_P(FUNC, SRC, RES, USR_RES) \ 520 TEST_x_OP_x(uint64_t, check64, uint64_t, FUNC, SRC, RES, USR_RES) 521 522 #define TEST_P_OP_R(FUNC, SRC, RES, USR_RES) \ 523 TEST_x_OP_x(uint64_t, check64, uint32_t, FUNC, SRC, RES, USR_RES) 524 525 #define TEST_xp_OP_x(RESTYPE, CHECKFN, SRCTYPE, FUNC, SRC, \ 526 RES, PRED_RES, USR_RES) \ 527 do { \ 528 RESTYPE result; \ 529 SRCTYPE src = SRC; \ 530 uint8_t pred_result; \ 531 uint32_t usr_result; \ 532 result = FUNC(src, &pred_result, &usr_result); \ 533 CHECKFN(result, RES); \ 534 check(pred_result, PRED_RES); \ 535 check(usr_result, USR_RES); \ 536 } while (0) 537 538 #define TEST_Rp_OP_R(FUNC, SRC, RES, PRED_RES, USR_RES) \ 539 TEST_xp_OP_x(uint32_t, check32, uint32_t, FUNC, SRC, RES, PRED_RES, USR_RES) 540 541 #define TEST_x_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \ 542 FUNC, SRC1, SRC2, RES, USR_RES) \ 543 do { \ 544 RESTYPE result; \ 545 SRC1TYPE src1 = SRC1; \ 546 SRC2TYPE src2 = SRC2; \ 547 uint32_t usr_result; \ 548 result = FUNC(src1, src2, &usr_result); \ 549 CHECKFN(result, RES); \ 550 check(usr_result, USR_RES); \ 551 } while (0) 552 553 #define TEST_P_OP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \ 554 TEST_x_OP_xx(uint64_t, check64, uint64_t, uint64_t, \ 555 FUNC, SRC1, SRC2, RES, USR_RES) 556 557 #define TEST_R_OP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \ 558 TEST_x_OP_xx(uint32_t, check32, uint64_t, uint64_t, \ 559 FUNC, SRC1, SRC2, RES, USR_RES) 560 561 #define TEST_P_OP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \ 562 TEST_x_OP_xx(uint64_t, check64, uint32_t, uint32_t, \ 563 FUNC, SRC1, SRC2, RES, USR_RES) 564 565 #define TEST_R_OP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \ 566 TEST_x_OP_xx(uint32_t, check32, uint32_t, uint32_t, \ 567 FUNC, SRC1, SRC2, RES, USR_RES) 568 569 #define TEST_R_OP_PR(FUNC, SRC1, SRC2, RES, USR_RES) \ 570 TEST_x_OP_xx(uint32_t, check32, uint64_t, uint32_t, \ 571 FUNC, SRC1, SRC2, RES, USR_RES) 572 573 #define TEST_P_OP_PR(FUNC, SRC1, SRC2, RES, USR_RES) \ 574 TEST_x_OP_xx(uint64_t, check64, uint64_t, uint32_t, \ 575 FUNC, SRC1, SRC2, RES, USR_RES) 576 577 #define TEST_xp_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, FUNC, SRC1, SRC2, \ 578 RES, PRED_RES, USR_RES) \ 579 do { \ 580 RESTYPE result; \ 581 SRC1TYPE src1 = SRC1; \ 582 SRC2TYPE src2 = SRC2; \ 583 uint8_t pred_result; \ 584 uint32_t usr_result; \ 585 result = FUNC(src1, src2, &pred_result, &usr_result); \ 586 CHECKFN(result, RES); \ 587 check(pred_result, PRED_RES); \ 588 check(usr_result, USR_RES); \ 589 } while (0) 590 591 #define TEST_Rp_OP_RR(FUNC, SRC1, SRC2, RES, PRED_RES, USR_RES) \ 592 TEST_xp_OP_xx(uint32_t, check32, uint32_t, uint32_t, FUNC, SRC1, SRC2, \ 593 RES, PRED_RES, USR_RES) 594 595 #define TEST_x_OP_xI(RESTYPE, CHECKFN, SRC1TYPE, \ 596 FUNC, SRC1, SRC2, RES, USR_RES) \ 597 do { \ 598 RESTYPE result; \ 599 SRC1TYPE src1 = SRC1; \ 600 uint32_t src2 = SRC2; \ 601 uint32_t usr_result; \ 602 result = FUNC(src1, src2, &usr_result); \ 603 CHECKFN(result, RES); \ 604 check(usr_result, USR_RES); \ 605 } while (0) 606 607 #define TEST_R_OP_RI(FUNC, SRC1, SRC2, RES, USR_RES) \ 608 TEST_x_OP_xI(uint32_t, check32, uint32_t, \ 609 FUNC, SRC1, SRC2, RES, USR_RES) 610 611 #define TEST_R_OP_PI(FUNC, SRC1, SRC2, RES, USR_RES) \ 612 TEST_x_OP_xI(uint32_t, check64, uint64_t, \ 613 FUNC, SRC1, SRC2, RES, USR_RES) 614 615 #define TEST_Xx_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \ 616 FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \ 617 do { \ 618 RESTYPE result = RESIN; \ 619 SRC1TYPE src1 = SRC1; \ 620 SRC2TYPE src2 = SRC2; \ 621 uint32_t usr_result; \ 622 result = FUNC(result, src1, src2, &usr_result); \ 623 CHECKFN(result, RES); \ 624 check(usr_result, USR_RES); \ 625 } while (0) 626 627 #define TEST_XR_OP_RR(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \ 628 TEST_Xx_OP_xx(uint32_t, check32, uint32_t, uint32_t, \ 629 FUNC, RESIN, SRC1, SRC2, RES, USR_RES) 630 631 #define TEST_XP_OP_PP(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \ 632 TEST_Xx_OP_xx(uint64_t, check64, uint64_t, uint64_t, \ 633 FUNC, RESIN, SRC1, SRC2, RES, USR_RES) 634 635 #define TEST_XP_OP_RR(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \ 636 TEST_Xx_OP_xx(uint64_t, check64, uint32_t, uint32_t, \ 637 FUNC, RESIN, SRC1, SRC2, RES, USR_RES) 638 639 #define TEST_Xxp_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \ 640 FUNC, RESIN, SRC1, SRC2, RES, PRED_RES, USR_RES) \ 641 do { \ 642 RESTYPE result = RESIN; \ 643 SRC1TYPE src1 = SRC1; \ 644 SRC2TYPE src2 = SRC2; \ 645 uint8_t pred_res; \ 646 uint32_t usr_result; \ 647 result = FUNC(result, src1, src2, &pred_res, &usr_result); \ 648 CHECKFN(result, RES); \ 649 check(usr_result, USR_RES); \ 650 } while (0) 651 652 #define TEST_XPp_OP_PP(FUNC, RESIN, SRC1, SRC2, RES, PRED_RES, USR_RES) \ 653 TEST_Xxp_OP_xx(uint64_t, check64, uint64_t, uint64_t, FUNC, RESIN, SRC1, SRC2, \ 654 RES, PRED_RES, USR_RES) 655 656 #define TEST_Xx_OP_xxp(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \ 657 FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES) \ 658 do { \ 659 RESTYPE result = RESIN; \ 660 SRC1TYPE src1 = SRC1; \ 661 SRC2TYPE src2 = SRC2; \ 662 uint8_t pred = PRED; \ 663 uint32_t usr_result; \ 664 result = FUNC(result, src1, src2, pred, &usr_result); \ 665 CHECKFN(result, RES); \ 666 check(usr_result, USR_RES); \ 667 } while (0) 668 669 #define TEST_XR_OP_RRp(FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES) \ 670 TEST_Xx_OP_xxp(uint32_t, check32, uint32_t, uint32_t, \ 671 FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES) 672 673 #define TEST_CMP_xx(SRC1TYPE, SRC2TYPE, \ 674 FUNC, SRC1, SRC2, RES, USR_RES) \ 675 do { \ 676 uint32_t result; \ 677 SRC1TYPE src1 = SRC1; \ 678 SRC2TYPE src2 = SRC2; \ 679 uint32_t usr_result; \ 680 result = FUNC(src1, src2, &usr_result); \ 681 check(result, RES); \ 682 check(usr_result, USR_RES); \ 683 } while (0) 684 685 #define TEST_CMP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \ 686 TEST_CMP_xx(uint32_t, uint32_t, FUNC, SRC1, SRC2, RES, USR_RES) 687 688 #define TEST_CMP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \ 689 TEST_CMP_xx(uint64_t, uint64_t, FUNC, SRC1, SRC2, RES, USR_RES) 690 691 int main() 692 { 693 TEST_R_OP_R(satub, 0, 0, USR_CLEAR); 694 TEST_R_OP_R(satub, 0xff, 0xff, USR_CLEAR); 695 TEST_R_OP_R(satub, 0xfff, 0xff, USR_OVF); 696 TEST_R_OP_R(satub, -1, 0, USR_OVF); 697 698 TEST_P_OP_PP(vaddubs, 0xfeLL, 0x01LL, 0xffLL, USR_CLEAR); 699 TEST_P_OP_PP(vaddubs, 0xffLL, 0xffLL, 0xffLL, USR_OVF); 700 701 TEST_P_OP_PP(vadduhs, 0xfffeLL, 0x1LL, 0xffffLL, USR_CLEAR); 702 TEST_P_OP_PP(vadduhs, 0xffffLL, 0x1LL, 0xffffLL, USR_OVF); 703 704 TEST_P_OP_PP(vsububs, 0x0807060504030201LL, 0x0101010101010101LL, 705 0x0706050403020100LL, USR_CLEAR); 706 TEST_P_OP_PP(vsububs, 0x0807060504030201LL, 0x0202020202020202LL, 707 0x0605040302010000LL, USR_OVF); 708 709 TEST_P_OP_PP(vsubuhs, 0x0004000300020001LL, 0x0001000100010001LL, 710 0x0003000200010000LL, USR_CLEAR); 711 TEST_P_OP_PP(vsubuhs, 0x0004000300020001LL, 0x0002000200020002LL, 712 0x0002000100000000LL, USR_OVF); 713 714 TEST_R_OP_PP(vaddhubs, 0x0004000300020001LL, 0x0001000100010001LL, 715 0x05040302, USR_CLEAR); 716 TEST_R_OP_PP(vaddhubs, 0x7fff000300020001LL, 0x0002000200020002LL, 717 0xff050403, USR_OVF); 718 719 TEST_R_OP_P(vsathub, 0x0001000300020001LL, 0x01030201, USR_CLEAR); 720 TEST_R_OP_P(vsathub, 0x010000700080ffffLL, 0xff708000, USR_OVF); 721 722 TEST_R_OP_P(vsatwuh, 0x0000ffff00000001LL, 0xffff0001, USR_CLEAR); 723 TEST_R_OP_P(vsatwuh, 0x800000000000ffffLL, 0x0000ffff, USR_OVF); 724 725 TEST_P_OP_P(vsatwuh_nopack, 0x0000ffff00000001LL, 0x0000ffff00000001LL, 726 USR_CLEAR); 727 TEST_P_OP_P(vsatwuh_nopack, 0x800000000000ffffLL, 0x000000000000ffffLL, 728 USR_OVF); 729 730 TEST_R_OP_R(svsathub, 0x00020001, 0x0201, USR_CLEAR); 731 TEST_R_OP_R(svsathub, 0x0080ffff, 0x8000, USR_OVF); 732 733 TEST_R_OP_PI(asrhub_sat, 0x004f003f002f001fLL, 3, 0x09070503, 734 USR_CLEAR); 735 TEST_R_OP_PI(asrhub_sat, 0x004fffff8fff001fLL, 3, 0x09000003, 736 USR_OVF); 737 738 TEST_R_OP_PI(asrhub_rnd_sat, 0x004f003f002f001fLL, 2, 0x0a080604, 739 USR_CLEAR); 740 TEST_R_OP_PI(asrhub_rnd_sat, 0x004fffff8fff001fLL, 2, 0x0a000004, 741 USR_OVF); 742 743 TEST_R_OP_RR(addsat, 1, 2, 3, 744 USR_CLEAR); 745 TEST_R_OP_RR(addsat, 0x7fffffff, 0x00000010, 0x7fffffff, 746 USR_OVF); 747 TEST_R_OP_RR(addsat, 0x80000000, 0x80000006, 0x80000000, 748 USR_OVF); 749 750 TEST_P_OP_PP(addpsat, 1LL, 2LL, 3LL, USR_CLEAR); 751 /* overflow to max positive */ 752 TEST_P_OP_PP(addpsat, 0x7ffffffffffffff0LL, 0x0000000000000010LL, 753 0x7fffffffffffffffLL, USR_OVF); 754 /* overflow to min negative */ 755 TEST_P_OP_PP(addpsat, 0x8000000000000003LL, 0x8000000000000006LL, 756 0x8000000000000000LL, USR_OVF); 757 758 TEST_XR_OP_RR(mpy_acc_sat_hh_s0, 0x7fffffff, 0xffff0000, 0x11110000, 759 0x7fffeeee, USR_CLEAR); 760 TEST_XR_OP_RR(mpy_acc_sat_hh_s0, 0x7fffffff, 0x7fff0000, 0x7fff0000, 761 0x7fffffff, USR_OVF); 762 763 TEST_R_OP_RR(mpy_sat_hh_s1, 0xffff0000, 0x11110000, 0xffffddde, 764 USR_CLEAR); 765 TEST_R_OP_RR(mpy_sat_hh_s1, 0x7fff0000, 0x7fff0000, 0x7ffe0002, 766 USR_CLEAR); 767 TEST_R_OP_RR(mpy_sat_hh_s1, 0x80000000, 0x80000000, 0x7fffffff, 768 USR_OVF); 769 770 TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0xffff0000, 0x11110000, 0x00005dde, 771 USR_CLEAR); 772 TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0x7fff0000, 0x7fff0000, 0x7ffe8002, 773 USR_CLEAR); 774 TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0x80000000, 0x80000000, 0x7fffffff, 775 USR_OVF); 776 777 TEST_R_OP_RR(mpy_up_s1_sat, 0xffff0000, 0x11110000, 0xffffddde, 778 USR_CLEAR); 779 TEST_R_OP_RR(mpy_up_s1_sat, 0x7fff0000, 0x7fff0000, 0x7ffe0002, 780 USR_CLEAR); 781 TEST_R_OP_RR(mpy_up_s1_sat, 0x80000000, 0x80000000, 0x7fffffff, 782 USR_OVF); 783 784 TEST_P_OP_RR(vmpy2s_s1, 0x7fff0000, 0x7fff0000, 0x7ffe000200000000LL, 785 USR_CLEAR); 786 TEST_P_OP_RR(vmpy2s_s1, 0x80000000, 0x80000000, 0x7fffffff00000000LL, 787 USR_OVF); 788 789 TEST_P_OP_RR(vmpy2su_s1, 0x7fff0000, 0x7fff0000, 0x7ffe000200000000LL, 790 USR_CLEAR); 791 TEST_P_OP_RR(vmpy2su_s1, 0xffffbd97, 0xffffffff, 0xfffe000280000000LL, 792 USR_OVF); 793 794 TEST_R_OP_RR(vmpy2s_s1pack, 0x7fff0000, 0x7fff0000, 0x7ffe0000, 795 USR_CLEAR); 796 TEST_R_OP_RR(vmpy2s_s1pack, 0x80008000, 0x80008000, 0x7fff7fff, 797 USR_OVF); 798 799 TEST_P_OP_PP(vmpy2es_s1, 0x7fff7fff7fff7fffLL, 0x1fff1fff1fff1fffLL, 800 0x1ffec0021ffec002LL, USR_CLEAR); 801 TEST_P_OP_PP(vmpy2es_s1, 0x8000800080008000LL, 0x8000800080008000LL, 802 0x7fffffff7fffffffLL, USR_OVF); 803 804 TEST_R_OP_PP(vdmpyrs_s1, 0x7fff7fff7fff7fffLL, 0x1fff1fff1fff1fffLL, 805 0x3ffe3ffe, USR_CLEAR); 806 TEST_R_OP_PP(vdmpyrs_s1, 0x8000800080008000LL, 0x8000800080008000LL, 807 0x7fff7fffLL, USR_OVF); 808 809 TEST_XP_OP_PP(vdmacs_s0, 0x0fffffffULL, 0x00ff00ff00ff00ffLL, 810 0x00ff00ff00ff00ffLL, 0x0001fc021001fc01LL, USR_CLEAR); 811 TEST_XP_OP_PP(vdmacs_s0, 0x01111111ULL, 0x8000800080001000LL, 812 0x8000800080008000LL, 0x7fffffff39111111LL, USR_OVF); 813 814 TEST_R_OP_RR(cmpyrs_s0, 0x7fff0000, 0x7fff0000, 0x0000c001, 815 USR_CLEAR); 816 TEST_R_OP_RR(cmpyrs_s0, 0x80008000, 0x80008000, 0x7fff0000, 817 USR_OVF); 818 819 TEST_XP_OP_RR(cmacs_s0, 0x0fffffff, 0x7fff0000, 0x7fff0000, 820 0x00000000d000fffeLL, USR_CLEAR); 821 TEST_XP_OP_RR(cmacs_s0, 0x0fff1111, 0x80008000, 0x80008000, 822 0x7fffffff0fff1111LL, USR_OVF); 823 824 TEST_XP_OP_RR(cnacs_s0, 0x000000108fffffffULL, 0x7fff0000, 0x7fff0000, 825 0x00000010cfff0000ULL, USR_CLEAR); 826 TEST_XP_OP_RR(cnacs_s0, 0x000000108ff1111fULL, 0x00002001, 0x00007ffd, 827 0x0000001080000000ULL, USR_OVF); 828 829 TEST_P_OP_PP(vrcmpys_s1_h, 0x00ff00ff00ff00ffLL, 0x00ff00ff00ff00ffLL, 830 0x0003f8040003f804LL, USR_CLEAR); 831 TEST_P_OP_PP(vrcmpys_s1_h, 0x8000800080008000LL, 0x8000800080008000LL, 832 0x7fffffff7fffffffLL, USR_OVF); 833 834 TEST_XP_OP_PP(mmacls_s0, 0x6fffffff, 0x00ff00ff00ff00ffLL, 835 0x00ff00ff00ff00ffLL, 0x0000fe017000fe00LL, USR_CLEAR); 836 TEST_XP_OP_PP(mmacls_s0, 0x6f1111ff, 0x8000800080008000LL, 837 0x1000100080008000LL, 0xf80008007fffffffLL, USR_OVF); 838 839 TEST_R_OP_RR(hmmpyl_rs1, 0x7fff0000, 0x7fff0001, 0x0000fffe, 840 USR_CLEAR); 841 TEST_R_OP_RR(hmmpyl_rs1, 0x80000000, 0x80008000, 0x7fffffff, 842 USR_OVF); 843 844 TEST_XP_OP_PP(mmaculs_s0, 0x000000007fffffffULL, 0xffff800080008000LL, 845 0xffff800080008000LL, 0xffffc00040003fffLL, USR_CLEAR); 846 TEST_XP_OP_PP(mmaculs_s0, 0x000011107fffffffULL, 0x00ff00ff00ff00ffLL, 847 0x00ff00ff001100ffLL, 0x00010f117fffffffLL, USR_OVF); 848 849 TEST_R_OP_PR(cmpyi_wh, 0x7fff000000000000LL, 0x7fff0001, 0x0000fffe, 850 USR_CLEAR); 851 TEST_R_OP_PR(cmpyi_wh, 0x8000000000000000LL, 0x80008000, 0x7fffffff, 852 USR_OVF); 853 854 TEST_P_OP_PP(vcmpy_s0_sat_i, 0x00ff00ff00ff00ffLL, 0x00ff00ff00ff00ffLL, 855 0x0001fc020001fc02LL, USR_CLEAR); 856 TEST_P_OP_PP(vcmpy_s0_sat_i, 0x8000800080008000LL, 0x8000800080008000LL, 857 0x7fffffff7fffffffLL, USR_OVF); 858 859 TEST_P_OP_PR(vcrotate, 0x8000000000000000LL, 0x00000002, 860 0x8000000000000000LL, USR_CLEAR); 861 TEST_P_OP_PR(vcrotate, 0x7fff80007fff8000LL, 0x00000001, 862 0x7fff80007fff7fffLL, USR_OVF); 863 864 TEST_P_OP_PR(vcnegh, 0x8000000000000000LL, 0x00000002, 865 0x8000000000000000LL, USR_CLEAR); 866 TEST_P_OP_PR(vcnegh, 0x7fff80007fff8000LL, 0x00000001, 867 0x7fff80007fff7fffLL, USR_OVF); 868 869 #if CORE_HAS_AUDIO 870 TEST_R_OP_PP(wcmpyrw, 0x8765432101234567LL, 0x00000002ffffffffLL, 871 0x00000001, USR_CLEAR); 872 TEST_R_OP_PP(wcmpyrw, 0x800000007fffffffLL, 0x000000ff7fffffffLL, 873 0x7fffffff, USR_OVF); 874 TEST_R_OP_PP(wcmpyrw, 0x7fffffff80000000LL, 0x7fffffff000000ffLL, 875 0x80000000, USR_OVF); 876 #else 877 printf("Audio instructions skipped\n"); 878 #endif 879 880 TEST_R_OP_RR(addh_l16_sat_ll, 0x0000ffff, 0x00000002, 0x00000001, 881 USR_CLEAR); 882 TEST_R_OP_RR(addh_l16_sat_ll, 0x00007fff, 0x00000005, 0x00007fff, 883 USR_OVF); 884 TEST_R_OP_RR(addh_l16_sat_ll, 0x00008000, 0x00008000, 0xffff8000, 885 USR_OVF); 886 887 TEST_P_OP_P(vconj, 0x0000ffff00000001LL, 0x0000ffff00000001LL, USR_CLEAR); 888 TEST_P_OP_P(vconj, 0x800000000000ffffLL, 0x7fff00000000ffffLL, USR_OVF); 889 890 TEST_P_OP_PP(vxaddsubw, 0x8765432101234567LL, 0x00000002ffffffffLL, 891 0x8765432201234569LL, USR_CLEAR); 892 TEST_P_OP_PP(vxaddsubw, 0x7fffffff7fffffffLL, 0xffffffffffffffffLL, 893 0x7fffffff7ffffffeLL, USR_OVF); 894 TEST_P_OP_PP(vxaddsubw, 0x800000000fffffffLL, 0x0000000a00000008LL, 895 0x8000000010000009LL, USR_OVF); 896 897 TEST_P_OP_P(vabshsat, 0x0001000afffff800LL, 0x0001000a00010800LL, 898 USR_CLEAR); 899 TEST_P_OP_P(vabshsat, 0x8000000b000c000aLL, 0x7fff000b000c000aLL, 900 USR_OVF); 901 902 TEST_P_OP_PP(vnavgwr, 0x8765432101234567LL, 0x00000002ffffffffLL, 903 0xc3b2a1900091a2b4LL, USR_CLEAR); 904 TEST_P_OP_PP(vnavgwr, 0x7fffffff8000000aLL, 0x80000000ffffffffLL, 905 0x7fffffffc0000006LL, USR_OVF); 906 907 TEST_R_OP_RI(round_ri_sat, 0x0000ffff, 2, 0x00004000, USR_CLEAR); 908 TEST_R_OP_RI(round_ri_sat, 0x7fffffff, 2, 0x1fffffff, USR_OVF); 909 910 TEST_R_OP_RR(asr_r_r_sat, 0x0000ffff, 0x00000002, 0x00003fff, 911 USR_CLEAR); 912 TEST_R_OP_RR(asr_r_r_sat, 0x00ffffff, 0xfffffff5, 0x7fffffff, 913 USR_OVF); 914 TEST_R_OP_RR(asr_r_r_sat, 0x80000000, 0xfffffff5, 0x80000000, 915 USR_OVF); 916 917 TEST_XPp_OP_PP(ACS, 0x0004000300020001ULL, 0x0001000200030004ULL, 918 0x0000000000000000ULL, 0x0004000300030004ULL, 0xf0, 919 USR_CLEAR); 920 TEST_XPp_OP_PP(ACS, 0x0004000300020001ULL, 0x0001000200030004ULL, 921 0x000affff000d0000ULL, 0x000e0003000f0004ULL, 0xcc, 922 USR_CLEAR); 923 TEST_XPp_OP_PP(ACS, 0x00047fff00020001ULL, 0x00017fff00030004ULL, 924 0x000a0fff000d0000ULL, 0x000e7fff000f0004ULL, 0xfc, 925 USR_OVF); 926 TEST_XPp_OP_PP(ACS, 0x00047fff00020001ULL, 0x00017fff00030004ULL, 927 0x000a0fff000d0000ULL, 0x000e7fff000f0004ULL, 0xf0, 928 USR_OVF); 929 930 /* Floating point */ 931 TEST_R_OP_RR(sfmin, SF_one, SF_small_neg, SF_small_neg, USR_CLEAR); 932 TEST_R_OP_RR(sfmin, SF_one, SF_SNaN, SF_one, USR_FPINVF); 933 TEST_R_OP_RR(sfmin, SF_SNaN, SF_one, SF_one, USR_FPINVF); 934 TEST_R_OP_RR(sfmin, SF_one, SF_QNaN, SF_one, USR_CLEAR); 935 TEST_R_OP_RR(sfmin, SF_QNaN, SF_one, SF_one, USR_CLEAR); 936 TEST_R_OP_RR(sfmin, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 937 TEST_R_OP_RR(sfmin, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 938 TEST_R_OP_RR(sfmin, SF_zero, SF_zero_neg, SF_zero_neg, USR_CLEAR); 939 TEST_R_OP_RR(sfmin, SF_zero_neg, SF_zero, SF_zero_neg, USR_CLEAR); 940 941 TEST_R_OP_RR(sfmax, SF_one, SF_small_neg, SF_one, USR_CLEAR); 942 TEST_R_OP_RR(sfmax, SF_one, SF_SNaN, SF_one, USR_FPINVF); 943 TEST_R_OP_RR(sfmax, SF_SNaN, SF_one, SF_one, USR_FPINVF); 944 TEST_R_OP_RR(sfmax, SF_one, SF_QNaN, SF_one, USR_CLEAR); 945 TEST_R_OP_RR(sfmax, SF_QNaN, SF_one, SF_one, USR_CLEAR); 946 TEST_R_OP_RR(sfmax, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 947 TEST_R_OP_RR(sfmax, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 948 TEST_R_OP_RR(sfmax, SF_zero, SF_zero_neg, SF_zero, USR_CLEAR); 949 TEST_R_OP_RR(sfmax, SF_zero_neg, SF_zero, SF_zero, USR_CLEAR); 950 951 TEST_R_OP_RR(sfadd, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 952 TEST_R_OP_RR(sfadd, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 953 TEST_R_OP_RR(sfadd, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 954 TEST_R_OP_RR(sfadd, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 955 956 TEST_R_OP_RR(sfsub, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 957 TEST_R_OP_RR(sfsub, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 958 TEST_R_OP_RR(sfsub, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 959 TEST_R_OP_RR(sfsub, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 960 961 TEST_R_OP_RR(sfmpy, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 962 TEST_R_OP_RR(sfmpy, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 963 TEST_R_OP_RR(sfmpy, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 964 TEST_R_OP_RR(sfmpy, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 965 966 TEST_XR_OP_RR(sffma, SF_one, SF_one, SF_one, SF_two, USR_CLEAR); 967 TEST_XR_OP_RR(sffma, SF_zero, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 968 TEST_XR_OP_RR(sffma, SF_zero, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 969 TEST_XR_OP_RR(sffma, SF_zero, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 970 TEST_XR_OP_RR(sffma, SF_zero, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 971 972 TEST_XR_OP_RR(sffms, SF_one, SF_one, SF_one, SF_zero, USR_CLEAR); 973 TEST_XR_OP_RR(sffms, SF_zero, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 974 TEST_XR_OP_RR(sffms, SF_zero, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 975 TEST_XR_OP_RR(sffms, SF_zero, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 976 TEST_XR_OP_RR(sffms, SF_zero, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF); 977 978 TEST_CMP_RR(sfcmpuo, SF_one, SF_large_pos, 0x00, USR_CLEAR); 979 TEST_CMP_RR(sfcmpuo, SF_INF, SF_large_pos, 0x00, USR_CLEAR); 980 TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_large_pos, 0xff, USR_CLEAR); 981 TEST_CMP_RR(sfcmpuo, SF_QNaN_neg, SF_large_pos, 0xff, USR_CLEAR); 982 TEST_CMP_RR(sfcmpuo, SF_SNaN, SF_large_pos, 0xff, USR_FPINVF); 983 TEST_CMP_RR(sfcmpuo, SF_SNaN_neg, SF_large_pos, 0xff, USR_FPINVF); 984 TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_QNaN, 0xff, USR_CLEAR); 985 TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_SNaN, 0xff, USR_FPINVF); 986 987 TEST_CMP_RR(sfcmpeq, SF_one, SF_QNaN, 0x00, USR_CLEAR); 988 TEST_CMP_RR(sfcmpeq, SF_one, SF_SNaN, 0x00, USR_FPINVF); 989 TEST_CMP_RR(sfcmpgt, SF_one, SF_QNaN, 0x00, USR_CLEAR); 990 TEST_CMP_RR(sfcmpgt, SF_one, SF_SNaN, 0x00, USR_FPINVF); 991 TEST_CMP_RR(sfcmpge, SF_one, SF_QNaN, 0x00, USR_CLEAR); 992 TEST_CMP_RR(sfcmpge, SF_one, SF_SNaN, 0x00, USR_FPINVF); 993 994 TEST_P_OP_PP(dfadd, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR); 995 TEST_P_OP_PP(dfadd, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 996 TEST_P_OP_PP(dfadd, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 997 TEST_P_OP_PP(dfadd, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF); 998 999 TEST_P_OP_PP(dfsub, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR); 1000 TEST_P_OP_PP(dfsub, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1001 TEST_P_OP_PP(dfsub, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1002 TEST_P_OP_PP(dfsub, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF); 1003 1004 #if CORE_IS_V67 1005 TEST_P_OP_PP(dfmin, DF_any, DF_small_neg, DF_small_neg, USR_CLEAR); 1006 TEST_P_OP_PP(dfmin, DF_any, DF_SNaN, DF_any, USR_FPINVF); 1007 TEST_P_OP_PP(dfmin, DF_SNaN, DF_any, DF_any, USR_FPINVF); 1008 TEST_P_OP_PP(dfmin, DF_any, DF_QNaN, DF_any, USR_CLEAR); 1009 TEST_P_OP_PP(dfmin, DF_QNaN, DF_any, DF_any, USR_CLEAR); 1010 TEST_P_OP_PP(dfmin, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF); 1011 TEST_P_OP_PP(dfmin, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1012 TEST_P_OP_PP(dfmin, DF_zero, DF_zero_neg, DF_zero_neg, USR_CLEAR); 1013 TEST_P_OP_PP(dfmin, DF_zero_neg, DF_zero, DF_zero_neg, USR_CLEAR); 1014 1015 TEST_P_OP_PP(dfmax, DF_any, DF_small_neg, DF_any, USR_CLEAR); 1016 TEST_P_OP_PP(dfmax, DF_any, DF_SNaN, DF_any, USR_FPINVF); 1017 TEST_P_OP_PP(dfmax, DF_SNaN, DF_any, DF_any, USR_FPINVF); 1018 TEST_P_OP_PP(dfmax, DF_any, DF_QNaN, DF_any, USR_CLEAR); 1019 TEST_P_OP_PP(dfmax, DF_QNaN, DF_any, DF_any, USR_CLEAR); 1020 TEST_P_OP_PP(dfmax, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF); 1021 TEST_P_OP_PP(dfmax, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1022 TEST_P_OP_PP(dfmax, DF_zero, DF_zero_neg, DF_zero, USR_CLEAR); 1023 TEST_P_OP_PP(dfmax, DF_zero_neg, DF_zero, DF_zero, USR_CLEAR); 1024 1025 TEST_XP_OP_PP(dfmpyhh, DF_one, DF_one, DF_one, DF_one_hh, USR_CLEAR); 1026 TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR); 1027 TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1028 TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF); 1029 TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF); 1030 #else 1031 printf("v67 instructions skipped\n"); 1032 #endif 1033 1034 TEST_CMP_PP(dfcmpuo, DF_small_neg, DF_any, 0x00, USR_CLEAR); 1035 TEST_CMP_PP(dfcmpuo, DF_large_pos, DF_any, 0x00, USR_CLEAR); 1036 TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_any, 0xff, USR_CLEAR); 1037 TEST_CMP_PP(dfcmpuo, DF_QNaN_neg, DF_any, 0xff, USR_CLEAR); 1038 TEST_CMP_PP(dfcmpuo, DF_SNaN, DF_any, 0xff, USR_FPINVF); 1039 TEST_CMP_PP(dfcmpuo, DF_SNaN_neg, DF_any, 0xff, USR_FPINVF); 1040 TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_QNaN, 0xff, USR_CLEAR); 1041 TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_SNaN, 0xff, USR_FPINVF); 1042 1043 TEST_CMP_PP(dfcmpeq, DF_any, DF_QNaN, 0x00, USR_CLEAR); 1044 TEST_CMP_PP(dfcmpeq, DF_any, DF_SNaN, 0x00, USR_FPINVF); 1045 TEST_CMP_PP(dfcmpgt, DF_any, DF_QNaN, 0x00, USR_CLEAR); 1046 TEST_CMP_PP(dfcmpgt, DF_any, DF_SNaN, 0x00, USR_FPINVF); 1047 TEST_CMP_PP(dfcmpge, DF_any, DF_QNaN, 0x00, USR_CLEAR); 1048 TEST_CMP_PP(dfcmpge, DF_any, DF_SNaN, 0x00, USR_FPINVF); 1049 1050 TEST_P_OP_R(conv_sf2df, SF_QNaN, DF_HEX_NaN, USR_CLEAR); 1051 TEST_P_OP_R(conv_sf2df, SF_SNaN, DF_HEX_NaN, USR_FPINVF); 1052 TEST_R_OP_R(conv_sf2uw, SF_QNaN, 0xffffffff, USR_FPINVF); 1053 TEST_R_OP_R(conv_sf2uw, SF_SNaN, 0xffffffff, USR_FPINVF); 1054 TEST_R_OP_R(conv_sf2w, SF_QNaN, 0xffffffff, USR_FPINVF); 1055 TEST_R_OP_R(conv_sf2w, SF_SNaN, 0xffffffff, USR_FPINVF); 1056 TEST_P_OP_R(conv_sf2ud, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1057 TEST_P_OP_R(conv_sf2ud, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1058 TEST_P_OP_R(conv_sf2d, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1059 TEST_P_OP_R(conv_sf2d, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1060 TEST_R_OP_R(conv_sf2uw_chop, SF_QNaN, 0xffffffff, USR_FPINVF); 1061 TEST_R_OP_R(conv_sf2uw_chop, SF_SNaN, 0xffffffff, USR_FPINVF); 1062 TEST_R_OP_R(conv_sf2w_chop, SF_QNaN, 0xffffffff, USR_FPINVF); 1063 TEST_R_OP_R(conv_sf2w_chop, SF_SNaN, 0xffffffff, USR_FPINVF); 1064 TEST_P_OP_R(conv_sf2ud_chop, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1065 TEST_P_OP_R(conv_sf2ud_chop, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1066 TEST_P_OP_R(conv_sf2d_chop, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1067 TEST_P_OP_R(conv_sf2d_chop, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1068 1069 TEST_R_OP_P(conv_df2sf, DF_QNaN, SF_HEX_NaN, USR_CLEAR); 1070 TEST_R_OP_P(conv_df2sf, DF_SNaN, SF_HEX_NaN, USR_FPINVF); 1071 TEST_R_OP_P(conv_df2uw, DF_QNaN, 0xffffffff, USR_FPINVF); 1072 TEST_R_OP_P(conv_df2uw, DF_SNaN, 0xffffffff, USR_FPINVF); 1073 TEST_R_OP_P(conv_df2w, DF_QNaN, 0xffffffff, USR_FPINVF); 1074 TEST_R_OP_P(conv_df2w, DF_SNaN, 0xffffffff, USR_FPINVF); 1075 TEST_P_OP_P(conv_df2ud, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1076 TEST_P_OP_P(conv_df2ud, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1077 TEST_P_OP_P(conv_df2d, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1078 TEST_P_OP_P(conv_df2d, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1079 TEST_R_OP_P(conv_df2uw_chop, DF_QNaN, 0xffffffff, USR_FPINVF); 1080 TEST_R_OP_P(conv_df2uw_chop, DF_SNaN, 0xffffffff, USR_FPINVF); 1081 1082 /* Test for typo in HELPER(conv_df2uw_chop) */ 1083 TEST_R_OP_P(conv_df2uw_chop, 0xffffff7f00000001ULL, 0xffffffff, USR_FPINVF); 1084 1085 TEST_R_OP_P(conv_df2w_chop, DF_QNaN, 0xffffffff, USR_FPINVF); 1086 TEST_R_OP_P(conv_df2w_chop, DF_SNaN, 0xffffffff, USR_FPINVF); 1087 TEST_P_OP_P(conv_df2ud_chop, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1088 TEST_P_OP_P(conv_df2ud_chop, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1089 TEST_P_OP_P(conv_df2d_chop, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF); 1090 TEST_P_OP_P(conv_df2d_chop, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF); 1091 1092 TEST_R_OP_R(conv_uw2sf, 0x00000001, SF_one, USR_CLEAR); 1093 TEST_R_OP_R(conv_uw2sf, 0x010020a5, 0x4b801052, USR_FPINPF); 1094 TEST_R_OP_R(conv_w2sf, 0x00000001, SF_one, USR_CLEAR); 1095 TEST_R_OP_R(conv_w2sf, 0x010020a5, 0x4b801052, USR_FPINPF); 1096 TEST_R_OP_P(conv_ud2sf, 0x0000000000000001ULL, SF_one, USR_CLEAR); 1097 TEST_R_OP_P(conv_ud2sf, 0x00000000010020a5ULL, 0x4b801052, USR_FPINPF); 1098 TEST_R_OP_P(conv_d2sf, 0x0000000000000001ULL, SF_one, USR_CLEAR); 1099 TEST_R_OP_P(conv_d2sf, 0x00000000010020a5ULL, 0x4b801052, USR_FPINPF); 1100 1101 TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_one, 1, SF_four, 1102 USR_CLEAR); 1103 TEST_XR_OP_RRp(sffma_sc, SF_QNaN, SF_one, SF_one, 1, SF_HEX_NaN, 1104 USR_CLEAR); 1105 TEST_XR_OP_RRp(sffma_sc, SF_one, SF_QNaN, SF_one, 1, SF_HEX_NaN, 1106 USR_CLEAR); 1107 TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_QNaN, 1, SF_HEX_NaN, 1108 USR_CLEAR); 1109 TEST_XR_OP_RRp(sffma_sc, SF_SNaN, SF_one, SF_one, 1, SF_HEX_NaN, 1110 USR_FPINVF); 1111 TEST_XR_OP_RRp(sffma_sc, SF_one, SF_SNaN, SF_one, 1, SF_HEX_NaN, 1112 USR_FPINVF); 1113 TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_SNaN, 1, SF_HEX_NaN, 1114 USR_FPINVF); 1115 1116 TEST_Rp_OP_RR(sfrecipa, SF_one, SF_one, SF_one_recip, 0x00, 1117 USR_CLEAR); 1118 TEST_Rp_OP_RR(sfrecipa, SF_QNaN, SF_one, SF_HEX_NaN, 0x00, 1119 USR_CLEAR); 1120 TEST_Rp_OP_RR(sfrecipa, SF_one, SF_QNaN, SF_HEX_NaN, 0x00, 1121 USR_CLEAR); 1122 TEST_Rp_OP_RR(sfrecipa, SF_one, SF_SNaN, SF_HEX_NaN, 0x00, 1123 USR_FPINVF); 1124 TEST_Rp_OP_RR(sfrecipa, SF_SNaN, SF_one, SF_HEX_NaN, 0x00, 1125 USR_FPINVF); 1126 1127 TEST_R_OP_RR(sffixupn, SF_one, SF_one, SF_one, USR_CLEAR); 1128 TEST_R_OP_RR(sffixupn, SF_QNaN, SF_one, SF_HEX_NaN, USR_CLEAR); 1129 TEST_R_OP_RR(sffixupn, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 1130 TEST_R_OP_RR(sffixupn, SF_SNaN, SF_one, SF_HEX_NaN, USR_FPINVF); 1131 TEST_R_OP_RR(sffixupn, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 1132 1133 TEST_R_OP_RR(sffixupd, SF_one, SF_one, SF_one, USR_CLEAR); 1134 TEST_R_OP_RR(sffixupd, SF_QNaN, SF_one, SF_HEX_NaN, USR_CLEAR); 1135 TEST_R_OP_RR(sffixupd, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 1136 TEST_R_OP_RR(sffixupd, SF_SNaN, SF_one, SF_HEX_NaN, USR_FPINVF); 1137 TEST_R_OP_RR(sffixupd, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 1138 1139 TEST_R_OP_R(sffixupr, SF_one, SF_one, USR_CLEAR); 1140 TEST_R_OP_R(sffixupr, SF_QNaN, SF_HEX_NaN, USR_CLEAR); 1141 TEST_R_OP_R(sffixupr, SF_SNaN, SF_HEX_NaN, USR_FPINVF); 1142 1143 TEST_Rp_OP_R(sfinvsqrta, SF_one, SF_one_invsqrta, 0x00, USR_CLEAR); 1144 TEST_Rp_OP_R(sfinvsqrta, SF_zero, SF_one, 0x00, USR_CLEAR); 1145 TEST_Rp_OP_R(sfinvsqrta, SF_QNaN, SF_HEX_NaN, 0x00, USR_CLEAR); 1146 TEST_Rp_OP_R(sfinvsqrta, SF_small_neg, SF_HEX_NaN, 0x00, USR_FPINVF); 1147 TEST_Rp_OP_R(sfinvsqrta, SF_SNaN, SF_HEX_NaN, 0x00, USR_FPINVF); 1148 1149 puts(err ? "FAIL" : "PASS"); 1150 return err; 1151 } 1152