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 }