Subversion Repositories eduke32

Rev

Rev 5 | Rev 194 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed

Rev Author Line No. Line
5 Plagman 1
// Function-wrapped Watcom pragmas
2
// by Jonathon Fowler (jonof@edgenetwk.com)
3
//
4
// These functions represent some of the more longer-winded pragmas
5
// from the original pragmas.h wrapped into functions for easier
6
// use since many jumps and whatnot make it harder to write macro-
7
// inline versions. I'll eventually convert these to macro-inline
8
// equivalents.         --Jonathon
9
 
10
//#include "pragmas.h"
11
#include "compat.h"
12
 
13
long dmval;
14
 
15
#if defined(NOASM)
16
 
17
//
18
// Generic C version
19
//
20
 
21
void qinterpolatedown16(long bufptr, long num, long val, long add)
22
{ // gee, I wonder who could have provided this...
23
    long i, *lptr = (long *)bufptr;
24
    for(i=0;i<num;i++) { lptr[i] = (val>>16); val += add; }
25
}
26
 
27
void qinterpolatedown16short(long bufptr, long num, long val, long add)
28
{ // ...maybe the same person who provided this too?
29
    long i; short *sptr = (short *)bufptr;
30
    for(i=0;i<num;i++) { sptr[i] = (short)(val>>16); val += add; }
31
}
32
 
33
void clearbuf(void *d, long c, long a)
34
{
109 terminx 35
    long *p = (long*)d;
36
    while ((c--) > 0) *(p++) = a;
5 Plagman 37
}
38
 
39
void copybuf(void *s, void *d, long c)
40
{
109 terminx 41
    long *p = (long*)s, *q = (long*)d;
42
    while ((c--) > 0) *(q++) = *(p++);
5 Plagman 43
}
44
 
45
void swapbuf4(void *a, void *b, long c)
46
{
109 terminx 47
    long *p = (long*)a, *q = (long*)b;
48
    long x, y;
49
    while ((c--) > 0) {
50
        x = *q;
51
        y = *p;
52
        *(q++) = y;
53
        *(p++) = x;
54
    }
5 Plagman 55
}
56
 
57
void clearbufbyte(void *D, long c, long a)
58
{ // Cringe City
109 terminx 59
    char *p = (char*)D;
60
    long m[4] = { 0xffl,0xff00l,0xff0000l,0xff000000l };
61
    long n[4] = { 0,8,16,24 };
62
    long z=0;
63
    while ((c--) > 0) {
64
        *(p++) = (char)((a & m[z])>>n[z]);
65
        z=(z+1)&3;
66
    }
5 Plagman 67
}
68
 
69
void copybufbyte(void *S, void *D, long c)
70
{
109 terminx 71
    char *p = (char*)S, *q = (char*)D;
72
    while((c--) > 0) *(q++) = *(p++);
5 Plagman 73
}
74
 
75
void copybufreverse(void *S, void *D, long c)
76
{
109 terminx 77
    char *p = (char*)S, *q = (char*)D;
78
    while((c--) > 0) *(q++) = *(p--);
5 Plagman 79
}
80
 
81
#elif defined(__GNUC__) && defined(__i386__)    // NOASM
82
 
83
//
84
// GCC Inline Assembler version
85
//
86
 
87
#define ASM __asm__ __volatile__
88
 
89
 
90
long boundmulscale(long a, long b, long c)
91
{
109 terminx 92
    ASM (
93
        "imull %%ebx\n\t"
94
        "movl %%edx, %%ebx\n\t"         // mov ebx, edx
95
        "shrdl %%cl, %%edx, %%eax\n\t"  // mov eax, edx, cl
96
        "sarl %%cl, %%edx\n\t"          // sar edx, cl
97
        "xorl %%eax, %%edx\n\t"         // xor edx, eax
98
        "js 0f\n\t"                     // js checkit
99
        "xorl %%eax, %%edx\n\t"         // xor edx, eax
100
        "jz 1f\n\t"                     // js skipboundit
101
        "cmpl $0xffffffff, %%edx\n\t"   // cmp edx, 0xffffffff
102
        "je 1f\n\t"                     // je skipboundit
103
        "0:\n\t"                        // checkit:
104
        "movl %%ebx, %%eax\n\t"         // mov eax, ebx
105
        "sarl $31, %%eax\n\t"           // sar eax, 31
106
        "xorl $0x7fffffff, %%eax\n\t"   // xor eax, 0x7fffffff
107
        "1:"                            // skipboundit:
108
    : "+a" (a), "+b" (b), "+c" (c)      // input eax ebx ecx
109
                :
110
                : "edx", "cc"
111
            );
112
    return a;
5 Plagman 113
}
114
 
115
 
116
void clearbufbyte(void *D, long c, long a)
117
{
109 terminx 118
    ASM (
119
        "cmpl $4, %%ecx\n\t"
120
        "jae 1f\n\t"
121
        "testb $1, %%cl\n\t"
122
        "jz 0f\n\t"                     // jz preskip
123
        "stosb\n\t"
124
        "0:\n\t"                        // preskip:
125
        "shrl $1, %%ecx\n\t"
126
        "rep\n\t"
127
        "stosw\n\t"
128
        "jmp 5f\n\t"                    // jmp endit
129
        "1:\n\t"                        // intcopy:
130
        "testl $1, %%edi\n\t"
131
        "jz 2f\n\t"                     // jz skip1
132
        "stosb\n\t"
133
        "decl %%ecx\n\t"
134
        "2:\n\t"                        // skip1:
135
        "testl $2, %%edi\n\t"
136
        "jz 3f\n\t"                     // jz skip2
137
        "stosw\n\t"
138
        "subl $2, %%ecx\n\t"
139
        "3:\n\t"                        // skip2:
140
        "movl %%ecx, %%ebx\n\t"
141
        "shrl $2, %%ecx\n\t"
142
        "rep\n\t"
143
        "stosl\n\t"
144
        "testb $2, %%bl\n\t"
145
        "jz 4f\n\t"                     // jz skip3
146
        "stosw\n\t"
147
        "4:\n\t"                        // skip3:
148
        "testb $1, %%bl\n\t"
149
        "jz 5f\n\t"                     // jz endit
150
        "stosb\n\t"
151
        "5:"                            // endit
152
    : "+D" (D), "+c" (c), "+a" (a) :
153
                : "ebx", "memory", "cc"
154
            );
5 Plagman 155
}
156
 
157
void copybufbyte(void *S, void *D, long c)
158
{
109 terminx 159
    ASM (
160
        "cmpl $4, %%ecx\n\t"            // cmp ecx, 4
161
        "jae 1f\n\t"
162
        "testb $1, %%cl\n\t"            // test cl, 1
163
        "jz 0f\n\t"
164
        "movsb\n\t"
165
        "0:\n\t"                        // preskip:
166
        "shrl $1, %%ecx\n\t"            // shr ecx, 1
167
        "rep\n\t"
168
        "movsw\n\t"
169
        "jmp 5f\n\t"
170
        "1:\n\t"                        // intcopy:
171
        "testl $1, %%edi\n\t"           // test edi, 1
172
        "jz 2f\n\t"
173
        "movsb\n\t"
174
        "decl %%ecx\n\t"
175
        "2:\n\t"                        // skip1:
176
        "testl $2, %%edi\n\t"           // test edi, 2
177
        "jz 3f\n\t"
178
        "movsw\n\t"
179
        "subl $2, %%ecx\n\t"            // sub ecx, 2
180
        "3:\n\t"                        // skip2:
181
        "movl %%ecx, %%ebx\n\t"         // mov ebx, ecx
182
        "shrl $2, %%ecx\n\t"            // shr ecx ,2
183
        "rep\n\t"
184
        "movsl\n\t"
185
        "testb $2, %%bl\n\t"            // test bl, 2
186
        "jz 4f\n\t"
187
        "movsw\n\t"
188
        "4:\n\t"                        // skip3:
189
        "testb $1, %%bl\n\t"            // test bl, 1
190
        "jz 5f\n\t"
191
        "movsb\n\t"
192
        "5:"                            // endit:
193
    : "+c" (c), "+S" (S), "+D" (D) :
194
                : "ebx", "memory", "cc"
195
            );
5 Plagman 196
}
197
 
198
void copybufreverse(void *S, void *D, long c)
199
{
109 terminx 200
    ASM (
201
        "shrl $1, %%ecx\n\t"
202
        "jnc 0f\n\t"            // jnc skipit1
203
        "movb (%%esi), %%al\n\t"
204
        "decl %%esi\n\t"
205
        "movb %%al, (%%edi)\n\t"
206
        "incl %%edi\n\t"
207
        "0:\n\t"                // skipit1:
208
        "shrl $1, %%ecx\n\t"
209
        "jnc 1f\n\t"            // jnc skipit2
210
        "movw -1(%%esi), %%ax\n\t"
211
        "subl $2, %%esi\n\t"
212
        "rorw $8, %%ax\n\t"
213
        "movw %%ax, (%%edi)\n\t"
214
        "addl $2, %%edi\n\t"
215
        "1:\n\t"                // skipit2
216
        "testl %%ecx, %%ecx\n\t"
217
        "jz 3f\n\t"             // jz endloop
218
        "2:\n\t"                // begloop
219
        "movl -3(%%esi), %%eax\n\t"
220
        "subl $4, %%esi\n\t"
221
        "bswapl %%eax\n\t"
222
        "movl %%eax, (%%edi)\n\t"
223
        "addl $4, %%edi\n\t"
224
        "decl %%ecx\n\t"
225
        "jnz 2b\n\t"            // jnz begloop
226
        "3:"
227
    : "+S" (S), "+D" (D), "+c" (c) :
228
                : "eax", "memory", "cc"
229
            );
5 Plagman 230
}
231
 
232
#elif defined(__WATCOMC__)      // __GNUC__ && __i386__
233
 
234
//
235
// Watcom C Inline Assembler version
236
//
237
 
238
#elif defined(_MSC_VER)         // __WATCOMC__
239
 
240
//
241
// Microsoft C Inline Assembler version
242
//
243
 
244
#else                           // _MSC_VER
245
 
246
#error Unsupported compiler or architecture.
247
 
248
#endif
249
 
250