xref: /openbmc/qemu/tests/tcg/hexagon/usr.c (revision 75c7f574035622798e9361a942bdfbb0af930f0e)
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