From 389bb4df660f06ed8f00de85385811870c1b8f4e Mon Sep 17 00:00:00 2001 From: Jiajie Chen Date: Tue, 12 Dec 2023 22:23:42 +0800 Subject: [PATCH] Add vpackev/vpackod --- README.md | 4 ---- code/gen_impl.py | 14 ++++++++++++++ code/gen_tb.py | 2 ++ code/vpackev_b.cpp | 9 +++++++++ code/vpackev_b.h | 3 +++ code/vpackev_d.cpp | 9 +++++++++ code/vpackev_d.h | 3 +++ code/vpackev_h.cpp | 9 +++++++++ code/vpackev_h.h | 3 +++ code/vpackev_w.cpp | 9 +++++++++ code/vpackev_w.h | 3 +++ code/vpackod_b.cpp | 9 +++++++++ code/vpackod_b.h | 3 +++ code/vpackod_d.cpp | 9 +++++++++ code/vpackod_d.h | 3 +++ code/vpackod_h.cpp | 9 +++++++++ code/vpackod_h.h | 3 +++ code/vpackod_w.cpp | 9 +++++++++ code/vpackod_w.h | 3 +++ docs/lsx/interleaving.md | 11 ----------- docs/lsx/misc.md | 22 +++++++++++++++++++++- main.py | 18 ++++++++++++++++++ 22 files changed, 151 insertions(+), 16 deletions(-) create mode 100644 code/vpackev_b.cpp create mode 100644 code/vpackev_b.h create mode 100644 code/vpackev_d.cpp create mode 100644 code/vpackev_d.h create mode 100644 code/vpackev_h.cpp create mode 100644 code/vpackev_h.h create mode 100644 code/vpackev_w.cpp create mode 100644 code/vpackev_w.h create mode 100644 code/vpackod_b.cpp create mode 100644 code/vpackod_b.h create mode 100644 code/vpackod_d.cpp create mode 100644 code/vpackod_d.h create mode 100644 code/vpackod_h.cpp create mode 100644 code/vpackod_h.h create mode 100644 code/vpackod_w.cpp create mode 100644 code/vpackod_w.h delete mode 100644 docs/lsx/interleaving.md diff --git a/README.md b/README.md index b3b03bae..189521dd 100644 --- a/README.md +++ b/README.md @@ -30,10 +30,6 @@ TODO List: ### vssrarn.bu.h/hu.w/wu.d -### vpackev.b/h/w/d - -### vpackod.b/h/w/d - ### vpickev.b/h/w/d ### vpickod.b/h/w/d diff --git a/code/gen_impl.py b/code/gen_impl.py index 904d2ff4..2c82e40b 100644 --- a/code/gen_impl.py +++ b/code/gen_impl.py @@ -407,6 +407,20 @@ ) print(f" }}", file=f) print(f"}}", file=f) + with open(f"vpackev_{width}.h", "w") as f: + print(f"for (int i = 0;i < {128 // w};i++) {{", file=f) + print( + f" dst.{m}[i] = (i % 2 == 1) ? a.{m}[i-1] : b.{m}[i];", + file=f, + ) + print(f"}}", file=f) + with open(f"vpackod_{width}.h", "w") as f: + print(f"for (int i = 0;i < {128 // w};i++) {{", file=f) + print( + f" dst.{m}[i] = (i % 2 == 1) ? a.{m}[i] : b.{m}[i+1];", + file=f, + ) + print(f"}}", file=f) for width in ["s", "d"]: m = members_fp[width] diff --git a/code/gen_tb.py b/code/gen_tb.py index da1ad121..6068f1d9 100644 --- a/code/gen_tb.py +++ b/code/gen_tb.py @@ -74,6 +74,8 @@ "vmul": (widths_signed, "v128 a, v128 b"), "vmulwev": (widths_vaddw, "v128 a, v128 b"), "vmulwod": (widths_vaddw, "v128 a, v128 b"), + "vpackev": (widths_signed, "v128 a, v128 b"), + "vpackod": (widths_signed, "v128 a, v128 b"), "vpcnt": (widths_signed, "v128 a"), "vrotr": (widths_signed, "v128 a, v128 b"), "vsadd": (widths_all, "v128 a, v128 b"), diff --git a/code/vpackev_b.cpp b/code/vpackev_b.cpp new file mode 100644 index 00000000..a990ce5c --- /dev/null +++ b/code/vpackev_b.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackev_b(v128 a, v128 b) { + v128 dst; +#include "vpackev_b.h" + return dst; +} + +void test() { FUZZ2(vpackev_b); } diff --git a/code/vpackev_b.h b/code/vpackev_b.h new file mode 100644 index 00000000..54041887 --- /dev/null +++ b/code/vpackev_b.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 16; i++) { + dst.byte[i] = (i % 2 == 1) ? a.byte[i - 1] : b.byte[i]; +} diff --git a/code/vpackev_d.cpp b/code/vpackev_d.cpp new file mode 100644 index 00000000..7da6ea8d --- /dev/null +++ b/code/vpackev_d.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackev_d(v128 a, v128 b) { + v128 dst; +#include "vpackev_d.h" + return dst; +} + +void test() { FUZZ2(vpackev_d); } diff --git a/code/vpackev_d.h b/code/vpackev_d.h new file mode 100644 index 00000000..3cf7758b --- /dev/null +++ b/code/vpackev_d.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 2; i++) { + dst.dword[i] = (i % 2 == 1) ? a.dword[i - 1] : b.dword[i]; +} diff --git a/code/vpackev_h.cpp b/code/vpackev_h.cpp new file mode 100644 index 00000000..4b76729f --- /dev/null +++ b/code/vpackev_h.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackev_h(v128 a, v128 b) { + v128 dst; +#include "vpackev_h.h" + return dst; +} + +void test() { FUZZ2(vpackev_h); } diff --git a/code/vpackev_h.h b/code/vpackev_h.h new file mode 100644 index 00000000..753091b1 --- /dev/null +++ b/code/vpackev_h.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 8; i++) { + dst.half[i] = (i % 2 == 1) ? a.half[i - 1] : b.half[i]; +} diff --git a/code/vpackev_w.cpp b/code/vpackev_w.cpp new file mode 100644 index 00000000..209b17f2 --- /dev/null +++ b/code/vpackev_w.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackev_w(v128 a, v128 b) { + v128 dst; +#include "vpackev_w.h" + return dst; +} + +void test() { FUZZ2(vpackev_w); } diff --git a/code/vpackev_w.h b/code/vpackev_w.h new file mode 100644 index 00000000..fd241f07 --- /dev/null +++ b/code/vpackev_w.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 4; i++) { + dst.word[i] = (i % 2 == 1) ? a.word[i - 1] : b.word[i]; +} diff --git a/code/vpackod_b.cpp b/code/vpackod_b.cpp new file mode 100644 index 00000000..b0783dc6 --- /dev/null +++ b/code/vpackod_b.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackod_b(v128 a, v128 b) { + v128 dst; +#include "vpackod_b.h" + return dst; +} + +void test() { FUZZ2(vpackod_b); } diff --git a/code/vpackod_b.h b/code/vpackod_b.h new file mode 100644 index 00000000..befe62c9 --- /dev/null +++ b/code/vpackod_b.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 16; i++) { + dst.byte[i] = (i % 2 == 1) ? a.byte[i] : b.byte[i + 1]; +} diff --git a/code/vpackod_d.cpp b/code/vpackod_d.cpp new file mode 100644 index 00000000..b1e2778e --- /dev/null +++ b/code/vpackod_d.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackod_d(v128 a, v128 b) { + v128 dst; +#include "vpackod_d.h" + return dst; +} + +void test() { FUZZ2(vpackod_d); } diff --git a/code/vpackod_d.h b/code/vpackod_d.h new file mode 100644 index 00000000..9ba4c80d --- /dev/null +++ b/code/vpackod_d.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 2; i++) { + dst.dword[i] = (i % 2 == 1) ? a.dword[i] : b.dword[i + 1]; +} diff --git a/code/vpackod_h.cpp b/code/vpackod_h.cpp new file mode 100644 index 00000000..40fb7409 --- /dev/null +++ b/code/vpackod_h.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackod_h(v128 a, v128 b) { + v128 dst; +#include "vpackod_h.h" + return dst; +} + +void test() { FUZZ2(vpackod_h); } diff --git a/code/vpackod_h.h b/code/vpackod_h.h new file mode 100644 index 00000000..3a6c3799 --- /dev/null +++ b/code/vpackod_h.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 8; i++) { + dst.half[i] = (i % 2 == 1) ? a.half[i] : b.half[i + 1]; +} diff --git a/code/vpackod_w.cpp b/code/vpackod_w.cpp new file mode 100644 index 00000000..75b8bbf4 --- /dev/null +++ b/code/vpackod_w.cpp @@ -0,0 +1,9 @@ +#include "common.h" + +v128 vpackod_w(v128 a, v128 b) { + v128 dst; +#include "vpackod_w.h" + return dst; +} + +void test() { FUZZ2(vpackod_w); } diff --git a/code/vpackod_w.h b/code/vpackod_w.h new file mode 100644 index 00000000..7b39b1ea --- /dev/null +++ b/code/vpackod_w.h @@ -0,0 +1,3 @@ +for (int i = 0; i < 4; i++) { + dst.word[i] = (i % 2 == 1) ? a.word[i] : b.word[i + 1]; +} diff --git a/docs/lsx/interleaving.md b/docs/lsx/interleaving.md deleted file mode 100644 index 4a89fd9d..00000000 --- a/docs/lsx/interleaving.md +++ /dev/null @@ -1,11 +0,0 @@ -# Interleaving - -{{ vilvh('b') }} -{{ vilvh('h') }} -{{ vilvh('w') }} -{{ vilvh('d') }} - -{{ vilvl('b') }} -{{ vilvl('h') }} -{{ vilvl('w') }} -{{ vilvl('d') }} \ No newline at end of file diff --git a/docs/lsx/misc.md b/docs/lsx/misc.md index a6da62f5..afb317c2 100644 --- a/docs/lsx/misc.md +++ b/docs/lsx/misc.md @@ -1,6 +1,26 @@ # Misc +{{ vilvh('b') }} +{{ vilvh('h') }} +{{ vilvh('w') }} +{{ vilvh('d') }} + +{{ vilvl('b') }} +{{ vilvl('h') }} +{{ vilvl('w') }} +{{ vilvl('d') }} + {{ vinsgr2vr('b') }} {{ vinsgr2vr('h') }} {{ vinsgr2vr('w') }} -{{ vinsgr2vr('d') }} \ No newline at end of file +{{ vinsgr2vr('d') }} + +{{ vpackev('b') }} +{{ vpackev('h') }} +{{ vpackev('w') }} +{{ vpackev('d') }} + +{{ vpackod('b') }} +{{ vpackod('h') }} +{{ vpackod('w') }} +{{ vpackod('d') }} diff --git a/main.py b/main.py index be900ade..cfe869ef 100644 --- a/main.py +++ b/main.py @@ -697,4 +697,22 @@ def vsrar(name): intrinsic=f"__m128i __lsx_vsrar_{name} (__m128i a, __m128i b)", instr=f"vsrar.{name} vr, vr, vr", desc=f"Arithmetic right shift (with rounding) the signed {width}-bit elements in `a` by elements in `b`, store the result to `dst`.", + ) + + @env.macro + def vpackev(name): + width = widths[name] + return instruction( + intrinsic=f"__m128i __lsx_vpackev_{name} (__m128i a, __m128i b)", + instr=f"vpackev.{name} vr, vr, vr", + desc=f"Collect and pack even-positioned {width}-bit elements in `a` and `b` and store `dst`.", + ) + + @env.macro + def vpackod(name): + width = widths[name] + return instruction( + intrinsic=f"__m128i __lsx_vpackod_{name} (__m128i a, __m128i b)", + instr=f"vpackod.{name} vr, vr, vr", + desc=f"Collect and pack odd-positioned {width}-bit elements in `a` and `b` and store `dst`.", ) \ No newline at end of file