14d04395aSTaylor Simpson /*
2*6146060aSMatheus Tavares Bernardino * Copyright(c) 2022-2024 Qualcomm Innovation Center, Inc. All Rights Reserved.
34d04395aSTaylor Simpson *
44d04395aSTaylor Simpson * This program is free software; you can redistribute it and/or modify
54d04395aSTaylor Simpson * it under the terms of the GNU General Public License as published by
64d04395aSTaylor Simpson * the Free Software Foundation; either version 2 of the License, or
74d04395aSTaylor Simpson * (at your option) any later version.
84d04395aSTaylor Simpson *
94d04395aSTaylor Simpson * This program is distributed in the hope that it will be useful,
104d04395aSTaylor Simpson * but WITHOUT ANY WARRANTY; without even the implied warranty of
114d04395aSTaylor Simpson * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
124d04395aSTaylor Simpson * GNU General Public License for more details.
134d04395aSTaylor Simpson *
144d04395aSTaylor Simpson * You should have received a copy of the GNU General Public License
154d04395aSTaylor Simpson * along with this program; if not, see <http://www.gnu.org/licenses/>.
164d04395aSTaylor Simpson */
174d04395aSTaylor Simpson
184d04395aSTaylor Simpson /*
194d04395aSTaylor Simpson * Test instructions that might set bits in user status register (USR)
204d04395aSTaylor Simpson */
214d04395aSTaylor Simpson
224d04395aSTaylor Simpson #include <stdio.h>
234d04395aSTaylor Simpson #include <stdint.h>
244d04395aSTaylor Simpson
254d04395aSTaylor Simpson int err;
264d04395aSTaylor Simpson
270d57cd61STaylor Simpson #include "hex_test.h"
284d04395aSTaylor Simpson
294d04395aSTaylor Simpson /*
304d04395aSTaylor Simpson * Some of the instructions tested are only available on certain versions
314d04395aSTaylor Simpson * of the Hexagon core
324d04395aSTaylor Simpson */
334d04395aSTaylor Simpson #define CORE_HAS_AUDIO (__HEXAGON_ARCH__ >= 67 && defined(__HEXAGON_AUDIO__))
344d04395aSTaylor Simpson #define CORE_IS_V67 (__HEXAGON_ARCH__ >= 67)
354d04395aSTaylor Simpson
364d04395aSTaylor Simpson /*
374d04395aSTaylor Simpson * Templates for functions to execute an instruction
384d04395aSTaylor Simpson *
394d04395aSTaylor Simpson * The templates vary by the number of arguments and the types of the args
404d04395aSTaylor Simpson * and result. We use one letter in the macro name for the result and each
414d04395aSTaylor Simpson * argument:
424d04395aSTaylor Simpson * x unknown (specified in a subsequent template) or don't care
434d04395aSTaylor Simpson * R register (32 bits)
444d04395aSTaylor Simpson * P pair (64 bits)
454d04395aSTaylor Simpson * p predicate
464d04395aSTaylor Simpson * I immediate
474d04395aSTaylor Simpson * Xx read/write
484d04395aSTaylor Simpson */
494d04395aSTaylor Simpson
504d04395aSTaylor Simpson /* Template for instructions with one register operand */
514d04395aSTaylor Simpson #define FUNC_x_OP_x(RESTYPE, SRCTYPE, NAME, INSN) \
524d04395aSTaylor Simpson static RESTYPE NAME(SRCTYPE src, uint32_t *usr_result) \
534d04395aSTaylor Simpson { \
544d04395aSTaylor Simpson RESTYPE result; \
554d04395aSTaylor Simpson uint32_t usr; \
564d04395aSTaylor Simpson asm(CLEAR_USRBITS \
574d04395aSTaylor Simpson INSN "\n\t" \
584d04395aSTaylor Simpson "%1 = usr\n\t" \
594d04395aSTaylor Simpson : "=r"(result), "=r"(usr) \
604d04395aSTaylor Simpson : "r"(src) \
614d04395aSTaylor Simpson : "r2", "usr"); \
624d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
634d04395aSTaylor Simpson return result; \
644d04395aSTaylor Simpson }
654d04395aSTaylor Simpson
664d04395aSTaylor Simpson #define FUNC_R_OP_R(NAME, INSN) \
674d04395aSTaylor Simpson FUNC_x_OP_x(uint32_t, uint32_t, NAME, INSN)
684d04395aSTaylor Simpson
694d04395aSTaylor Simpson #define FUNC_R_OP_P(NAME, INSN) \
704d04395aSTaylor Simpson FUNC_x_OP_x(uint32_t, uint64_t, NAME, INSN)
714d04395aSTaylor Simpson
724d04395aSTaylor Simpson #define FUNC_P_OP_P(NAME, INSN) \
734d04395aSTaylor Simpson FUNC_x_OP_x(uint64_t, uint64_t, NAME, INSN)
744d04395aSTaylor Simpson
754d04395aSTaylor Simpson #define FUNC_P_OP_R(NAME, INSN) \
764d04395aSTaylor Simpson FUNC_x_OP_x(uint64_t, uint32_t, NAME, INSN)
774d04395aSTaylor Simpson
784d04395aSTaylor Simpson /*
794d04395aSTaylor Simpson * Template for instructions with a register and predicate result
804d04395aSTaylor Simpson * and one register operand
814d04395aSTaylor Simpson */
824d04395aSTaylor Simpson #define FUNC_xp_OP_x(RESTYPE, SRCTYPE, NAME, INSN) \
834d04395aSTaylor Simpson static RESTYPE NAME(SRCTYPE src, uint8_t *pred_result, uint32_t *usr_result) \
844d04395aSTaylor Simpson { \
854d04395aSTaylor Simpson RESTYPE result; \
864d04395aSTaylor Simpson uint8_t pred; \
874d04395aSTaylor Simpson uint32_t usr; \
884d04395aSTaylor Simpson asm(CLEAR_USRBITS \
894d04395aSTaylor Simpson INSN "\n\t" \
904d04395aSTaylor Simpson "%1 = p2\n\t" \
914d04395aSTaylor Simpson "%2 = usr\n\t" \
924d04395aSTaylor Simpson : "=r"(result), "=r"(pred), "=r"(usr) \
934d04395aSTaylor Simpson : "r"(src) \
944d04395aSTaylor Simpson : "r2", "p2", "usr"); \
954d04395aSTaylor Simpson *pred_result = pred; \
964d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
974d04395aSTaylor Simpson return result; \
984d04395aSTaylor Simpson }
994d04395aSTaylor Simpson
1004d04395aSTaylor Simpson #define FUNC_Rp_OP_R(NAME, INSN) \
1014d04395aSTaylor Simpson FUNC_xp_OP_x(uint32_t, uint32_t, NAME, INSN)
1024d04395aSTaylor Simpson
1034d04395aSTaylor Simpson /* Template for instructions with two register operands */
1044d04395aSTaylor Simpson #define FUNC_x_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \
1054d04395aSTaylor Simpson static RESTYPE NAME(SRC1TYPE src1, SRC2TYPE src2, uint32_t *usr_result) \
1064d04395aSTaylor Simpson { \
1074d04395aSTaylor Simpson RESTYPE result; \
1084d04395aSTaylor Simpson uint32_t usr; \
1094d04395aSTaylor Simpson asm(CLEAR_USRBITS \
1104d04395aSTaylor Simpson INSN "\n\t" \
1114d04395aSTaylor Simpson "%1 = usr\n\t" \
1124d04395aSTaylor Simpson : "=r"(result), "=r"(usr) \
1134d04395aSTaylor Simpson : "r"(src1), "r"(src2) \
1144d04395aSTaylor Simpson : "r2", "usr"); \
1154d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
1164d04395aSTaylor Simpson return result; \
1174d04395aSTaylor Simpson }
1184d04395aSTaylor Simpson
1194d04395aSTaylor Simpson #define FUNC_P_OP_PP(NAME, INSN) \
1204d04395aSTaylor Simpson FUNC_x_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN)
1214d04395aSTaylor Simpson
1224d04395aSTaylor Simpson #define FUNC_R_OP_PP(NAME, INSN) \
1234d04395aSTaylor Simpson FUNC_x_OP_xx(uint32_t, uint64_t, uint64_t, NAME, INSN)
1244d04395aSTaylor Simpson
1254d04395aSTaylor Simpson #define FUNC_P_OP_RR(NAME, INSN) \
1264d04395aSTaylor Simpson FUNC_x_OP_xx(uint64_t, uint32_t, uint32_t, NAME, INSN)
1274d04395aSTaylor Simpson
1284d04395aSTaylor Simpson #define FUNC_R_OP_RR(NAME, INSN) \
1294d04395aSTaylor Simpson FUNC_x_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN)
1304d04395aSTaylor Simpson
1314d04395aSTaylor Simpson #define FUNC_R_OP_PR(NAME, INSN) \
1324d04395aSTaylor Simpson FUNC_x_OP_xx(uint32_t, uint64_t, uint32_t, NAME, INSN)
1334d04395aSTaylor Simpson
1344d04395aSTaylor Simpson #define FUNC_P_OP_PR(NAME, INSN) \
1354d04395aSTaylor Simpson FUNC_x_OP_xx(uint64_t, uint64_t, uint32_t, NAME, INSN)
1364d04395aSTaylor Simpson
1374d04395aSTaylor Simpson /*
1384d04395aSTaylor Simpson * Template for instructions with a register and predicate result
1394d04395aSTaylor Simpson * and two register operands
1404d04395aSTaylor Simpson */
1414d04395aSTaylor Simpson #define FUNC_xp_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \
1424d04395aSTaylor Simpson static RESTYPE NAME(SRC1TYPE src1, SRC2TYPE src2, \
1434d04395aSTaylor Simpson uint8_t *pred_result, uint32_t *usr_result) \
1444d04395aSTaylor Simpson { \
1454d04395aSTaylor Simpson RESTYPE result; \
1464d04395aSTaylor Simpson uint8_t pred; \
1474d04395aSTaylor Simpson uint32_t usr; \
1484d04395aSTaylor Simpson asm(CLEAR_USRBITS \
1494d04395aSTaylor Simpson INSN "\n\t" \
1504d04395aSTaylor Simpson "%1 = p2\n\t" \
1514d04395aSTaylor Simpson "%2 = usr\n\t" \
1524d04395aSTaylor Simpson : "=r"(result), "=r"(pred), "=r"(usr) \
1534d04395aSTaylor Simpson : "r"(src1), "r"(src2) \
1544d04395aSTaylor Simpson : "r2", "p2", "usr"); \
1554d04395aSTaylor Simpson *pred_result = pred; \
1564d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
1574d04395aSTaylor Simpson return result; \
1584d04395aSTaylor Simpson }
1594d04395aSTaylor Simpson
1604d04395aSTaylor Simpson #define FUNC_Rp_OP_RR(NAME, INSN) \
1614d04395aSTaylor Simpson FUNC_xp_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN)
1624d04395aSTaylor Simpson
1634d04395aSTaylor Simpson /* Template for instructions with one register and one immediate */
1644d04395aSTaylor Simpson #define FUNC_x_OP_xI(RESTYPE, SRC1TYPE, NAME, INSN) \
1654d04395aSTaylor Simpson static RESTYPE NAME(SRC1TYPE src1, int32_t src2, uint32_t *usr_result) \
1664d04395aSTaylor Simpson { \
1674d04395aSTaylor Simpson RESTYPE result; \
1684d04395aSTaylor Simpson uint32_t usr; \
1694d04395aSTaylor Simpson asm(CLEAR_USRBITS \
1704d04395aSTaylor Simpson INSN "\n\t" \
1714d04395aSTaylor Simpson "%1 = usr\n\t" \
1724d04395aSTaylor Simpson : "=r"(result), "=r"(usr) \
1734d04395aSTaylor Simpson : "r"(src1), "i"(src2) \
1744d04395aSTaylor Simpson : "r2", "usr"); \
1754d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
1764d04395aSTaylor Simpson return result; \
1774d04395aSTaylor Simpson }
1784d04395aSTaylor Simpson
1794d04395aSTaylor Simpson #define FUNC_R_OP_RI(NAME, INSN) \
1804d04395aSTaylor Simpson FUNC_x_OP_xI(uint32_t, uint32_t, NAME, INSN)
1814d04395aSTaylor Simpson
1824d04395aSTaylor Simpson #define FUNC_R_OP_PI(NAME, INSN) \
1834d04395aSTaylor Simpson FUNC_x_OP_xI(uint32_t, uint64_t, NAME, INSN)
1844d04395aSTaylor Simpson
1854d04395aSTaylor Simpson /*
1864d04395aSTaylor Simpson * Template for instructions with a read/write result
1874d04395aSTaylor Simpson * and two register operands
1884d04395aSTaylor Simpson */
1894d04395aSTaylor Simpson #define FUNC_Xx_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \
1904d04395aSTaylor Simpson static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, \
1914d04395aSTaylor Simpson uint32_t *usr_result) \
1924d04395aSTaylor Simpson { \
1934d04395aSTaylor Simpson uint32_t usr; \
1944d04395aSTaylor Simpson asm(CLEAR_USRBITS \
1954d04395aSTaylor Simpson INSN "\n\t" \
1964d04395aSTaylor Simpson "%1 = usr\n\t" \
1974d04395aSTaylor Simpson : "+r"(result), "=r"(usr) \
1984d04395aSTaylor Simpson : "r"(src1), "r"(src2) \
1994d04395aSTaylor Simpson : "r2", "usr"); \
2004d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
2014d04395aSTaylor Simpson return result; \
2024d04395aSTaylor Simpson }
2034d04395aSTaylor Simpson
2044d04395aSTaylor Simpson #define FUNC_XR_OP_RR(NAME, INSN) \
2054d04395aSTaylor Simpson FUNC_Xx_OP_xx(uint32_t, uint32_t, uint32_t, NAME, INSN)
2064d04395aSTaylor Simpson
2074d04395aSTaylor Simpson #define FUNC_XP_OP_PP(NAME, INSN) \
2084d04395aSTaylor Simpson FUNC_Xx_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN)
2094d04395aSTaylor Simpson
2104d04395aSTaylor Simpson #define FUNC_XP_OP_RR(NAME, INSN) \
2114d04395aSTaylor Simpson FUNC_Xx_OP_xx(uint64_t, uint32_t, uint32_t, NAME, INSN)
2124d04395aSTaylor Simpson
2134d04395aSTaylor Simpson /*
2144d04395aSTaylor Simpson * Template for instructions with a read/write result
2154d04395aSTaylor Simpson * and two register operands
2164d04395aSTaylor Simpson */
2174d04395aSTaylor Simpson #define FUNC_Xxp_OP_xx(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \
2184d04395aSTaylor Simpson static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, \
2194d04395aSTaylor Simpson uint8_t *pred_result, uint32_t *usr_result) \
2204d04395aSTaylor Simpson { \
2214d04395aSTaylor Simpson uint32_t usr; \
2224d04395aSTaylor Simpson uint8_t pred; \
2234d04395aSTaylor Simpson asm(CLEAR_USRBITS \
2244d04395aSTaylor Simpson INSN "\n\t" \
2254d04395aSTaylor Simpson "%1 = p2\n\t" \
2264d04395aSTaylor Simpson "%2 = usr\n\t" \
2274d04395aSTaylor Simpson : "+r"(result), "=r"(pred), "=r"(usr) \
2284d04395aSTaylor Simpson : "r"(src1), "r"(src2) \
2294d04395aSTaylor Simpson : "r2", "usr"); \
2304d04395aSTaylor Simpson *pred_result = pred; \
2314d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
2324d04395aSTaylor Simpson return result; \
2334d04395aSTaylor Simpson }
2344d04395aSTaylor Simpson
2354d04395aSTaylor Simpson #define FUNC_XPp_OP_PP(NAME, INSN) \
2364d04395aSTaylor Simpson FUNC_Xxp_OP_xx(uint64_t, uint64_t, uint64_t, NAME, INSN)
2374d04395aSTaylor Simpson
2384d04395aSTaylor Simpson /*
2394d04395aSTaylor Simpson * Template for instructions with a read/write result and
2404d04395aSTaylor Simpson * two register and one predicate operands
2414d04395aSTaylor Simpson */
2424d04395aSTaylor Simpson #define FUNC_Xx_OP_xxp(RESTYPE, SRC1TYPE, SRC2TYPE, NAME, INSN) \
2434d04395aSTaylor Simpson static RESTYPE NAME(RESTYPE result, SRC1TYPE src1, SRC2TYPE src2, uint8_t pred,\
2444d04395aSTaylor Simpson uint32_t *usr_result) \
2454d04395aSTaylor Simpson { \
2464d04395aSTaylor Simpson uint32_t usr; \
2474d04395aSTaylor Simpson asm(CLEAR_USRBITS \
2484d04395aSTaylor Simpson "p2 = %4\n\t" \
2494d04395aSTaylor Simpson INSN "\n\t" \
2504d04395aSTaylor Simpson "%1 = usr\n\t" \
2514d04395aSTaylor Simpson : "+r"(result), "=r"(usr) \
2524d04395aSTaylor Simpson : "r"(src1), "r"(src2), "r"(pred) \
2534d04395aSTaylor Simpson : "r2", "p2", "usr"); \
2544d04395aSTaylor Simpson *usr_result = usr & 0x3f; \
2554d04395aSTaylor Simpson return result; \
2564d04395aSTaylor Simpson }
2574d04395aSTaylor Simpson
2584d04395aSTaylor Simpson #define FUNC_XR_OP_RRp(NAME, INSN) \
2594d04395aSTaylor Simpson FUNC_Xx_OP_xxp(uint32_t, uint32_t, uint32_t, NAME, INSN)
2604d04395aSTaylor Simpson
2612479540fSTaylor Simpson /* Template for compare instructions with two register operands */
2622479540fSTaylor Simpson #define FUNC_CMP_xx(SRC1TYPE, SRC2TYPE, NAME, INSN) \
2632479540fSTaylor Simpson static uint32_t NAME(SRC1TYPE src1, SRC2TYPE src2, uint32_t *usr_result) \
2642479540fSTaylor Simpson { \
2652479540fSTaylor Simpson uint32_t result; \
2662479540fSTaylor Simpson uint32_t usr; \
2672479540fSTaylor Simpson asm(CLEAR_USRBITS \
2682479540fSTaylor Simpson INSN "\n\t" \
2692479540fSTaylor Simpson "%0 = p1\n\t" \
2702479540fSTaylor Simpson "%1 = usr\n\t" \
2712479540fSTaylor Simpson : "=r"(result), "=r"(usr) \
2722479540fSTaylor Simpson : "r"(src1), "r"(src2) \
2732479540fSTaylor Simpson : "p1", "r2", "usr"); \
2742479540fSTaylor Simpson *usr_result = usr & 0x3f; \
2752479540fSTaylor Simpson return result; \
2762479540fSTaylor Simpson }
2772479540fSTaylor Simpson
2782479540fSTaylor Simpson #define FUNC_CMP_RR(NAME, INSN) \
2792479540fSTaylor Simpson FUNC_CMP_xx(uint32_t, uint32_t, NAME, INSN)
2802479540fSTaylor Simpson
2812479540fSTaylor Simpson #define FUNC_CMP_PP(NAME, INSN) \
2822479540fSTaylor Simpson FUNC_CMP_xx(uint64_t, uint64_t, NAME, INSN)
2832479540fSTaylor Simpson
2844d04395aSTaylor Simpson /*
2854d04395aSTaylor Simpson * Function declarations using the templates
2864d04395aSTaylor Simpson */
2874d04395aSTaylor Simpson FUNC_R_OP_R(satub, "%0 = satub(%2)")
2884d04395aSTaylor Simpson FUNC_P_OP_PP(vaddubs, "%0 = vaddub(%2, %3):sat")
2894d04395aSTaylor Simpson FUNC_P_OP_PP(vadduhs, "%0 = vadduh(%2, %3):sat")
2904d04395aSTaylor Simpson FUNC_P_OP_PP(vsububs, "%0 = vsubub(%2, %3):sat")
2914d04395aSTaylor Simpson FUNC_P_OP_PP(vsubuhs, "%0 = vsubuh(%2, %3):sat")
2924d04395aSTaylor Simpson
2934d04395aSTaylor Simpson /* Add vector of half integers with saturation and pack to unsigned bytes */
2944d04395aSTaylor Simpson FUNC_R_OP_PP(vaddhubs, "%0 = vaddhub(%2, %3):sat")
2954d04395aSTaylor Simpson
2964d04395aSTaylor Simpson /* Vector saturate half to unsigned byte */
2974d04395aSTaylor Simpson FUNC_R_OP_P(vsathub, "%0 = vsathub(%2)")
2984d04395aSTaylor Simpson
2994d04395aSTaylor Simpson /* Similar to above but takes a 32-bit argument */
3004d04395aSTaylor Simpson FUNC_R_OP_R(svsathub, "%0 = vsathub(%2)")
3014d04395aSTaylor Simpson
3024d04395aSTaylor Simpson /* Vector saturate word to unsigned half */
3034d04395aSTaylor Simpson FUNC_P_OP_P(vsatwuh_nopack, "%0 = vsatwuh(%2)")
3044d04395aSTaylor Simpson
3054d04395aSTaylor Simpson /* Similar to above but returns a 32-bit result */
3064d04395aSTaylor Simpson FUNC_R_OP_P(vsatwuh, "%0 = vsatwuh(%2)")
3074d04395aSTaylor Simpson
3084d04395aSTaylor Simpson /* Vector arithmetic shift halfwords with saturate and pack */
3094d04395aSTaylor Simpson FUNC_R_OP_PI(asrhub_sat, "%0 = vasrhub(%2, #%3):sat")
3104d04395aSTaylor Simpson
3114d04395aSTaylor Simpson /* Vector arithmetic shift halfwords with round, saturate and pack */
3124d04395aSTaylor Simpson FUNC_R_OP_PI(asrhub_rnd_sat, "%0 = vasrhub(%2, #%3):raw")
3134d04395aSTaylor Simpson
3144d04395aSTaylor Simpson FUNC_R_OP_RR(addsat, "%0 = add(%2, %3):sat")
3154d04395aSTaylor Simpson /* Similar to above but with register pairs */
3164d04395aSTaylor Simpson FUNC_P_OP_PP(addpsat, "%0 = add(%2, %3):sat")
3174d04395aSTaylor Simpson
3184d04395aSTaylor Simpson FUNC_XR_OP_RR(mpy_acc_sat_hh_s0, "%0 += mpy(%2.H, %3.H):sat")
3194d04395aSTaylor Simpson FUNC_R_OP_RR(mpy_sat_hh_s1, "%0 = mpy(%2.H, %3.H):<<1:sat")
3204d04395aSTaylor Simpson FUNC_R_OP_RR(mpy_sat_rnd_hh_s1, "%0 = mpy(%2.H, %3.H):<<1:rnd:sat")
3214d04395aSTaylor Simpson FUNC_R_OP_RR(mpy_up_s1_sat, "%0 = mpy(%2, %3):<<1:sat")
3224d04395aSTaylor Simpson FUNC_P_OP_RR(vmpy2s_s1, "%0 = vmpyh(%2, %3):<<1:sat")
3234d04395aSTaylor Simpson FUNC_P_OP_RR(vmpy2su_s1, "%0 = vmpyhsu(%2, %3):<<1:sat")
3244d04395aSTaylor Simpson FUNC_R_OP_RR(vmpy2s_s1pack, "%0 = vmpyh(%2, %3):<<1:rnd:sat")
3254d04395aSTaylor Simpson FUNC_P_OP_PP(vmpy2es_s1, "%0 = vmpyeh(%2, %3):<<1:sat")
3264d04395aSTaylor Simpson FUNC_R_OP_PP(vdmpyrs_s1, "%0 = vdmpy(%2, %3):<<1:rnd:sat")
3274d04395aSTaylor Simpson FUNC_XP_OP_PP(vdmacs_s0, "%0 += vdmpy(%2, %3):sat")
3284d04395aSTaylor Simpson FUNC_R_OP_RR(cmpyrs_s0, "%0 = cmpy(%2, %3):rnd:sat")
3294d04395aSTaylor Simpson FUNC_XP_OP_RR(cmacs_s0, "%0 += cmpy(%2, %3):sat")
3304d04395aSTaylor Simpson FUNC_XP_OP_RR(cnacs_s0, "%0 -= cmpy(%2, %3):sat")
3314d04395aSTaylor Simpson FUNC_P_OP_PP(vrcmpys_s1_h, "%0 = vrcmpys(%2, %3):<<1:sat:raw:hi")
3324d04395aSTaylor Simpson FUNC_XP_OP_PP(mmacls_s0, "%0 += vmpyweh(%2, %3):sat")
3334d04395aSTaylor Simpson FUNC_R_OP_RR(hmmpyl_rs1, "%0 = mpy(%2, %3.L):<<1:rnd:sat")
3344d04395aSTaylor Simpson FUNC_XP_OP_PP(mmaculs_s0, "%0 += vmpyweuh(%2, %3):sat")
3354d04395aSTaylor Simpson FUNC_R_OP_PR(cmpyi_wh, "%0 = cmpyiwh(%2, %3):<<1:rnd:sat")
3364d04395aSTaylor Simpson FUNC_P_OP_PP(vcmpy_s0_sat_i, "%0 = vcmpyi(%2, %3):sat")
3374d04395aSTaylor Simpson FUNC_P_OP_PR(vcrotate, "%0 = vcrotate(%2, %3)")
3384d04395aSTaylor Simpson FUNC_P_OP_PR(vcnegh, "%0 = vcnegh(%2, %3)")
3394d04395aSTaylor Simpson
3404d04395aSTaylor Simpson #if CORE_HAS_AUDIO
3414d04395aSTaylor Simpson FUNC_R_OP_PP(wcmpyrw, "%0 = cmpyrw(%2, %3):<<1:sat")
3424d04395aSTaylor Simpson #endif
3434d04395aSTaylor Simpson
3444d04395aSTaylor Simpson FUNC_R_OP_RR(addh_l16_sat_ll, "%0 = add(%2.L, %3.L):sat")
3454d04395aSTaylor Simpson FUNC_P_OP_P(vconj, "%0 = vconj(%2):sat")
3464d04395aSTaylor Simpson FUNC_P_OP_PP(vxaddsubw, "%0 = vxaddsubw(%2, %3):sat")
3474d04395aSTaylor Simpson FUNC_P_OP_P(vabshsat, "%0 = vabsh(%2):sat")
3484d04395aSTaylor Simpson FUNC_P_OP_PP(vnavgwr, "%0 = vnavgw(%2, %3):rnd:sat")
3494d04395aSTaylor Simpson FUNC_R_OP_RI(round_ri_sat, "%0 = round(%2, #%3):sat")
3504d04395aSTaylor Simpson FUNC_R_OP_RR(asr_r_r_sat, "%0 = asr(%2, %3):sat")
3518e8a85c1STaylor Simpson FUNC_R_OP_RR(asl_r_r_sat, "%0 = asl(%2, %3):sat")
3524d04395aSTaylor Simpson
3534d04395aSTaylor Simpson FUNC_XPp_OP_PP(ACS, "%0, p2 = vacsh(%3, %4)")
3544d04395aSTaylor Simpson
3552479540fSTaylor Simpson /* Floating point */
3562479540fSTaylor Simpson FUNC_R_OP_RR(sfmin, "%0 = sfmin(%2, %3)")
3572479540fSTaylor Simpson FUNC_R_OP_RR(sfmax, "%0 = sfmax(%2, %3)")
3582479540fSTaylor Simpson FUNC_R_OP_RR(sfadd, "%0 = sfadd(%2, %3)")
3592479540fSTaylor Simpson FUNC_R_OP_RR(sfsub, "%0 = sfsub(%2, %3)")
3602479540fSTaylor Simpson FUNC_R_OP_RR(sfmpy, "%0 = sfmpy(%2, %3)")
3612479540fSTaylor Simpson FUNC_XR_OP_RR(sffma, "%0 += sfmpy(%2, %3)")
3622479540fSTaylor Simpson FUNC_XR_OP_RR(sffms, "%0 -= sfmpy(%2, %3)")
3632479540fSTaylor Simpson FUNC_CMP_RR(sfcmpuo, "p1 = sfcmp.uo(%2, %3)")
3642479540fSTaylor Simpson FUNC_CMP_RR(sfcmpeq, "p1 = sfcmp.eq(%2, %3)")
3652479540fSTaylor Simpson FUNC_CMP_RR(sfcmpgt, "p1 = sfcmp.gt(%2, %3)")
3662479540fSTaylor Simpson FUNC_CMP_RR(sfcmpge, "p1 = sfcmp.ge(%2, %3)")
3672479540fSTaylor Simpson
3682479540fSTaylor Simpson FUNC_P_OP_PP(dfadd, "%0 = dfadd(%2, %3)")
3692479540fSTaylor Simpson FUNC_P_OP_PP(dfsub, "%0 = dfsub(%2, %3)")
3702479540fSTaylor Simpson
3712479540fSTaylor Simpson #if CORE_IS_V67
3722479540fSTaylor Simpson FUNC_P_OP_PP(dfmin, "%0 = dfmin(%2, %3)")
3732479540fSTaylor Simpson FUNC_P_OP_PP(dfmax, "%0 = dfmax(%2, %3)")
3742479540fSTaylor Simpson FUNC_XP_OP_PP(dfmpyhh, "%0 += dfmpyhh(%2, %3)")
3752479540fSTaylor Simpson #endif
3762479540fSTaylor Simpson
3772479540fSTaylor Simpson FUNC_CMP_PP(dfcmpuo, "p1 = dfcmp.uo(%2, %3)")
3782479540fSTaylor Simpson FUNC_CMP_PP(dfcmpeq, "p1 = dfcmp.eq(%2, %3)")
3792479540fSTaylor Simpson FUNC_CMP_PP(dfcmpgt, "p1 = dfcmp.gt(%2, %3)")
3802479540fSTaylor Simpson FUNC_CMP_PP(dfcmpge, "p1 = dfcmp.ge(%2, %3)")
3812479540fSTaylor Simpson
3822479540fSTaylor Simpson /* Conversions from sf */
3832479540fSTaylor Simpson FUNC_P_OP_R(conv_sf2df, "%0 = convert_sf2df(%2)")
3842479540fSTaylor Simpson FUNC_R_OP_R(conv_sf2uw, "%0 = convert_sf2uw(%2)")
3852479540fSTaylor Simpson FUNC_R_OP_R(conv_sf2w, "%0 = convert_sf2w(%2)")
3862479540fSTaylor Simpson FUNC_P_OP_R(conv_sf2ud, "%0 = convert_sf2ud(%2)")
3872479540fSTaylor Simpson FUNC_P_OP_R(conv_sf2d, "%0 = convert_sf2d(%2)")
3882479540fSTaylor Simpson FUNC_R_OP_R(conv_sf2uw_chop, "%0 = convert_sf2uw(%2):chop")
3892479540fSTaylor Simpson FUNC_R_OP_R(conv_sf2w_chop, "%0 = convert_sf2w(%2):chop")
3902479540fSTaylor Simpson FUNC_P_OP_R(conv_sf2ud_chop, "%0 = convert_sf2ud(%2):chop")
3912479540fSTaylor Simpson FUNC_P_OP_R(conv_sf2d_chop, "%0 = convert_sf2d(%2):chop")
3922479540fSTaylor Simpson
3932479540fSTaylor Simpson /* Conversions from df */
3942479540fSTaylor Simpson FUNC_R_OP_P(conv_df2sf, "%0 = convert_df2sf(%2)")
3952479540fSTaylor Simpson FUNC_R_OP_P(conv_df2uw, "%0 = convert_df2uw(%2)")
3962479540fSTaylor Simpson FUNC_R_OP_P(conv_df2w, "%0 = convert_df2w(%2)")
3972479540fSTaylor Simpson FUNC_P_OP_P(conv_df2ud, "%0 = convert_df2ud(%2)")
3982479540fSTaylor Simpson FUNC_P_OP_P(conv_df2d, "%0 = convert_df2d(%2)")
3992479540fSTaylor Simpson FUNC_R_OP_P(conv_df2uw_chop, "%0 = convert_df2uw(%2):chop")
4002479540fSTaylor Simpson FUNC_R_OP_P(conv_df2w_chop, "%0 = convert_df2w(%2):chop")
4012479540fSTaylor Simpson FUNC_P_OP_P(conv_df2ud_chop, "%0 = convert_df2ud(%2):chop")
4022479540fSTaylor Simpson FUNC_P_OP_P(conv_df2d_chop, "%0 = convert_df2d(%2):chop")
4032479540fSTaylor Simpson
4042479540fSTaylor Simpson /* Integer to float conversions */
4052479540fSTaylor Simpson FUNC_R_OP_R(conv_uw2sf, "%0 = convert_uw2sf(%2)")
4062479540fSTaylor Simpson FUNC_R_OP_R(conv_w2sf, "%0 = convert_w2sf(%2)")
4072479540fSTaylor Simpson FUNC_R_OP_P(conv_ud2sf, "%0 = convert_ud2sf(%2)")
4082479540fSTaylor Simpson FUNC_R_OP_P(conv_d2sf, "%0 = convert_d2sf(%2)")
4092479540fSTaylor Simpson
4102479540fSTaylor Simpson /* Special purpose floating point instructions */
4112479540fSTaylor Simpson FUNC_XR_OP_RRp(sffma_sc, "%0 += sfmpy(%2, %3, p2):scale")
4122479540fSTaylor Simpson FUNC_Rp_OP_RR(sfrecipa, "%0, p2 = sfrecipa(%3, %4)")
4132479540fSTaylor Simpson FUNC_R_OP_RR(sffixupn, "%0 = sffixupn(%2, %3)")
4142479540fSTaylor Simpson FUNC_R_OP_RR(sffixupd, "%0 = sffixupd(%2, %3)")
4152479540fSTaylor Simpson FUNC_R_OP_R(sffixupr, "%0 = sffixupr(%2)")
4162479540fSTaylor Simpson FUNC_Rp_OP_R(sfinvsqrta, "%0, p2 = sfinvsqrta(%3)")
4172479540fSTaylor Simpson
4184d04395aSTaylor Simpson /*
4194d04395aSTaylor Simpson * Templates for test cases
4204d04395aSTaylor Simpson *
4214d04395aSTaylor Simpson * Same naming convention as the function templates
4224d04395aSTaylor Simpson */
4234d04395aSTaylor Simpson #define TEST_x_OP_x(RESTYPE, CHECKFN, SRCTYPE, FUNC, SRC, RES, USR_RES) \
4244d04395aSTaylor Simpson do { \
4254d04395aSTaylor Simpson RESTYPE result; \
4264d04395aSTaylor Simpson SRCTYPE src = SRC; \
4274d04395aSTaylor Simpson uint32_t usr_result; \
4284d04395aSTaylor Simpson result = FUNC(src, &usr_result); \
4294d04395aSTaylor Simpson CHECKFN(result, RES); \
4300d57cd61STaylor Simpson check32(usr_result, USR_RES); \
4314d04395aSTaylor Simpson } while (0)
4324d04395aSTaylor Simpson
4334d04395aSTaylor Simpson #define TEST_R_OP_R(FUNC, SRC, RES, USR_RES) \
4344d04395aSTaylor Simpson TEST_x_OP_x(uint32_t, check32, uint32_t, FUNC, SRC, RES, USR_RES)
4354d04395aSTaylor Simpson
4364d04395aSTaylor Simpson #define TEST_R_OP_P(FUNC, SRC, RES, USR_RES) \
4374d04395aSTaylor Simpson TEST_x_OP_x(uint32_t, check32, uint64_t, FUNC, SRC, RES, USR_RES)
4384d04395aSTaylor Simpson
4394d04395aSTaylor Simpson #define TEST_P_OP_P(FUNC, SRC, RES, USR_RES) \
4404d04395aSTaylor Simpson TEST_x_OP_x(uint64_t, check64, uint64_t, FUNC, SRC, RES, USR_RES)
4414d04395aSTaylor Simpson
4424d04395aSTaylor Simpson #define TEST_P_OP_R(FUNC, SRC, RES, USR_RES) \
4434d04395aSTaylor Simpson TEST_x_OP_x(uint64_t, check64, uint32_t, FUNC, SRC, RES, USR_RES)
4444d04395aSTaylor Simpson
4454d04395aSTaylor Simpson #define TEST_xp_OP_x(RESTYPE, CHECKFN, SRCTYPE, FUNC, SRC, \
4464d04395aSTaylor Simpson RES, PRED_RES, USR_RES) \
4474d04395aSTaylor Simpson do { \
4484d04395aSTaylor Simpson RESTYPE result; \
4494d04395aSTaylor Simpson SRCTYPE src = SRC; \
4504d04395aSTaylor Simpson uint8_t pred_result; \
4514d04395aSTaylor Simpson uint32_t usr_result; \
4524d04395aSTaylor Simpson result = FUNC(src, &pred_result, &usr_result); \
4534d04395aSTaylor Simpson CHECKFN(result, RES); \
4540d57cd61STaylor Simpson check32(pred_result, PRED_RES); \
4550d57cd61STaylor Simpson check32(usr_result, USR_RES); \
4564d04395aSTaylor Simpson } while (0)
4574d04395aSTaylor Simpson
4584d04395aSTaylor Simpson #define TEST_Rp_OP_R(FUNC, SRC, RES, PRED_RES, USR_RES) \
4594d04395aSTaylor Simpson TEST_xp_OP_x(uint32_t, check32, uint32_t, FUNC, SRC, RES, PRED_RES, USR_RES)
4604d04395aSTaylor Simpson
4614d04395aSTaylor Simpson #define TEST_x_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \
4624d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES) \
4634d04395aSTaylor Simpson do { \
4644d04395aSTaylor Simpson RESTYPE result; \
4654d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
4664d04395aSTaylor Simpson SRC2TYPE src2 = SRC2; \
4674d04395aSTaylor Simpson uint32_t usr_result; \
4684d04395aSTaylor Simpson result = FUNC(src1, src2, &usr_result); \
4694d04395aSTaylor Simpson CHECKFN(result, RES); \
4700d57cd61STaylor Simpson check32(usr_result, USR_RES); \
4714d04395aSTaylor Simpson } while (0)
4724d04395aSTaylor Simpson
4734d04395aSTaylor Simpson #define TEST_P_OP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \
4744d04395aSTaylor Simpson TEST_x_OP_xx(uint64_t, check64, uint64_t, uint64_t, \
4754d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4764d04395aSTaylor Simpson
4774d04395aSTaylor Simpson #define TEST_R_OP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \
4784d04395aSTaylor Simpson TEST_x_OP_xx(uint32_t, check32, uint64_t, uint64_t, \
4794d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4804d04395aSTaylor Simpson
4814d04395aSTaylor Simpson #define TEST_P_OP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \
4824d04395aSTaylor Simpson TEST_x_OP_xx(uint64_t, check64, uint32_t, uint32_t, \
4834d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4844d04395aSTaylor Simpson
4854d04395aSTaylor Simpson #define TEST_R_OP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \
4864d04395aSTaylor Simpson TEST_x_OP_xx(uint32_t, check32, uint32_t, uint32_t, \
4874d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4884d04395aSTaylor Simpson
4894d04395aSTaylor Simpson #define TEST_R_OP_PR(FUNC, SRC1, SRC2, RES, USR_RES) \
4904d04395aSTaylor Simpson TEST_x_OP_xx(uint32_t, check32, uint64_t, uint32_t, \
4914d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4924d04395aSTaylor Simpson
4934d04395aSTaylor Simpson #define TEST_P_OP_PR(FUNC, SRC1, SRC2, RES, USR_RES) \
4944d04395aSTaylor Simpson TEST_x_OP_xx(uint64_t, check64, uint64_t, uint32_t, \
4954d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
4964d04395aSTaylor Simpson
4974d04395aSTaylor Simpson #define TEST_xp_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, FUNC, SRC1, SRC2, \
4984d04395aSTaylor Simpson RES, PRED_RES, USR_RES) \
4994d04395aSTaylor Simpson do { \
5004d04395aSTaylor Simpson RESTYPE result; \
5014d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
5024d04395aSTaylor Simpson SRC2TYPE src2 = SRC2; \
5034d04395aSTaylor Simpson uint8_t pred_result; \
5044d04395aSTaylor Simpson uint32_t usr_result; \
5054d04395aSTaylor Simpson result = FUNC(src1, src2, &pred_result, &usr_result); \
5064d04395aSTaylor Simpson CHECKFN(result, RES); \
5070d57cd61STaylor Simpson check32(pred_result, PRED_RES); \
5080d57cd61STaylor Simpson check32(usr_result, USR_RES); \
5094d04395aSTaylor Simpson } while (0)
5104d04395aSTaylor Simpson
5114d04395aSTaylor Simpson #define TEST_Rp_OP_RR(FUNC, SRC1, SRC2, RES, PRED_RES, USR_RES) \
5124d04395aSTaylor Simpson TEST_xp_OP_xx(uint32_t, check32, uint32_t, uint32_t, FUNC, SRC1, SRC2, \
5134d04395aSTaylor Simpson RES, PRED_RES, USR_RES)
5144d04395aSTaylor Simpson
5154d04395aSTaylor Simpson #define TEST_x_OP_xI(RESTYPE, CHECKFN, SRC1TYPE, \
5164d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES) \
5174d04395aSTaylor Simpson do { \
5184d04395aSTaylor Simpson RESTYPE result; \
5194d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
5204d04395aSTaylor Simpson uint32_t src2 = SRC2; \
5214d04395aSTaylor Simpson uint32_t usr_result; \
5224d04395aSTaylor Simpson result = FUNC(src1, src2, &usr_result); \
5234d04395aSTaylor Simpson CHECKFN(result, RES); \
5240d57cd61STaylor Simpson check32(usr_result, USR_RES); \
5254d04395aSTaylor Simpson } while (0)
5264d04395aSTaylor Simpson
5274d04395aSTaylor Simpson #define TEST_R_OP_RI(FUNC, SRC1, SRC2, RES, USR_RES) \
5284d04395aSTaylor Simpson TEST_x_OP_xI(uint32_t, check32, uint32_t, \
5294d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
5304d04395aSTaylor Simpson
5314d04395aSTaylor Simpson #define TEST_R_OP_PI(FUNC, SRC1, SRC2, RES, USR_RES) \
5324d04395aSTaylor Simpson TEST_x_OP_xI(uint32_t, check64, uint64_t, \
5334d04395aSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES)
5344d04395aSTaylor Simpson
5354d04395aSTaylor Simpson #define TEST_Xx_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \
5364d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \
5374d04395aSTaylor Simpson do { \
5384d04395aSTaylor Simpson RESTYPE result = RESIN; \
5394d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
5404d04395aSTaylor Simpson SRC2TYPE src2 = SRC2; \
5414d04395aSTaylor Simpson uint32_t usr_result; \
5424d04395aSTaylor Simpson result = FUNC(result, src1, src2, &usr_result); \
5434d04395aSTaylor Simpson CHECKFN(result, RES); \
5440d57cd61STaylor Simpson check32(usr_result, USR_RES); \
5454d04395aSTaylor Simpson } while (0)
5464d04395aSTaylor Simpson
5474d04395aSTaylor Simpson #define TEST_XR_OP_RR(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \
5484d04395aSTaylor Simpson TEST_Xx_OP_xx(uint32_t, check32, uint32_t, uint32_t, \
5494d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, RES, USR_RES)
5504d04395aSTaylor Simpson
5514d04395aSTaylor Simpson #define TEST_XP_OP_PP(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \
5524d04395aSTaylor Simpson TEST_Xx_OP_xx(uint64_t, check64, uint64_t, uint64_t, \
5534d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, RES, USR_RES)
5544d04395aSTaylor Simpson
5554d04395aSTaylor Simpson #define TEST_XP_OP_RR(FUNC, RESIN, SRC1, SRC2, RES, USR_RES) \
5564d04395aSTaylor Simpson TEST_Xx_OP_xx(uint64_t, check64, uint32_t, uint32_t, \
5574d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, RES, USR_RES)
5584d04395aSTaylor Simpson
5594d04395aSTaylor Simpson #define TEST_Xxp_OP_xx(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \
5604d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, RES, PRED_RES, USR_RES) \
5614d04395aSTaylor Simpson do { \
5624d04395aSTaylor Simpson RESTYPE result = RESIN; \
5634d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
5644d04395aSTaylor Simpson SRC2TYPE src2 = SRC2; \
5654d04395aSTaylor Simpson uint8_t pred_res; \
5664d04395aSTaylor Simpson uint32_t usr_result; \
5674d04395aSTaylor Simpson result = FUNC(result, src1, src2, &pred_res, &usr_result); \
5684d04395aSTaylor Simpson CHECKFN(result, RES); \
5690d57cd61STaylor Simpson check32(usr_result, USR_RES); \
5704d04395aSTaylor Simpson } while (0)
5714d04395aSTaylor Simpson
5724d04395aSTaylor Simpson #define TEST_XPp_OP_PP(FUNC, RESIN, SRC1, SRC2, RES, PRED_RES, USR_RES) \
5734d04395aSTaylor Simpson TEST_Xxp_OP_xx(uint64_t, check64, uint64_t, uint64_t, FUNC, RESIN, SRC1, SRC2, \
5744d04395aSTaylor Simpson RES, PRED_RES, USR_RES)
5754d04395aSTaylor Simpson
5764d04395aSTaylor Simpson #define TEST_Xx_OP_xxp(RESTYPE, CHECKFN, SRC1TYPE, SRC2TYPE, \
5774d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES) \
5784d04395aSTaylor Simpson do { \
5794d04395aSTaylor Simpson RESTYPE result = RESIN; \
5804d04395aSTaylor Simpson SRC1TYPE src1 = SRC1; \
5814d04395aSTaylor Simpson SRC2TYPE src2 = SRC2; \
5824d04395aSTaylor Simpson uint8_t pred = PRED; \
5834d04395aSTaylor Simpson uint32_t usr_result; \
5844d04395aSTaylor Simpson result = FUNC(result, src1, src2, pred, &usr_result); \
5854d04395aSTaylor Simpson CHECKFN(result, RES); \
5860d57cd61STaylor Simpson check32(usr_result, USR_RES); \
5874d04395aSTaylor Simpson } while (0)
5884d04395aSTaylor Simpson
5894d04395aSTaylor Simpson #define TEST_XR_OP_RRp(FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES) \
5904d04395aSTaylor Simpson TEST_Xx_OP_xxp(uint32_t, check32, uint32_t, uint32_t, \
5914d04395aSTaylor Simpson FUNC, RESIN, SRC1, SRC2, PRED, RES, USR_RES)
5924d04395aSTaylor Simpson
5932479540fSTaylor Simpson #define TEST_CMP_xx(SRC1TYPE, SRC2TYPE, \
5942479540fSTaylor Simpson FUNC, SRC1, SRC2, RES, USR_RES) \
5952479540fSTaylor Simpson do { \
5962479540fSTaylor Simpson uint32_t result; \
5972479540fSTaylor Simpson SRC1TYPE src1 = SRC1; \
5982479540fSTaylor Simpson SRC2TYPE src2 = SRC2; \
5992479540fSTaylor Simpson uint32_t usr_result; \
6002479540fSTaylor Simpson result = FUNC(src1, src2, &usr_result); \
6010d57cd61STaylor Simpson check32(result, RES); \
6020d57cd61STaylor Simpson check32(usr_result, USR_RES); \
6032479540fSTaylor Simpson } while (0)
6042479540fSTaylor Simpson
6052479540fSTaylor Simpson #define TEST_CMP_RR(FUNC, SRC1, SRC2, RES, USR_RES) \
6062479540fSTaylor Simpson TEST_CMP_xx(uint32_t, uint32_t, FUNC, SRC1, SRC2, RES, USR_RES)
6072479540fSTaylor Simpson
6082479540fSTaylor Simpson #define TEST_CMP_PP(FUNC, SRC1, SRC2, RES, USR_RES) \
6092479540fSTaylor Simpson TEST_CMP_xx(uint64_t, uint64_t, FUNC, SRC1, SRC2, RES, USR_RES)
6102479540fSTaylor Simpson
main()6114d04395aSTaylor Simpson int main()
6124d04395aSTaylor Simpson {
6134d04395aSTaylor Simpson TEST_R_OP_R(satub, 0, 0, USR_CLEAR);
6144d04395aSTaylor Simpson TEST_R_OP_R(satub, 0xff, 0xff, USR_CLEAR);
6154d04395aSTaylor Simpson TEST_R_OP_R(satub, 0xfff, 0xff, USR_OVF);
6164d04395aSTaylor Simpson TEST_R_OP_R(satub, -1, 0, USR_OVF);
6174d04395aSTaylor Simpson
6184d04395aSTaylor Simpson TEST_P_OP_PP(vaddubs, 0xfeLL, 0x01LL, 0xffLL, USR_CLEAR);
6194d04395aSTaylor Simpson TEST_P_OP_PP(vaddubs, 0xffLL, 0xffLL, 0xffLL, USR_OVF);
6204d04395aSTaylor Simpson
6214d04395aSTaylor Simpson TEST_P_OP_PP(vadduhs, 0xfffeLL, 0x1LL, 0xffffLL, USR_CLEAR);
6224d04395aSTaylor Simpson TEST_P_OP_PP(vadduhs, 0xffffLL, 0x1LL, 0xffffLL, USR_OVF);
6234d04395aSTaylor Simpson
6244d04395aSTaylor Simpson TEST_P_OP_PP(vsububs, 0x0807060504030201LL, 0x0101010101010101LL,
6254d04395aSTaylor Simpson 0x0706050403020100LL, USR_CLEAR);
6264d04395aSTaylor Simpson TEST_P_OP_PP(vsububs, 0x0807060504030201LL, 0x0202020202020202LL,
6274d04395aSTaylor Simpson 0x0605040302010000LL, USR_OVF);
6284d04395aSTaylor Simpson
6294d04395aSTaylor Simpson TEST_P_OP_PP(vsubuhs, 0x0004000300020001LL, 0x0001000100010001LL,
6304d04395aSTaylor Simpson 0x0003000200010000LL, USR_CLEAR);
6314d04395aSTaylor Simpson TEST_P_OP_PP(vsubuhs, 0x0004000300020001LL, 0x0002000200020002LL,
6324d04395aSTaylor Simpson 0x0002000100000000LL, USR_OVF);
6334d04395aSTaylor Simpson
6344d04395aSTaylor Simpson TEST_R_OP_PP(vaddhubs, 0x0004000300020001LL, 0x0001000100010001LL,
6354d04395aSTaylor Simpson 0x05040302, USR_CLEAR);
6364d04395aSTaylor Simpson TEST_R_OP_PP(vaddhubs, 0x7fff000300020001LL, 0x0002000200020002LL,
6374d04395aSTaylor Simpson 0xff050403, USR_OVF);
6384d04395aSTaylor Simpson
6394d04395aSTaylor Simpson TEST_R_OP_P(vsathub, 0x0001000300020001LL, 0x01030201, USR_CLEAR);
6404d04395aSTaylor Simpson TEST_R_OP_P(vsathub, 0x010000700080ffffLL, 0xff708000, USR_OVF);
6414d04395aSTaylor Simpson
6424d04395aSTaylor Simpson TEST_R_OP_P(vsatwuh, 0x0000ffff00000001LL, 0xffff0001, USR_CLEAR);
6434d04395aSTaylor Simpson TEST_R_OP_P(vsatwuh, 0x800000000000ffffLL, 0x0000ffff, USR_OVF);
6444d04395aSTaylor Simpson
6454d04395aSTaylor Simpson TEST_P_OP_P(vsatwuh_nopack, 0x0000ffff00000001LL, 0x0000ffff00000001LL,
6464d04395aSTaylor Simpson USR_CLEAR);
6474d04395aSTaylor Simpson TEST_P_OP_P(vsatwuh_nopack, 0x800000000000ffffLL, 0x000000000000ffffLL,
6484d04395aSTaylor Simpson USR_OVF);
6494d04395aSTaylor Simpson
6504d04395aSTaylor Simpson TEST_R_OP_R(svsathub, 0x00020001, 0x0201, USR_CLEAR);
6514d04395aSTaylor Simpson TEST_R_OP_R(svsathub, 0x0080ffff, 0x8000, USR_OVF);
6524d04395aSTaylor Simpson
6534d04395aSTaylor Simpson TEST_R_OP_PI(asrhub_sat, 0x004f003f002f001fLL, 3, 0x09070503,
6544d04395aSTaylor Simpson USR_CLEAR);
6554d04395aSTaylor Simpson TEST_R_OP_PI(asrhub_sat, 0x004fffff8fff001fLL, 3, 0x09000003,
6564d04395aSTaylor Simpson USR_OVF);
6574d04395aSTaylor Simpson
6584d04395aSTaylor Simpson TEST_R_OP_PI(asrhub_rnd_sat, 0x004f003f002f001fLL, 2, 0x0a080604,
6594d04395aSTaylor Simpson USR_CLEAR);
6604d04395aSTaylor Simpson TEST_R_OP_PI(asrhub_rnd_sat, 0x004fffff8fff001fLL, 2, 0x0a000004,
6614d04395aSTaylor Simpson USR_OVF);
6624d04395aSTaylor Simpson
6634d04395aSTaylor Simpson TEST_R_OP_RR(addsat, 1, 2, 3,
6644d04395aSTaylor Simpson USR_CLEAR);
6654d04395aSTaylor Simpson TEST_R_OP_RR(addsat, 0x7fffffff, 0x00000010, 0x7fffffff,
6664d04395aSTaylor Simpson USR_OVF);
6674d04395aSTaylor Simpson TEST_R_OP_RR(addsat, 0x80000000, 0x80000006, 0x80000000,
6684d04395aSTaylor Simpson USR_OVF);
6694d04395aSTaylor Simpson
6704d04395aSTaylor Simpson TEST_P_OP_PP(addpsat, 1LL, 2LL, 3LL, USR_CLEAR);
6714d04395aSTaylor Simpson /* overflow to max positive */
6724d04395aSTaylor Simpson TEST_P_OP_PP(addpsat, 0x7ffffffffffffff0LL, 0x0000000000000010LL,
6734d04395aSTaylor Simpson 0x7fffffffffffffffLL, USR_OVF);
6744d04395aSTaylor Simpson /* overflow to min negative */
6754d04395aSTaylor Simpson TEST_P_OP_PP(addpsat, 0x8000000000000003LL, 0x8000000000000006LL,
6764d04395aSTaylor Simpson 0x8000000000000000LL, USR_OVF);
6774d04395aSTaylor Simpson
6784d04395aSTaylor Simpson TEST_XR_OP_RR(mpy_acc_sat_hh_s0, 0x7fffffff, 0xffff0000, 0x11110000,
6794d04395aSTaylor Simpson 0x7fffeeee, USR_CLEAR);
6804d04395aSTaylor Simpson TEST_XR_OP_RR(mpy_acc_sat_hh_s0, 0x7fffffff, 0x7fff0000, 0x7fff0000,
6814d04395aSTaylor Simpson 0x7fffffff, USR_OVF);
6824d04395aSTaylor Simpson
6834d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_hh_s1, 0xffff0000, 0x11110000, 0xffffddde,
6844d04395aSTaylor Simpson USR_CLEAR);
6854d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_hh_s1, 0x7fff0000, 0x7fff0000, 0x7ffe0002,
6864d04395aSTaylor Simpson USR_CLEAR);
6874d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_hh_s1, 0x80000000, 0x80000000, 0x7fffffff,
6884d04395aSTaylor Simpson USR_OVF);
6894d04395aSTaylor Simpson
6904d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0xffff0000, 0x11110000, 0x00005dde,
6914d04395aSTaylor Simpson USR_CLEAR);
6924d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0x7fff0000, 0x7fff0000, 0x7ffe8002,
6934d04395aSTaylor Simpson USR_CLEAR);
6944d04395aSTaylor Simpson TEST_R_OP_RR(mpy_sat_rnd_hh_s1, 0x80000000, 0x80000000, 0x7fffffff,
6954d04395aSTaylor Simpson USR_OVF);
6964d04395aSTaylor Simpson
6974d04395aSTaylor Simpson TEST_R_OP_RR(mpy_up_s1_sat, 0xffff0000, 0x11110000, 0xffffddde,
6984d04395aSTaylor Simpson USR_CLEAR);
6994d04395aSTaylor Simpson TEST_R_OP_RR(mpy_up_s1_sat, 0x7fff0000, 0x7fff0000, 0x7ffe0002,
7004d04395aSTaylor Simpson USR_CLEAR);
7014d04395aSTaylor Simpson TEST_R_OP_RR(mpy_up_s1_sat, 0x80000000, 0x80000000, 0x7fffffff,
7024d04395aSTaylor Simpson USR_OVF);
7034d04395aSTaylor Simpson
7044d04395aSTaylor Simpson TEST_P_OP_RR(vmpy2s_s1, 0x7fff0000, 0x7fff0000, 0x7ffe000200000000LL,
7054d04395aSTaylor Simpson USR_CLEAR);
7064d04395aSTaylor Simpson TEST_P_OP_RR(vmpy2s_s1, 0x80000000, 0x80000000, 0x7fffffff00000000LL,
7074d04395aSTaylor Simpson USR_OVF);
7084d04395aSTaylor Simpson
7094d04395aSTaylor Simpson TEST_P_OP_RR(vmpy2su_s1, 0x7fff0000, 0x7fff0000, 0x7ffe000200000000LL,
7104d04395aSTaylor Simpson USR_CLEAR);
7114d04395aSTaylor Simpson TEST_P_OP_RR(vmpy2su_s1, 0xffffbd97, 0xffffffff, 0xfffe000280000000LL,
7124d04395aSTaylor Simpson USR_OVF);
7134d04395aSTaylor Simpson
7144d04395aSTaylor Simpson TEST_R_OP_RR(vmpy2s_s1pack, 0x7fff0000, 0x7fff0000, 0x7ffe0000,
7154d04395aSTaylor Simpson USR_CLEAR);
7164d04395aSTaylor Simpson TEST_R_OP_RR(vmpy2s_s1pack, 0x80008000, 0x80008000, 0x7fff7fff,
7174d04395aSTaylor Simpson USR_OVF);
7184d04395aSTaylor Simpson
7194d04395aSTaylor Simpson TEST_P_OP_PP(vmpy2es_s1, 0x7fff7fff7fff7fffLL, 0x1fff1fff1fff1fffLL,
7204d04395aSTaylor Simpson 0x1ffec0021ffec002LL, USR_CLEAR);
7214d04395aSTaylor Simpson TEST_P_OP_PP(vmpy2es_s1, 0x8000800080008000LL, 0x8000800080008000LL,
7224d04395aSTaylor Simpson 0x7fffffff7fffffffLL, USR_OVF);
7234d04395aSTaylor Simpson
7244d04395aSTaylor Simpson TEST_R_OP_PP(vdmpyrs_s1, 0x7fff7fff7fff7fffLL, 0x1fff1fff1fff1fffLL,
7254d04395aSTaylor Simpson 0x3ffe3ffe, USR_CLEAR);
7264d04395aSTaylor Simpson TEST_R_OP_PP(vdmpyrs_s1, 0x8000800080008000LL, 0x8000800080008000LL,
7274d04395aSTaylor Simpson 0x7fff7fffLL, USR_OVF);
7284d04395aSTaylor Simpson
7294d04395aSTaylor Simpson TEST_XP_OP_PP(vdmacs_s0, 0x0fffffffULL, 0x00ff00ff00ff00ffLL,
7304d04395aSTaylor Simpson 0x00ff00ff00ff00ffLL, 0x0001fc021001fc01LL, USR_CLEAR);
7314d04395aSTaylor Simpson TEST_XP_OP_PP(vdmacs_s0, 0x01111111ULL, 0x8000800080001000LL,
7324d04395aSTaylor Simpson 0x8000800080008000LL, 0x7fffffff39111111LL, USR_OVF);
7334d04395aSTaylor Simpson
7344d04395aSTaylor Simpson TEST_R_OP_RR(cmpyrs_s0, 0x7fff0000, 0x7fff0000, 0x0000c001,
7354d04395aSTaylor Simpson USR_CLEAR);
7364d04395aSTaylor Simpson TEST_R_OP_RR(cmpyrs_s0, 0x80008000, 0x80008000, 0x7fff0000,
7374d04395aSTaylor Simpson USR_OVF);
7384d04395aSTaylor Simpson
7394d04395aSTaylor Simpson TEST_XP_OP_RR(cmacs_s0, 0x0fffffff, 0x7fff0000, 0x7fff0000,
7404d04395aSTaylor Simpson 0x00000000d000fffeLL, USR_CLEAR);
7414d04395aSTaylor Simpson TEST_XP_OP_RR(cmacs_s0, 0x0fff1111, 0x80008000, 0x80008000,
7424d04395aSTaylor Simpson 0x7fffffff0fff1111LL, USR_OVF);
7434d04395aSTaylor Simpson
7444d04395aSTaylor Simpson TEST_XP_OP_RR(cnacs_s0, 0x000000108fffffffULL, 0x7fff0000, 0x7fff0000,
7454d04395aSTaylor Simpson 0x00000010cfff0000ULL, USR_CLEAR);
7464d04395aSTaylor Simpson TEST_XP_OP_RR(cnacs_s0, 0x000000108ff1111fULL, 0x00002001, 0x00007ffd,
7474d04395aSTaylor Simpson 0x0000001080000000ULL, USR_OVF);
7484d04395aSTaylor Simpson
7494d04395aSTaylor Simpson TEST_P_OP_PP(vrcmpys_s1_h, 0x00ff00ff00ff00ffLL, 0x00ff00ff00ff00ffLL,
7504d04395aSTaylor Simpson 0x0003f8040003f804LL, USR_CLEAR);
7514d04395aSTaylor Simpson TEST_P_OP_PP(vrcmpys_s1_h, 0x8000800080008000LL, 0x8000800080008000LL,
7524d04395aSTaylor Simpson 0x7fffffff7fffffffLL, USR_OVF);
7534d04395aSTaylor Simpson
7544d04395aSTaylor Simpson TEST_XP_OP_PP(mmacls_s0, 0x6fffffff, 0x00ff00ff00ff00ffLL,
7554d04395aSTaylor Simpson 0x00ff00ff00ff00ffLL, 0x0000fe017000fe00LL, USR_CLEAR);
7564d04395aSTaylor Simpson TEST_XP_OP_PP(mmacls_s0, 0x6f1111ff, 0x8000800080008000LL,
7574d04395aSTaylor Simpson 0x1000100080008000LL, 0xf80008007fffffffLL, USR_OVF);
7584d04395aSTaylor Simpson
7594d04395aSTaylor Simpson TEST_R_OP_RR(hmmpyl_rs1, 0x7fff0000, 0x7fff0001, 0x0000fffe,
7604d04395aSTaylor Simpson USR_CLEAR);
7614d04395aSTaylor Simpson TEST_R_OP_RR(hmmpyl_rs1, 0x80000000, 0x80008000, 0x7fffffff,
7624d04395aSTaylor Simpson USR_OVF);
7634d04395aSTaylor Simpson
7644d04395aSTaylor Simpson TEST_XP_OP_PP(mmaculs_s0, 0x000000007fffffffULL, 0xffff800080008000LL,
7654d04395aSTaylor Simpson 0xffff800080008000LL, 0xffffc00040003fffLL, USR_CLEAR);
7664d04395aSTaylor Simpson TEST_XP_OP_PP(mmaculs_s0, 0x000011107fffffffULL, 0x00ff00ff00ff00ffLL,
7674d04395aSTaylor Simpson 0x00ff00ff001100ffLL, 0x00010f117fffffffLL, USR_OVF);
7684d04395aSTaylor Simpson
7694d04395aSTaylor Simpson TEST_R_OP_PR(cmpyi_wh, 0x7fff000000000000LL, 0x7fff0001, 0x0000fffe,
7704d04395aSTaylor Simpson USR_CLEAR);
7714d04395aSTaylor Simpson TEST_R_OP_PR(cmpyi_wh, 0x8000000000000000LL, 0x80008000, 0x7fffffff,
7724d04395aSTaylor Simpson USR_OVF);
7734d04395aSTaylor Simpson
7744d04395aSTaylor Simpson TEST_P_OP_PP(vcmpy_s0_sat_i, 0x00ff00ff00ff00ffLL, 0x00ff00ff00ff00ffLL,
7754d04395aSTaylor Simpson 0x0001fc020001fc02LL, USR_CLEAR);
7764d04395aSTaylor Simpson TEST_P_OP_PP(vcmpy_s0_sat_i, 0x8000800080008000LL, 0x8000800080008000LL,
7774d04395aSTaylor Simpson 0x7fffffff7fffffffLL, USR_OVF);
7784d04395aSTaylor Simpson
7794d04395aSTaylor Simpson TEST_P_OP_PR(vcrotate, 0x8000000000000000LL, 0x00000002,
7804d04395aSTaylor Simpson 0x8000000000000000LL, USR_CLEAR);
7814d04395aSTaylor Simpson TEST_P_OP_PR(vcrotate, 0x7fff80007fff8000LL, 0x00000001,
7824d04395aSTaylor Simpson 0x7fff80007fff7fffLL, USR_OVF);
7834d04395aSTaylor Simpson
7844d04395aSTaylor Simpson TEST_P_OP_PR(vcnegh, 0x8000000000000000LL, 0x00000002,
7854d04395aSTaylor Simpson 0x8000000000000000LL, USR_CLEAR);
7864d04395aSTaylor Simpson TEST_P_OP_PR(vcnegh, 0x7fff80007fff8000LL, 0x00000001,
7874d04395aSTaylor Simpson 0x7fff80007fff7fffLL, USR_OVF);
7884d04395aSTaylor Simpson
7894d04395aSTaylor Simpson #if CORE_HAS_AUDIO
7904d04395aSTaylor Simpson TEST_R_OP_PP(wcmpyrw, 0x8765432101234567LL, 0x00000002ffffffffLL,
7914d04395aSTaylor Simpson 0x00000001, USR_CLEAR);
7924d04395aSTaylor Simpson TEST_R_OP_PP(wcmpyrw, 0x800000007fffffffLL, 0x000000ff7fffffffLL,
7934d04395aSTaylor Simpson 0x7fffffff, USR_OVF);
7944d04395aSTaylor Simpson TEST_R_OP_PP(wcmpyrw, 0x7fffffff80000000LL, 0x7fffffff000000ffLL,
7954d04395aSTaylor Simpson 0x80000000, USR_OVF);
7964d04395aSTaylor Simpson #else
7974d04395aSTaylor Simpson printf("Audio instructions skipped\n");
7984d04395aSTaylor Simpson #endif
7994d04395aSTaylor Simpson
8004d04395aSTaylor Simpson TEST_R_OP_RR(addh_l16_sat_ll, 0x0000ffff, 0x00000002, 0x00000001,
8014d04395aSTaylor Simpson USR_CLEAR);
8024d04395aSTaylor Simpson TEST_R_OP_RR(addh_l16_sat_ll, 0x00007fff, 0x00000005, 0x00007fff,
8034d04395aSTaylor Simpson USR_OVF);
8044d04395aSTaylor Simpson TEST_R_OP_RR(addh_l16_sat_ll, 0x00008000, 0x00008000, 0xffff8000,
8054d04395aSTaylor Simpson USR_OVF);
8064d04395aSTaylor Simpson
8074d04395aSTaylor Simpson TEST_P_OP_P(vconj, 0x0000ffff00000001LL, 0x0000ffff00000001LL, USR_CLEAR);
8084d04395aSTaylor Simpson TEST_P_OP_P(vconj, 0x800000000000ffffLL, 0x7fff00000000ffffLL, USR_OVF);
8094d04395aSTaylor Simpson
8104d04395aSTaylor Simpson TEST_P_OP_PP(vxaddsubw, 0x8765432101234567LL, 0x00000002ffffffffLL,
8114d04395aSTaylor Simpson 0x8765432201234569LL, USR_CLEAR);
8124d04395aSTaylor Simpson TEST_P_OP_PP(vxaddsubw, 0x7fffffff7fffffffLL, 0xffffffffffffffffLL,
8134d04395aSTaylor Simpson 0x7fffffff7ffffffeLL, USR_OVF);
8144d04395aSTaylor Simpson TEST_P_OP_PP(vxaddsubw, 0x800000000fffffffLL, 0x0000000a00000008LL,
8154d04395aSTaylor Simpson 0x8000000010000009LL, USR_OVF);
8164d04395aSTaylor Simpson
8174d04395aSTaylor Simpson TEST_P_OP_P(vabshsat, 0x0001000afffff800LL, 0x0001000a00010800LL,
8184d04395aSTaylor Simpson USR_CLEAR);
8194d04395aSTaylor Simpson TEST_P_OP_P(vabshsat, 0x8000000b000c000aLL, 0x7fff000b000c000aLL,
8204d04395aSTaylor Simpson USR_OVF);
8214d04395aSTaylor Simpson
8224d04395aSTaylor Simpson TEST_P_OP_PP(vnavgwr, 0x8765432101234567LL, 0x00000002ffffffffLL,
8234d04395aSTaylor Simpson 0xc3b2a1900091a2b4LL, USR_CLEAR);
8244d04395aSTaylor Simpson TEST_P_OP_PP(vnavgwr, 0x7fffffff8000000aLL, 0x80000000ffffffffLL,
8254d04395aSTaylor Simpson 0x7fffffffc0000006LL, USR_OVF);
8264d04395aSTaylor Simpson
8274d04395aSTaylor Simpson TEST_R_OP_RI(round_ri_sat, 0x0000ffff, 2, 0x00004000, USR_CLEAR);
8284d04395aSTaylor Simpson TEST_R_OP_RI(round_ri_sat, 0x7fffffff, 2, 0x1fffffff, USR_OVF);
8294d04395aSTaylor Simpson
8308e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0x0000ffff, 0x02, 0x00003fff, USR_CLEAR);
8318e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0x80000000, 0x01, 0xc0000000, USR_CLEAR);
8328e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0xffffffff, 0x01, 0xffffffff, USR_CLEAR);
8338e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0x00ffffff, 0xf5, 0x7fffffff, USR_OVF);
8348e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0x80000000, 0xf5, 0x80000000, USR_OVF);
8358e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0x7fff0000, 0x42, 0x7fffffff, USR_OVF);
8368e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0xff000000, 0x42, 0x80000000, USR_OVF);
8378e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 4096, 32, 0x00000000, USR_CLEAR);
8388e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 4096, -32, 0x7fffffff, USR_OVF);
8398e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, -4096, 32, 0xffffffff, USR_CLEAR);
8408e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, -4096, -32, 0x80000000, USR_OVF);
8418e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 0, -32, 0x00000000, USR_CLEAR);
8428e8a85c1STaylor Simpson TEST_R_OP_RR(asr_r_r_sat, 1, -32, 0x7fffffff, USR_OVF);
8438e8a85c1STaylor Simpson
8448e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0x00000000, 0x40, 0x00000000, USR_CLEAR);
8458e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0x80000000, 0xff, 0xc0000000, USR_CLEAR);
8468e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0xffffffff, 0xff, 0xffffffff, USR_CLEAR);
8478e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0x00ffffff, 0x0b, 0x7fffffff, USR_OVF);
8488e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0x80000000, 0x0b, 0x80000000, USR_OVF);
8498e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0x7fff0000, 0xbe, 0x7fffffff, USR_OVF);
8508e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0xff000000, 0xbe, 0x80000000, USR_OVF);
8518e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 4096, 32, 0x7fffffff, USR_OVF);
8528e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 4096, -32, 0x00000000, USR_CLEAR);
8538e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, -4096, 32, 0x80000000, USR_OVF);
8548e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, -4096, -32, 0xffffffff, USR_CLEAR);
8558e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 0, 32, 0x00000000, USR_CLEAR);
8568e8a85c1STaylor Simpson TEST_R_OP_RR(asl_r_r_sat, 1, 32, 0x7fffffff, USR_OVF);
8574d04395aSTaylor Simpson
8584d04395aSTaylor Simpson TEST_XPp_OP_PP(ACS, 0x0004000300020001ULL, 0x0001000200030004ULL,
8594d04395aSTaylor Simpson 0x0000000000000000ULL, 0x0004000300030004ULL, 0xf0,
8604d04395aSTaylor Simpson USR_CLEAR);
8614d04395aSTaylor Simpson TEST_XPp_OP_PP(ACS, 0x0004000300020001ULL, 0x0001000200030004ULL,
8624d04395aSTaylor Simpson 0x000affff000d0000ULL, 0x000e0003000f0004ULL, 0xcc,
8634d04395aSTaylor Simpson USR_CLEAR);
8644d04395aSTaylor Simpson TEST_XPp_OP_PP(ACS, 0x00047fff00020001ULL, 0x00017fff00030004ULL,
8654d04395aSTaylor Simpson 0x000a0fff000d0000ULL, 0x000e7fff000f0004ULL, 0xfc,
8664d04395aSTaylor Simpson USR_OVF);
8674d04395aSTaylor Simpson TEST_XPp_OP_PP(ACS, 0x00047fff00020001ULL, 0x00017fff00030004ULL,
8684d04395aSTaylor Simpson 0x000a0fff000d0000ULL, 0x000e7fff000f0004ULL, 0xf0,
8694d04395aSTaylor Simpson USR_OVF);
8704d04395aSTaylor Simpson
8712479540fSTaylor Simpson /* Floating point */
8722479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_one, SF_small_neg, SF_small_neg, USR_CLEAR);
8732479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_one, SF_SNaN, SF_one, USR_FPINVF);
8742479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_SNaN, SF_one, SF_one, USR_FPINVF);
8752479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_one, SF_QNaN, SF_one, USR_CLEAR);
8762479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_QNaN, SF_one, SF_one, USR_CLEAR);
8772479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
8782479540fSTaylor Simpson TEST_R_OP_RR(sfmin, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
8798888ee42SMatheus Tavares Bernardino TEST_R_OP_RR(sfmin, SF_zero, SF_zero_neg, SF_zero_neg, USR_CLEAR);
8808888ee42SMatheus Tavares Bernardino TEST_R_OP_RR(sfmin, SF_zero_neg, SF_zero, SF_zero_neg, USR_CLEAR);
8812479540fSTaylor Simpson
8822479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_one, SF_small_neg, SF_one, USR_CLEAR);
8832479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_one, SF_SNaN, SF_one, USR_FPINVF);
8842479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_SNaN, SF_one, SF_one, USR_FPINVF);
8852479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_one, SF_QNaN, SF_one, USR_CLEAR);
8862479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_QNaN, SF_one, SF_one, USR_CLEAR);
8872479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
8882479540fSTaylor Simpson TEST_R_OP_RR(sfmax, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
8898888ee42SMatheus Tavares Bernardino TEST_R_OP_RR(sfmax, SF_zero, SF_zero_neg, SF_zero, USR_CLEAR);
8908888ee42SMatheus Tavares Bernardino TEST_R_OP_RR(sfmax, SF_zero_neg, SF_zero, SF_zero, USR_CLEAR);
8912479540fSTaylor Simpson
8922479540fSTaylor Simpson TEST_R_OP_RR(sfadd, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
8932479540fSTaylor Simpson TEST_R_OP_RR(sfadd, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
8942479540fSTaylor Simpson TEST_R_OP_RR(sfadd, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
8952479540fSTaylor Simpson TEST_R_OP_RR(sfadd, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
8962479540fSTaylor Simpson
8972479540fSTaylor Simpson TEST_R_OP_RR(sfsub, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
8982479540fSTaylor Simpson TEST_R_OP_RR(sfsub, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
8992479540fSTaylor Simpson TEST_R_OP_RR(sfsub, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9002479540fSTaylor Simpson TEST_R_OP_RR(sfsub, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
9012479540fSTaylor Simpson
9022479540fSTaylor Simpson TEST_R_OP_RR(sfmpy, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
9032479540fSTaylor Simpson TEST_R_OP_RR(sfmpy, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9042479540fSTaylor Simpson TEST_R_OP_RR(sfmpy, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9052479540fSTaylor Simpson TEST_R_OP_RR(sfmpy, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
9062479540fSTaylor Simpson
9072479540fSTaylor Simpson TEST_XR_OP_RR(sffma, SF_one, SF_one, SF_one, SF_two, USR_CLEAR);
9082479540fSTaylor Simpson TEST_XR_OP_RR(sffma, SF_zero, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
9092479540fSTaylor Simpson TEST_XR_OP_RR(sffma, SF_zero, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9102479540fSTaylor Simpson TEST_XR_OP_RR(sffma, SF_zero, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9112479540fSTaylor Simpson TEST_XR_OP_RR(sffma, SF_zero, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
9122479540fSTaylor Simpson
9132479540fSTaylor Simpson TEST_XR_OP_RR(sffms, SF_one, SF_one, SF_one, SF_zero, USR_CLEAR);
9142479540fSTaylor Simpson TEST_XR_OP_RR(sffms, SF_zero, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
9152479540fSTaylor Simpson TEST_XR_OP_RR(sffms, SF_zero, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9162479540fSTaylor Simpson TEST_XR_OP_RR(sffms, SF_zero, SF_QNaN, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
9172479540fSTaylor Simpson TEST_XR_OP_RR(sffms, SF_zero, SF_SNaN, SF_QNaN, SF_HEX_NaN, USR_FPINVF);
9182479540fSTaylor Simpson
9192479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_one, SF_large_pos, 0x00, USR_CLEAR);
9202479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_INF, SF_large_pos, 0x00, USR_CLEAR);
9212479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_large_pos, 0xff, USR_CLEAR);
9222479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_QNaN_neg, SF_large_pos, 0xff, USR_CLEAR);
9232479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_SNaN, SF_large_pos, 0xff, USR_FPINVF);
9242479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_SNaN_neg, SF_large_pos, 0xff, USR_FPINVF);
9252479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_QNaN, 0xff, USR_CLEAR);
9262479540fSTaylor Simpson TEST_CMP_RR(sfcmpuo, SF_QNaN, SF_SNaN, 0xff, USR_FPINVF);
9272479540fSTaylor Simpson
9282479540fSTaylor Simpson TEST_CMP_RR(sfcmpeq, SF_one, SF_QNaN, 0x00, USR_CLEAR);
9292479540fSTaylor Simpson TEST_CMP_RR(sfcmpeq, SF_one, SF_SNaN, 0x00, USR_FPINVF);
9302479540fSTaylor Simpson TEST_CMP_RR(sfcmpgt, SF_one, SF_QNaN, 0x00, USR_CLEAR);
9312479540fSTaylor Simpson TEST_CMP_RR(sfcmpgt, SF_one, SF_SNaN, 0x00, USR_FPINVF);
9322479540fSTaylor Simpson TEST_CMP_RR(sfcmpge, SF_one, SF_QNaN, 0x00, USR_CLEAR);
9332479540fSTaylor Simpson TEST_CMP_RR(sfcmpge, SF_one, SF_SNaN, 0x00, USR_FPINVF);
9342479540fSTaylor Simpson
9352479540fSTaylor Simpson TEST_P_OP_PP(dfadd, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR);
9362479540fSTaylor Simpson TEST_P_OP_PP(dfadd, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9372479540fSTaylor Simpson TEST_P_OP_PP(dfadd, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9382479540fSTaylor Simpson TEST_P_OP_PP(dfadd, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF);
9392479540fSTaylor Simpson
9402479540fSTaylor Simpson TEST_P_OP_PP(dfsub, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR);
9412479540fSTaylor Simpson TEST_P_OP_PP(dfsub, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9422479540fSTaylor Simpson TEST_P_OP_PP(dfsub, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9432479540fSTaylor Simpson TEST_P_OP_PP(dfsub, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF);
9442479540fSTaylor Simpson
9452479540fSTaylor Simpson #if CORE_IS_V67
9462479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_any, DF_small_neg, DF_small_neg, USR_CLEAR);
9472479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_any, DF_SNaN, DF_any, USR_FPINVF);
9482479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_SNaN, DF_any, DF_any, USR_FPINVF);
9492479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_any, DF_QNaN, DF_any, USR_CLEAR);
9502479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_QNaN, DF_any, DF_any, USR_CLEAR);
9512479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF);
9522479540fSTaylor Simpson TEST_P_OP_PP(dfmin, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9538888ee42SMatheus Tavares Bernardino TEST_P_OP_PP(dfmin, DF_zero, DF_zero_neg, DF_zero_neg, USR_CLEAR);
9548888ee42SMatheus Tavares Bernardino TEST_P_OP_PP(dfmin, DF_zero_neg, DF_zero, DF_zero_neg, USR_CLEAR);
9552479540fSTaylor Simpson
9562479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_any, DF_small_neg, DF_any, USR_CLEAR);
9572479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_any, DF_SNaN, DF_any, USR_FPINVF);
9582479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_SNaN, DF_any, DF_any, USR_FPINVF);
9592479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_any, DF_QNaN, DF_any, USR_CLEAR);
9602479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_QNaN, DF_any, DF_any, USR_CLEAR);
9612479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF);
9622479540fSTaylor Simpson TEST_P_OP_PP(dfmax, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9638888ee42SMatheus Tavares Bernardino TEST_P_OP_PP(dfmax, DF_zero, DF_zero_neg, DF_zero, USR_CLEAR);
9648888ee42SMatheus Tavares Bernardino TEST_P_OP_PP(dfmax, DF_zero_neg, DF_zero, DF_zero, USR_CLEAR);
9652479540fSTaylor Simpson
9662479540fSTaylor Simpson TEST_XP_OP_PP(dfmpyhh, DF_one, DF_one, DF_one, DF_one_hh, USR_CLEAR);
9672479540fSTaylor Simpson TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_any, DF_QNaN, DF_HEX_NaN, USR_CLEAR);
9682479540fSTaylor Simpson TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_any, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9692479540fSTaylor Simpson TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_QNaN, DF_SNaN, DF_HEX_NaN, USR_FPINVF);
9702479540fSTaylor Simpson TEST_XP_OP_PP(dfmpyhh, DF_zero, DF_SNaN, DF_QNaN, DF_HEX_NaN, USR_FPINVF);
9712479540fSTaylor Simpson #else
9722479540fSTaylor Simpson printf("v67 instructions skipped\n");
9732479540fSTaylor Simpson #endif
9742479540fSTaylor Simpson
9752479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_small_neg, DF_any, 0x00, USR_CLEAR);
9762479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_large_pos, DF_any, 0x00, USR_CLEAR);
9772479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_any, 0xff, USR_CLEAR);
9782479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_QNaN_neg, DF_any, 0xff, USR_CLEAR);
9792479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_SNaN, DF_any, 0xff, USR_FPINVF);
9802479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_SNaN_neg, DF_any, 0xff, USR_FPINVF);
9812479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_QNaN, 0xff, USR_CLEAR);
9822479540fSTaylor Simpson TEST_CMP_PP(dfcmpuo, DF_QNaN, DF_SNaN, 0xff, USR_FPINVF);
9832479540fSTaylor Simpson
9842479540fSTaylor Simpson TEST_CMP_PP(dfcmpeq, DF_any, DF_QNaN, 0x00, USR_CLEAR);
9852479540fSTaylor Simpson TEST_CMP_PP(dfcmpeq, DF_any, DF_SNaN, 0x00, USR_FPINVF);
9862479540fSTaylor Simpson TEST_CMP_PP(dfcmpgt, DF_any, DF_QNaN, 0x00, USR_CLEAR);
9872479540fSTaylor Simpson TEST_CMP_PP(dfcmpgt, DF_any, DF_SNaN, 0x00, USR_FPINVF);
9882479540fSTaylor Simpson TEST_CMP_PP(dfcmpge, DF_any, DF_QNaN, 0x00, USR_CLEAR);
9892479540fSTaylor Simpson TEST_CMP_PP(dfcmpge, DF_any, DF_SNaN, 0x00, USR_FPINVF);
9902479540fSTaylor Simpson
9912479540fSTaylor Simpson TEST_P_OP_R(conv_sf2df, SF_QNaN, DF_HEX_NaN, USR_CLEAR);
9922479540fSTaylor Simpson TEST_P_OP_R(conv_sf2df, SF_SNaN, DF_HEX_NaN, USR_FPINVF);
9932479540fSTaylor Simpson TEST_R_OP_R(conv_sf2uw, SF_QNaN, 0xffffffff, USR_FPINVF);
9942479540fSTaylor Simpson TEST_R_OP_R(conv_sf2uw, SF_SNaN, 0xffffffff, USR_FPINVF);
9952479540fSTaylor Simpson TEST_R_OP_R(conv_sf2w, SF_QNaN, 0xffffffff, USR_FPINVF);
9962479540fSTaylor Simpson TEST_R_OP_R(conv_sf2w, SF_SNaN, 0xffffffff, USR_FPINVF);
9972479540fSTaylor Simpson TEST_P_OP_R(conv_sf2ud, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
9982479540fSTaylor Simpson TEST_P_OP_R(conv_sf2ud, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
9992479540fSTaylor Simpson TEST_P_OP_R(conv_sf2d, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10002479540fSTaylor Simpson TEST_P_OP_R(conv_sf2d, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10012479540fSTaylor Simpson TEST_R_OP_R(conv_sf2uw_chop, SF_QNaN, 0xffffffff, USR_FPINVF);
10022479540fSTaylor Simpson TEST_R_OP_R(conv_sf2uw_chop, SF_SNaN, 0xffffffff, USR_FPINVF);
10032479540fSTaylor Simpson TEST_R_OP_R(conv_sf2w_chop, SF_QNaN, 0xffffffff, USR_FPINVF);
10042479540fSTaylor Simpson TEST_R_OP_R(conv_sf2w_chop, SF_SNaN, 0xffffffff, USR_FPINVF);
10052479540fSTaylor Simpson TEST_P_OP_R(conv_sf2ud_chop, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10062479540fSTaylor Simpson TEST_P_OP_R(conv_sf2ud_chop, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10072479540fSTaylor Simpson TEST_P_OP_R(conv_sf2d_chop, SF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10082479540fSTaylor Simpson TEST_P_OP_R(conv_sf2d_chop, SF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10092479540fSTaylor Simpson
1010*6146060aSMatheus Tavares Bernardino TEST_R_OP_R(conv_sf2uw, SF_zero_neg, 0, USR_CLEAR);
1011*6146060aSMatheus Tavares Bernardino TEST_R_OP_R(conv_sf2uw_chop, SF_zero_neg, 0, USR_CLEAR);
1012*6146060aSMatheus Tavares Bernardino TEST_P_OP_R(conv_sf2ud, SF_zero_neg, 0, USR_CLEAR);
1013*6146060aSMatheus Tavares Bernardino TEST_P_OP_R(conv_sf2ud_chop, SF_zero_neg, 0, USR_CLEAR);
1014*6146060aSMatheus Tavares Bernardino
10152479540fSTaylor Simpson TEST_R_OP_P(conv_df2sf, DF_QNaN, SF_HEX_NaN, USR_CLEAR);
10162479540fSTaylor Simpson TEST_R_OP_P(conv_df2sf, DF_SNaN, SF_HEX_NaN, USR_FPINVF);
10172479540fSTaylor Simpson TEST_R_OP_P(conv_df2uw, DF_QNaN, 0xffffffff, USR_FPINVF);
10182479540fSTaylor Simpson TEST_R_OP_P(conv_df2uw, DF_SNaN, 0xffffffff, USR_FPINVF);
10192479540fSTaylor Simpson TEST_R_OP_P(conv_df2w, DF_QNaN, 0xffffffff, USR_FPINVF);
10202479540fSTaylor Simpson TEST_R_OP_P(conv_df2w, DF_SNaN, 0xffffffff, USR_FPINVF);
10212479540fSTaylor Simpson TEST_P_OP_P(conv_df2ud, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10222479540fSTaylor Simpson TEST_P_OP_P(conv_df2ud, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10232479540fSTaylor Simpson TEST_P_OP_P(conv_df2d, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10242479540fSTaylor Simpson TEST_P_OP_P(conv_df2d, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10252479540fSTaylor Simpson TEST_R_OP_P(conv_df2uw_chop, DF_QNaN, 0xffffffff, USR_FPINVF);
10262479540fSTaylor Simpson TEST_R_OP_P(conv_df2uw_chop, DF_SNaN, 0xffffffff, USR_FPINVF);
10273977ba30STaylor Simpson
1028*6146060aSMatheus Tavares Bernardino TEST_R_OP_P(conv_df2uw, DF_zero_neg, 0, USR_CLEAR);
1029*6146060aSMatheus Tavares Bernardino TEST_R_OP_P(conv_df2uw_chop, DF_zero_neg, 0, USR_CLEAR);
1030*6146060aSMatheus Tavares Bernardino TEST_P_OP_P(conv_df2ud, DF_zero_neg, 0, USR_CLEAR);
1031*6146060aSMatheus Tavares Bernardino TEST_P_OP_P(conv_df2ud_chop, DF_zero_neg, 0, USR_CLEAR);
1032*6146060aSMatheus Tavares Bernardino
10333977ba30STaylor Simpson /* Test for typo in HELPER(conv_df2uw_chop) */
10343977ba30STaylor Simpson TEST_R_OP_P(conv_df2uw_chop, 0xffffff7f00000001ULL, 0xffffffff, USR_FPINVF);
10353977ba30STaylor Simpson
10362479540fSTaylor Simpson TEST_R_OP_P(conv_df2w_chop, DF_QNaN, 0xffffffff, USR_FPINVF);
10372479540fSTaylor Simpson TEST_R_OP_P(conv_df2w_chop, DF_SNaN, 0xffffffff, USR_FPINVF);
10382479540fSTaylor Simpson TEST_P_OP_P(conv_df2ud_chop, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10392479540fSTaylor Simpson TEST_P_OP_P(conv_df2ud_chop, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10402479540fSTaylor Simpson TEST_P_OP_P(conv_df2d_chop, DF_QNaN, 0xffffffffffffffffULL, USR_FPINVF);
10412479540fSTaylor Simpson TEST_P_OP_P(conv_df2d_chop, DF_SNaN, 0xffffffffffffffffULL, USR_FPINVF);
10422479540fSTaylor Simpson
10432479540fSTaylor Simpson TEST_R_OP_R(conv_uw2sf, 0x00000001, SF_one, USR_CLEAR);
10442479540fSTaylor Simpson TEST_R_OP_R(conv_uw2sf, 0x010020a5, 0x4b801052, USR_FPINPF);
10452479540fSTaylor Simpson TEST_R_OP_R(conv_w2sf, 0x00000001, SF_one, USR_CLEAR);
10462479540fSTaylor Simpson TEST_R_OP_R(conv_w2sf, 0x010020a5, 0x4b801052, USR_FPINPF);
10472479540fSTaylor Simpson TEST_R_OP_P(conv_ud2sf, 0x0000000000000001ULL, SF_one, USR_CLEAR);
10482479540fSTaylor Simpson TEST_R_OP_P(conv_ud2sf, 0x00000000010020a5ULL, 0x4b801052, USR_FPINPF);
10492479540fSTaylor Simpson TEST_R_OP_P(conv_d2sf, 0x0000000000000001ULL, SF_one, USR_CLEAR);
10502479540fSTaylor Simpson TEST_R_OP_P(conv_d2sf, 0x00000000010020a5ULL, 0x4b801052, USR_FPINPF);
10512479540fSTaylor Simpson
10522479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_one, 1, SF_four,
10532479540fSTaylor Simpson USR_CLEAR);
10542479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_QNaN, SF_one, SF_one, 1, SF_HEX_NaN,
10552479540fSTaylor Simpson USR_CLEAR);
10562479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_one, SF_QNaN, SF_one, 1, SF_HEX_NaN,
10572479540fSTaylor Simpson USR_CLEAR);
10582479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_QNaN, 1, SF_HEX_NaN,
10592479540fSTaylor Simpson USR_CLEAR);
10602479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_SNaN, SF_one, SF_one, 1, SF_HEX_NaN,
10612479540fSTaylor Simpson USR_FPINVF);
10622479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_one, SF_SNaN, SF_one, 1, SF_HEX_NaN,
10632479540fSTaylor Simpson USR_FPINVF);
10642479540fSTaylor Simpson TEST_XR_OP_RRp(sffma_sc, SF_one, SF_one, SF_SNaN, 1, SF_HEX_NaN,
10652479540fSTaylor Simpson USR_FPINVF);
10662479540fSTaylor Simpson
10672479540fSTaylor Simpson TEST_Rp_OP_RR(sfrecipa, SF_one, SF_one, SF_one_recip, 0x00,
10682479540fSTaylor Simpson USR_CLEAR);
10692479540fSTaylor Simpson TEST_Rp_OP_RR(sfrecipa, SF_QNaN, SF_one, SF_HEX_NaN, 0x00,
10702479540fSTaylor Simpson USR_CLEAR);
10712479540fSTaylor Simpson TEST_Rp_OP_RR(sfrecipa, SF_one, SF_QNaN, SF_HEX_NaN, 0x00,
10722479540fSTaylor Simpson USR_CLEAR);
10732479540fSTaylor Simpson TEST_Rp_OP_RR(sfrecipa, SF_one, SF_SNaN, SF_HEX_NaN, 0x00,
10742479540fSTaylor Simpson USR_FPINVF);
10752479540fSTaylor Simpson TEST_Rp_OP_RR(sfrecipa, SF_SNaN, SF_one, SF_HEX_NaN, 0x00,
10762479540fSTaylor Simpson USR_FPINVF);
10772479540fSTaylor Simpson
10782479540fSTaylor Simpson TEST_R_OP_RR(sffixupn, SF_one, SF_one, SF_one, USR_CLEAR);
10792479540fSTaylor Simpson TEST_R_OP_RR(sffixupn, SF_QNaN, SF_one, SF_HEX_NaN, USR_CLEAR);
10802479540fSTaylor Simpson TEST_R_OP_RR(sffixupn, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
10812479540fSTaylor Simpson TEST_R_OP_RR(sffixupn, SF_SNaN, SF_one, SF_HEX_NaN, USR_FPINVF);
10822479540fSTaylor Simpson TEST_R_OP_RR(sffixupn, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
10832479540fSTaylor Simpson
10842479540fSTaylor Simpson TEST_R_OP_RR(sffixupd, SF_one, SF_one, SF_one, USR_CLEAR);
10852479540fSTaylor Simpson TEST_R_OP_RR(sffixupd, SF_QNaN, SF_one, SF_HEX_NaN, USR_CLEAR);
10862479540fSTaylor Simpson TEST_R_OP_RR(sffixupd, SF_one, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
10872479540fSTaylor Simpson TEST_R_OP_RR(sffixupd, SF_SNaN, SF_one, SF_HEX_NaN, USR_FPINVF);
10882479540fSTaylor Simpson TEST_R_OP_RR(sffixupd, SF_one, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
10892479540fSTaylor Simpson
10902479540fSTaylor Simpson TEST_R_OP_R(sffixupr, SF_one, SF_one, USR_CLEAR);
10912479540fSTaylor Simpson TEST_R_OP_R(sffixupr, SF_QNaN, SF_HEX_NaN, USR_CLEAR);
10922479540fSTaylor Simpson TEST_R_OP_R(sffixupr, SF_SNaN, SF_HEX_NaN, USR_FPINVF);
10932479540fSTaylor Simpson
10942479540fSTaylor Simpson TEST_Rp_OP_R(sfinvsqrta, SF_one, SF_one_invsqrta, 0x00, USR_CLEAR);
10952479540fSTaylor Simpson TEST_Rp_OP_R(sfinvsqrta, SF_zero, SF_one, 0x00, USR_CLEAR);
10962479540fSTaylor Simpson TEST_Rp_OP_R(sfinvsqrta, SF_QNaN, SF_HEX_NaN, 0x00, USR_CLEAR);
10972479540fSTaylor Simpson TEST_Rp_OP_R(sfinvsqrta, SF_small_neg, SF_HEX_NaN, 0x00, USR_FPINVF);
10982479540fSTaylor Simpson TEST_Rp_OP_R(sfinvsqrta, SF_SNaN, SF_HEX_NaN, 0x00, USR_FPINVF);
10992479540fSTaylor Simpson
11004d04395aSTaylor Simpson puts(err ? "FAIL" : "PASS");
11014d04395aSTaylor Simpson return err;
11024d04395aSTaylor Simpson }
1103