aboutsummaryrefslogtreecommitdiff
path: root/prescheme-nim-local/simde.scm
blob: 06e6fb69c9d4c7865e9d7939320d8e13832f2237 (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
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
;; simde example (WIP)

(define %vec-a (vector-unfold (lambda (i)
                                (* i i))
                              5))

;; take vec-a's length at compile-time
(define %len-a (vector-length %vec-a))


(define foox
  (external "computefoox" (=> (integer integer) integer)
            (lambda (x y)
              (display (+ x y)))))

(define (handle-error message)
  (define out (current-error-port))
  (error message))

;;(define-c-generator make-string #t
;;  (lambda (call port indent)
;;    ; calloc is used as a hack to get a zero at the end
;;    (format port "(char *)calloc( 1, 1 + ")
;;    (c-value (call-arg call 0) port)
;;    (format port ")")))

;; gcvt (float value, int ndigits, char * buf);
(define (gcvt v ndigits buf)
  ((external "gcvt" (=> (float integer (^ char)) unit ) )
   v ndigits buf))

(define-wrapper-type m256d)

;; (define (fmaddf a b c)
;;   ((external "simde_mm256_fmadd_pd" (=> ((^ float) (^ float) (^ float)) (^ float) ) )
;;   a b c))

;; simde__m256d evens4 = simde_mm256_loadu_pd(l1);
(define (simde-loadu ds)
  ((external "simde_mm256_loadu_pd" (=> ((^ float)) m256d))
  ds ))

(define (simde-storeu ds avx)
  ((external "simde_mm256_storeu_pd" (=> ((^ float) m256d) (^ float)))
   ds avx)
  ds )

(define (simde-sub-pd ds1 ds2)
  ((external "simde_mm256_sub_pd" (=> (m256d m256d) m256d))
   ds1 ds2))

(define (main)
  (define out (current-output-port))

  (write-string "SIMDE: Print vec-a with vector-for-each:\n" out)

  (vector-for-each (lambda (i val)
                     (write-string " vec-a[" out)
                     (write-integer i out)
                     (write-string "] = " out)
                     (write-integer val out)
                     (write-string ", " out)
                     )
                   %vec-a %len-a)
  (newline out)
  (let ((target (make-string 20))
        (f 1.2)
        (a (make-vector 10 1.1))
        (b (make-vector 10 1.1))
        (c (make-vector 10 1.1))
        )
    (gcvt f 4 target)
    (write-string target out)
    (newline out)
    (vector-set! a 0 2.2)
    (vector-set! a 1 2.2)
    (vector-set! a 2 4.2)
    (vector-set! a 3 5.2)
    (vector-set! b 0 1.1)
    (vector-set! b 1 2.1)
    (vector-set! b 2 3.1)
    (vector-set! b 3 4.1)
    (let* ((evens (simde-loadu a))
           (odds (simde-loadu b))
           (result (simde-storeu a (simde-sub-pd evens odds))))
      (vector-for-each (lambda (i val)
                         ;; (flonum-set! val i)
                         (gcvt val 4 target)
                         (write-string target out)
                         (newline out)
                         )
                       result 4)
      )
    )
  (newline out)
  0
)