aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/nim/readme.md
blob: 556eb5dbec68cc03999813c1325b3b5fe7fae6cd (about) (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
# NIM

Compiles to C with

    nim  -c -d:release c example

See ~/.cache/nim/example_r/\@mexample.nim.c

# Using simde

https://github.com/guzba/nimsimd/tree/master

```nim
# SIMD floating point multiplication
let
  a = mm_set1_ps(1.0) # Vector of 4 float32 each with value 1.0
  b = mm_set1_ps(2.0) # Vector of 4 float32 each with value 2.0
  c = mm_mul_ps(a, b) # SIMD vector multiplication operator
# Cast the vector to echo as separate float32 values
echo cast[array[4, float32]](c)
```

Translates to C

```C
tyArray__nHXaesL0DJZHyVS07ARPRA T1_;
union { __m128 source; tyArray__9aTCwbdg1cSQimdVd0OEKVw dest; } LOC2;

echoBinSafe(TM__NqVfYNeiCrBLDU2vGCYO9bA_2, 1);
a__simd_2 = _mm_set1_ps(1.0f);
b__simd_3 = _mm_set1_ps(2.0f);
c__simd_4 = _mm_mul_ps(a__simd_2, b__simd_3);
nimZeroMem((void*)T1_, sizeof(tyArray__nHXaesL0DJZHyVS07ARPRA));
LOC2.source = c__simd_4;
T1_[0] = dollar___simd_70(LOC2.dest);
echoBinSafe(T1_, 1);
```

```nim
var l1 = [1.0, 2.1, 3.2, 4.3]
var l2 = [0.0, 1.1, 2.1, 3.3]

var regs1 = mm256_loadu_pd(l1[0].addr)
var regs2 = mm256_loadu_pd(l2[0].addr)
var result = mm256_sub_pd(regs1,regs2)
echo cast[array[4, float64]](result)
```

```C
regs1__simd_124 = _mm256_loadu_pd(((void*) ((&l1__simd_122[(((NI) 0))- 0]))));
regs2__simd_125 = _mm256_loadu_pd(((void*) ((&l2__simd_123[(((NI) 0))- 0]))));
result__simd_126 = _mm256_sub_pd(regs1__simd_124, regs2__simd_125);
nimZeroMem((void*)T3_, sizeof(tyArray__nHXaesL0DJZHyVS07ARPRA));
LOC4.source = result__simd_126;
T3_[0] = dollar___simd_192(LOC4.dest);
echoBinSafe(T3_, 1);
```

Output:

```
TESTING AVX
[2.0, 2.0, 2.0, 2.0]
[1.0, 1.0, 1.1, 1.0]
```