-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsimd.x86.crm
More file actions
78 lines (57 loc) · 2.58 KB
/
Copy pathsimd.x86.crm
File metadata and controls
78 lines (57 loc) · 2.58 KB
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
import simd.*;
public import math.native.protocol.(sqrt);
import __intrinsics__.(
x86_sse2_max_sd as x86_maxsd,
x86_sse2_min_sd as x86_minsd,
x86_sse2_ucomieq_sd as x86_ucomieqsd,
x86_sse2_ucomige_sd as x86_ucomigesd,
x86_sse2_ucomigt_sd as x86_ucomigtsd,
x86_sse2_ucomile_sd as x86_ucomilesd,
x86_sse2_ucomilt_sd as x86_ucomiltsd,
x86_sse2_ucomineq_sd as x86_ucomineqsd,
x86_sse3_hadd_ps as x86_haddps,
x86_sse3_hsub_ps as x86_hsubps,
x86_sse3_hadd_pd as x86_haddpd,
x86_sse3_hsub_pd as x86_hsubpd,
x86_sse2_cmp_pd as x86_cmppd,
x86_sse2_cmp_sd as x86_cmpsd,
x86_sse2_movmsk_pd as x86_movmskpd,
sqrt as llvm_sqrt,
);
define hadd;
define hsub;
define movemask;
define compare;
alias VD2 = Vec[Double, 2];
alias V2[T] = Vec[T, 2];
[T,U when Numeric?(T,U)]
forceinline overload sqrt(x:T,y:U) = ..unpackVec(llvm_sqrt(Vec(Double(x),Double(y))));
[T when Numeric?(T)]
forceinline overload sqrt(x:T) = T(llvm_sqrt(Double(x)));
forceinline overload sqrt(x:Double) = llvm_sqrt(x);
[T when Numeric?(T)]
forceinline overload sqrt(x:V2[T]) = V2[T](llvm_sqrt(VD2(x)));
[T when Numeric?(T)]
forceinline overload hadd(x1:T,x2:T,y1:T,y2:T) = ..unpackVec(x86_haddpd(Vec(Double(x1),Double(x2)),Vec(Double(y1),Double(y2))));
[T,U when Numeric?(T,U)]
forceinline overload hadd(x1:T,x2:U) = toBiggerNumericType(T,U,x86_haddpd(Vec(Double(x1),Double(x2)),VD2())[0]);
[T when Numeric?(T)]
forceinline overload hadd(x:V2[T], y:V2[T]) = V2[T](x86_haddpd(VD2(x),VD2(y)));
[T when Numeric?(T)]
forceinline overload hadd(x:V2[T]) = V2[T](x86_haddpd(VD2(x),VD2(x)));
[T when Numeric?(T)]
forceinline overload hsub(x1:T,x2:T,y1:T,y2:T) = ..unpackVec(x86_hsubpd(Vec(Double(x1),Double(x2)),Vec(Double(y1),Double(y2))));
[T,U when Numeric?(T,U)]
forceinline overload hsub(x1:T,x2:U) = toBiggerNumericType(T,U,x86_hsubpd(Vec(Double(x1),Double(x2)),VD2())[0]);
[T when Numeric?(T)]
forceinline overload hsub(x:V2[T], y:V2[T]) = V2[T](x86_hsubpd(VD2(x),VD2(y)));
[T when Numeric?(T)]
forceinline overload compare(x1:T,x2:T,y1:T,y2:T,op:Int8) = ..unpackVec(x86_cmppd(Vec(Double(x1),Double(x2)),Vec(Double(y1),Double(y2)),op));
[T,U when Numeric?(T,U)]
forceinline overload compare(x1:T, x2:U, op:Int8) = toBiggerNumericType(T,U,x86_cmpsd(Vec(Double(x1),0.),Vec(Double(x2),0.),op)[0]);
[T when Numeric?(T)]
forceinline overload compare(x:V2[T], y:V2[T], op:Int8) = V2[T](x86_cmppd(VD2(x),VD2(y),op));
[T,U when Numeric?(T,U)]
forceinline overload movemask(x:T,y:U) = x86_movmskpd(Vec(Double(x),Double(y)));
[T when Numeric?(T)]
forceinline overload movemask(x:V2[T]) = x86_movmskpd(VD2(x));