Subversion Repositories eduke32

Rev

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