X-Git-Url: https://git.distorted.org.uk/~mdw/catacomb/blobdiff_plain/85e29c6edea1042eafbb8345ba0a7d805fa9b4bd..54d36e7b0c6471567376158a5790756d90fb9f80:/math/mpx.c diff --git a/math/mpx.c b/math/mpx.c index 3983e7ca..ac826883 100644 --- a/math/mpx.c +++ b/math/mpx.c @@ -818,7 +818,7 @@ void mpx_usub(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, void mpx_usubn(mpw *dv, mpw *dvl, mpw n) { MPX_USUBN(dv, dvl, n); } -/* --- @mpx_uaddnlsl@ --- * +/* --- @mpx_usubnlsl@ --- * * * Arguments: @mpw *dv, *dvl@ = destination and first argument vector * @mpw a@ = second argument @@ -923,22 +923,44 @@ static void simple_umul(mpw *dv, mpw *dvl, const mpw *av, const mpw *avl, #if CPUFAM_X86 MAYBE_UMUL4(x86_sse2) + MAYBE_UMUL4(x86_avx) #endif #if CPUFAM_AMD64 MAYBE_UMUL4(amd64_sse2) + MAYBE_UMUL4(amd64_avx) +#endif + +#if CPUFAM_ARMEL + MAYBE_UMUL4(arm_neon) +#endif + +#if CPUFAM_ARM64 + MAYBE_UMUL4(arm64_simd) #endif static mpx_umul__functype *pick_umul(void) { #if CPUFAM_X86 + DISPATCH_PICK_COND(mpx_umul, maybe_umul4_x86_avx, + cpu_feature_p(CPUFEAT_X86_AVX)); DISPATCH_PICK_COND(mpx_umul, maybe_umul4_x86_sse2, cpu_feature_p(CPUFEAT_X86_SSE2)); #endif #if CPUFAM_AMD64 + DISPATCH_PICK_COND(mpx_umul, maybe_umul4_amd64_avx, + cpu_feature_p(CPUFEAT_X86_AVX)); DISPATCH_PICK_COND(mpx_umul, maybe_umul4_amd64_sse2, cpu_feature_p(CPUFEAT_X86_SSE2)); #endif +#if CPUFAM_ARMEL + DISPATCH_PICK_COND(mpx_umul, maybe_umul4_arm_neon, + cpu_feature_p(CPUFEAT_ARM_NEON)); +#endif +#if CPUFAM_ARM64 + DISPATCH_PICK_COND(mpx_umul, maybe_umul4_arm64_simd, + cpu_feature_p(CPUFEAT_ARM_NEON)); +#endif DISPATCH_PICK_FALLBACK(mpx_umul, simple_umul); } @@ -1268,9 +1290,14 @@ mpw mpx_udivn(mpw *qv, mpw *qvl, const mpw *rv, const mpw *rvl, mpw d) #include #include +#include #include #include +#ifdef ENABLE_ASM_DEBUG +# include "regdump.h" +#endif + #include "mpscan.h" #define ALLOC(v, vl, sz) do { \ @@ -1360,7 +1387,7 @@ static int loadstore(dstr *v) ok = 0; MPX_OCTETS(oct, m, ml); mpx_storel(m, ml, d.buf, d.sz); - if (memcmp(d.buf, v->buf, oct) != 0) { + if (MEMCMP(d.buf, !=, v->buf, oct)) { dumpbits("\n*** storel failed", d.buf, d.sz); ok = 0; } @@ -1370,7 +1397,7 @@ static int loadstore(dstr *v) ok = 0; MPX_OCTETS(oct, m, ml); mpx_storeb(m, ml, d.buf, d.sz); - if (memcmp(d.buf + d.sz - oct, v->buf + v->len - oct, oct) != 0) { + if (MEMCMP(d.buf + d.sz - oct, !=, v->buf + v->len - oct, oct)) { dumpbits("\n*** storeb failed", d.buf, d.sz); ok = 0; } @@ -1404,14 +1431,14 @@ static int twocl(dstr *v) mpx_loadl(m, ml0, v[0].buf, v[0].len); mpx_storel2cn(m, ml0, d.buf, v[1].len); - if (memcmp(d.buf, v[1].buf, v[1].len)) { + if (MEMCMP(d.buf, !=, v[1].buf, v[1].len)) { dumpbits("\n*** storel2cn failed", d.buf, v[1].len); ok = 0; } mpx_loadl2cn(m, ml1, v[1].buf, v[1].len); mpx_storel(m, ml1, d.buf, v[0].len); - if (memcmp(d.buf, v[0].buf, v[0].len)) { + if (MEMCMP(d.buf, !=, v[0].buf, v[0].len)) { dumpbits("\n*** loadl2cn failed", d.buf, v[0].len); ok = 0; } @@ -1448,14 +1475,14 @@ static int twocb(dstr *v) mpx_loadb(m, ml0, v[0].buf, v[0].len); mpx_storeb2cn(m, ml0, d.buf, v[1].len); - if (memcmp(d.buf, v[1].buf, v[1].len)) { + if (MEMCMP(d.buf, !=, v[1].buf, v[1].len)) { dumpbits("\n*** storeb2cn failed", d.buf, v[1].len); ok = 0; } mpx_loadb2cn(m, ml1, v[1].buf, v[1].len); mpx_storeb(m, ml1, d.buf, v[0].len); - if (memcmp(d.buf, v[0].buf, v[0].len)) { + if (MEMCMP(d.buf, !=, v[0].buf, v[0].len)) { dumpbits("\n*** loadb2cn failed", d.buf, v[0].len); ok = 0; } @@ -1702,6 +1729,9 @@ static test_chunk defs[] = { int main(int argc, char *argv[]) { +#ifdef ENABLE_ASM_DEBUG + regdump_init(); +#endif test_run(argc, argv, defs, SRCDIR"/t/mpx"); return (0); }