Fix SHUFPD and SHUFPS and add fuzz tests

See: https://github.com/jart/blink/issues/72
See: https://github.com/jart/blink/issues/68
This commit is contained in:
Justine Tunney 2023-03-05 16:12:28 -08:00
parent 2aa044cb0c
commit 2112fb1736
No known key found for this signature in database
GPG key ID: BE714B4575D6E328
6 changed files with 182 additions and 2 deletions

View file

@ -32,6 +32,7 @@
#include "libc/intrin/paddusb.h"
#include "libc/intrin/paddusw.h"
#include "libc/intrin/paddw.h"
#include "libc/intrin/palignr.h"
#include "libc/intrin/pand.h"
#include "libc/intrin/pandn.h"
#include "libc/intrin/pavgb.h"
@ -99,6 +100,8 @@
#include "libc/intrin/punpcklqdq.h"
#include "libc/intrin/punpcklwd.h"
#include "libc/intrin/pxor.h"
#include "libc/intrin/shufpd.h"
#include "libc/intrin/shufps.h"
#include "libc/limits.h"
#include "libc/log/check.h"
#include "libc/mem/gc.internal.h"
@ -2120,3 +2123,58 @@ TEST(pext, fuzz) {
ASSERT_EQ(pext(x, y), (pext)(x, y));
}
}
TEST(palignr, fuzz) {
int i, imm;
int8_t x[16], y[16], a[16], b[16];
for (i = 0; i < 1000; ++i) {
for (imm = 0; imm < 32; ++imm) {
RngSet(x, sizeof(x));
RngSet(y, sizeof(y));
memcpy(a, x, 16);
memcpy(b, y, 16);
palignr(a, a, b, imm);
(palignr)(x, x, y, imm);
ASSERT_EQ(0, memcmp(a, x, 16));
ASSERT_EQ(0, memcmp(b, y, 16));
}
}
}
TEST(shufps, fuzz) {
int i, imm;
char x[16], y[16], a[16], b[16];
for (i = 0; i < 1000; ++i) {
for (imm = 0; imm < 256; ++imm) {
RngSet(x, sizeof(x));
RngSet(y, sizeof(y));
memcpy(a, x, 16);
memcpy(b, y, 16);
shufps((void *)a, (void *)a, (void *)b, imm);
(shufps)((void *)x, (void *)x, (void *)y, imm);
ASSERT_EQ(0, memcmp(a, x, 16));
ASSERT_EQ(0, memcmp(b, y, 16));
}
}
}
TEST(shufpd, fuzz) {
int i, imm;
char x[16], y[16], a[16], b[16];
for (i = 0; i < 1000; ++i) {
for (imm = 0; imm < 256; ++imm) {
RngSet(x, sizeof(x));
RngSet(y, sizeof(y));
memcpy(a, x, 16);
memcpy(b, y, 16);
shufpd((void *)a, (void *)a, (void *)b, imm);
(shufpd)((void *)x, (void *)x, (void *)y, imm);
ASSERT_EQ(0, memcmp(a, x, 16),
"imm=%d\n\t"
"a=%.*hhs\n\t"
"x=%.*hhs",
imm, 16, a, 16, x);
ASSERT_EQ(0, memcmp(b, y, 16), "imm=%d", imm);
}
}
}