1 /**
2 * Copyright: Copyright Auburn Sounds 2016-2018.
3 * License:   $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
4 * Authors:   Guillaume Piolat
5 */
6 module inteli.internals;
7 
8 version(LDC)
9 {
10     public import core.simd;
11     public import ldc.simd;
12     public import ldc.gccbuiltins_x86;
13     public import ldc.intrinsics;
14 }
15 
16 import inteli.types;
17 import core.stdc.stdio;
18 
19 package:
20 nothrow @nogc:
21 
22 // using the Intel terminology here
23 
24 byte saturateSignedWordToSignedByte(short value) pure @safe
25 {
26     if (value > 127) value = 127;
27     if (value < -128) value = -128;
28     return cast(byte) value;
29 }
30 
31 ubyte saturateSignedWordToUnsignedByte(short value) pure @safe
32 {
33     if (value > 255) value = 255;
34     if (value < 0) value = 0;
35     return cast(ubyte) value;
36 }
37 
38 short saturateSignedIntToSignedShort(int value) pure @safe
39 {
40     if (value > 32767) value = 32767;
41     if (value < -32768) value = -32768;
42     return cast(short) value;
43 }
44 
45 ushort saturateSignedIntToUnsignedShort(int value) pure @safe
46 {
47     if (value > 65535) value = 65535;
48     if (value < 0) value = 0;
49     return cast(ushort) value;
50 }
51 
52 unittest // test saturate operations
53 {
54     assert( saturateSignedWordToSignedByte(32000) == 127);
55     assert( saturateSignedWordToUnsignedByte(32000) == 255);
56     assert( saturateSignedWordToSignedByte(-4000) == -128);
57     assert( saturateSignedWordToUnsignedByte(-4000) == 0);
58     assert( saturateSignedIntToSignedShort(32768) == 32767);
59     assert( saturateSignedIntToUnsignedShort(32768) == 32768);
60     assert( saturateSignedIntToSignedShort(-32769) == -32768);
61     assert( saturateSignedIntToUnsignedShort(-32769) == 0);
62 }
63 
64 
65 // printing vectors for implementation
66 // Note: you can override `pure` within a `debug` clause
67 void _mm_print_epi32(__m128i v) @trusted
68 {
69     printf("%d %d %d %d\n",
70           v[0], v[1], v[2], v[3]);
71 }
72 
73 void _mm_print_epi16(__m128i v) @trusted
74 {
75     short8 C = cast(short8)v;
76     printf("%d %d %d %d %d %d %d %d\n",
77     C[0], C[1], C[2], C[3], C[4], C[5], C[6], C[7]);
78 }
79 
80 void _mm_print_epi8(__m128i v) @trusted
81 {
82     byte16 C = cast(byte16)v;
83     printf("%d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d\n",
84     C[0], C[1], C[2], C[3], C[4], C[5], C[6], C[7], C[8], C[9], C[10], C[11], C[12], C[13], C[14], C[15]);
85 }