Welcome to WCPL
January 24, 2023This is a test. I will be posting some notes on WCPL design here.
For now, here is a small test of freshly minted support for WASM SIMD and
LLVM-compatible wasm_simd128.h
header:
#include <wasm_simd128.h>
#include <stdio.h>
void multiply_arrays(int* out, int* in_a, int* in_b, int size)
{
for (int i = 0; i < size; i += 4) {
v128_t a = wasm_v128_load(&in_a[i]);
v128_t b = wasm_v128_load(&in_b[i]);
v128_t prod = wasm_i32x4_mul(a, b);
wasm_v128_store(&out[i], prod);
}
}
int main()
{
int a1[8] = { 1, 2, 3, 4, 5, 6, 7, 8 };
int a2[8] = { 1, 10, 100, 1000, 1000, 100, 10, 1 };
int a3[8], i;
multiply_arrays(&a3[0], &a2[0], &a1[0], 8);
printf("a3[8] = { %d, %d, %d, %d, %d, %d, %d, %d };\n",
a3[0], a3[1], a3[2], a3[3], a3[4], a3[5], a3[6], a3[7]);
v128_t v1 = wasm_i16x8_const(1, 2, 3, 4, 5, 6, 7, 8);
v128_t v2 = wasm_i16x8_const(10, 20, 30, 40, 50, 60, 70, 80);
v128_t v3 = wasm_i16x8_mul(v1, v2);
a3[0] = wasm_i16x8_extract_lane(v3, 0);
a3[1] = wasm_i16x8_extract_lane(v3, 1);
a3[2] = wasm_i16x8_extract_lane(v3, 2);
a3[3] = wasm_i16x8_extract_lane(v3, 3);
a3[4] = wasm_i16x8_extract_lane(v3, 4);
a3[5] = wasm_i16x8_extract_lane(v3, 5);
a3[6] = wasm_i16x8_extract_lane(v3, 6);
a3[7] = wasm_i16x8_extract_lane(v3, 7);
printf("a3[8] = { %d, %d, %d, %d, %d, %d, %d, %d };\n",
a3[0], a3[1], a3[2], a3[3], a3[4], a3[5], a3[6], a3[7]);
return 0;
}
#=> prints 'a3[8] = { 1, 20, 300, 4000, 5000, 600, 70, 8 };' to STDOUT.
#=> prints 'a3[8] = { 10, 40, 90, 160, 250, 360, 490, 640 };' to STDOUT.
Check out the LLVM’s original wasm_simd128.h for more info.