0
|
1 vec - a tiny SIMD vector header-only library written in C99
|
|
2
|
|
3 it comes with an extremely basic (and somewhat lacking) API,
|
|
4 where there are eight supported vector types, all 128-bit:
|
|
5
|
|
6 vint8x16 - 16 signed 8-bit integers
|
|
7 vint16x8 - 8 signed 16-bit integers
|
|
8 vint32x4 - 4 signed 32-bit integers
|
|
9 vint64x2 - 2 signed 64-bit integers
|
|
10 vuint8x16 - 16 unsigned 8-bit integers
|
|
11 vuint16x8 - 8 unsigned 16-bit integers
|
|
12 vuint32x4 - 4 unsigned 32-bit integers
|
|
13 vuint32x4 - 2 unsigned 64-bit integers
|
|
14
|
|
15 all of these have many operations that are prefixed with the
|
|
16 name of the type and an underscore, for example:
|
|
17
|
|
18 vint8x16 vint8x16_splat(uint8_t x)
|
|
19 - creates a vint8x16 where all of the values are filled
|
|
20 with the value of `x'
|
|
21
|
|
22 the current supported operations are:
|
|
23
|
|
24 v[u]intAxB splat([u]intA_t x)
|
|
25 creates a vector with all of the values are filled with
|
|
26 the value of `x'
|
|
27
|
|
28 v[u]intAxB load(const [u]intA_t x[B])
|
|
29 copies the values from the memory address stored at `x';
|
|
30 the address is NOT required to be aligned
|
|
31
|
|
32 void store(v[u]intAxB vec, [u]intA_t x[B])
|
|
33 copies the values from the vector into the memory address
|
|
34 stored at `x'
|
|
35
|
|
36 like with load(), this does not require address alignment
|
|
37
|
|
38 v[u]intAxB add(v[u]intAxB vec1, v[u]intAxB vec2)
|
|
39 adds the value of `vec1' and `vec2' and returns it
|
|
40
|
|
41 v[u]intAxB sub(v[u]intAxB vec1, v[u]intAxB vec2)
|
|
42 subtracts the value of `vec2' from `vec1' and returns it
|
|
43
|
|
44 v[u]intAxB mul(v[u]intAxB vec1, v[u]intAxB vec2)
|
|
45 multiplies the values of `vec1' and `vec2' together and
|
|
46 returns it
|