root/trunk/fakesse.h

Revision 33, 3.3 KB (checked in by mike, 5 years ago)

Fixed brokeness. Now the world is dynamically sized

Line 
1/*
2 * Copyright (C) 2007 Michael Lewis
3 * Author: Mike Lewis <mikelikespie@gmail.com>
4 *
5 * This work is provide AS IS, and has no warranty.
6 * The author is NOT responsible for anything that happens
7 * due to use of this code, either using it or running it on
8 * your system
9 */
10#ifndef _FAKE_SSE_INCLUDED
11#define _FAKE_SSE_INCLUDED
12#ifndef __SSE2__
13#include <stdlib.h>
14#include <string.h>
15
16#ifdef __APPLE__
17#include <inttypes.h>
18#endif
19/*
20typedef struct {
21    union {
22        unsigned char byte[16];
23        uint32_t int32[4];
24    } u;
25} __m128i;
26*/
27//Shifts this to the left all the way
28static inline __m128i _mm_srli_epi32( __m128i A, int count ) {
29//printf("_mm_srli_epi32\n");
30
31    int i;
32    for( i = 0; i < 4; i++ ) {
33        A.u.int32[i] = A.u.int32[i] >> count;
34    }
35    return A;
36}
37
38static inline __m128i _mm_slli_epi32( __m128i A, int count ) {
39//printf("_mm_slli_epi32\n");
40    int i;
41    for( i = 0; i < 4; i++ ) {
42        A.u.int32[i] = A.u.int32[i] << count;
43    }
44    return A;
45}
46
47static inline __m128i _mm_slli_si128( __m128i A, int imm ) {
48//printf("_mm_srli_si128\n");
49    int i;
50    __m128i ret;
51    for( i = imm; i < 16; i++ ) {
52        ret.u.byte[i] = A.u.byte[i-imm];
53    }
54    for( i = 0; i < imm; i++ ) {
55        ret.u.byte[i] = 0x00;
56    }
57    return ret;
58}
59
60static inline __m128i _mm_srli_si128( __m128i A, int imm ) {
61//printf("_mm_slli_si128\n");
62    int i;
63    __m128i ret;
64    for( i = 0; i < 16-imm; i++ ) {
65        ret.u.byte[i] = A.u.byte[i+imm];
66    }
67    for( i = 16-imm; i < 16; i++ ) {
68        ret.u.byte[i] = 0x00;
69    }
70    return ret;
71}
72
73static inline __m128i _mm_setzero_si128() {
74//printf("_mm_setzero_si128\n");
75    __m128i r;
76    memset( &r, 0, sizeof( r ));
77    return r;
78}
79
80static inline __m128i _mm_cmpeq_epi8( __m128i A, __m128i B ) { 
81//printf("_mm_cmpeq_epi8\n");
82    __m128i ret;
83    int i;
84    for( i = 0; i < 16; i++ ) {
85        ret.u.byte[i] = ( A.u.byte[i] == B.u.byte[i] ) ? 0xFF : 0x00;
86    }
87    return ret;
88}
89static inline __m128i _mm_add_epi8( __m128i A, __m128i B ) { 
90//printf("_mm_add_epi8\n");
91    __m128i ret;
92    int i;
93    for( i = 0; i < 16; i++ ) {
94        ret.u.byte[i] = A.u.byte[i] + B.u.byte[i];
95    }
96    return ret;
97}
98
99static inline __m128i _mm_set_epi8 (char __q15, char __q14, char __q13, char __q12,
100          char __q11, char __q10, char __q09, char __q08,
101          char __q07, char __q06, char __q05, char __q04,
102          char __q03, char __q02, char __q01, char __q00)
103{
104//printf("_mm_set_epi8 \n");
105    __m128i ret;
106    ret.u.byte[15] = __q15;
107    ret.u.byte[14] = __q14;
108    ret.u.byte[13] = __q13;
109    ret.u.byte[12] = __q12;
110    ret.u.byte[11] = __q11;
111    ret.u.byte[10] = __q10;
112    ret.u.byte[9] = __q09;
113    ret.u.byte[8] = __q08;
114    ret.u.byte[7] = __q07;
115    ret.u.byte[6] = __q06;
116    ret.u.byte[5] = __q05;
117    ret.u.byte[4] = __q04;
118    ret.u.byte[3] = __q03;
119    ret.u.byte[2] = __q02;
120    ret.u.byte[1] = __q01;
121    ret.u.byte[0] = __q00;
122    return ret;
123}
124static inline __m128i _mm_set1_epi8 ( char f ) {
125//printf("_mm_set1_epi8 \n");
126    int i;
127    __m128i ret;
128    for( i = 0; i < 16; i++ ) {
129        ret.u.byte[i] = f;
130    }
131    return ret;
132}
133
134
135static inline __m128i _mm_and_si128( __m128i A, __m128i B ) {
136//printf("_mm_and_si128\n");
137    __m128i ret;
138    int i;
139    for( i = 0; i < 4; i++ ) {
140        ret.u.int32[i] = A.u.int32[i] & B.u.int32[i];
141    }
142    return ret;
143}
144
145static inline __m128i _mm_or_si128( __m128i A, __m128i B ) {
146//printf("_mm_or_si128\n");
147    __m128i ret;
148    int i;
149    for( i = 0; i < 4; i++ ) {
150        ret.u.int32[i] = A.u.int32[i] | B.u.int32[i];
151    }
152    return ret;
153}
154
155#endif
156#endif //_FAKE_SSE_INCLUDED
Note: See TracBrowser for help on using the browser.