Mercurial > hg > dmlib
comparison src/dmblitfunc.h @ 2038:b5cd0435e186
Use __asm__() instead of "GCC-specific" asm() for inline assembly.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Fri, 30 Nov 2018 06:43:58 +0200 |
parents | 582d49915059 |
children |
comparison
equal
deleted
inserted
replaced
2037:01fbcfc969e4 | 2038:b5cd0435e186 |
---|---|
99 const Uint64 qpdrm = 0xff00ff00ff00ffULL; | 99 const Uint64 qpdrm = 0xff00ff00ff00ffULL; |
100 | 100 |
101 #define DM_BLITFUNC_SRC_TYPE Uint32 | 101 #define DM_BLITFUNC_SRC_TYPE Uint32 |
102 #define DM_BLITFUNC_DST_TYPE Uint32 | 102 #define DM_BLITFUNC_DST_TYPE Uint32 |
103 #define DM_BLITFUNC_INNER \ | 103 #define DM_BLITFUNC_INNER \ |
104 asm( \ | 104 __asm__( \ |
105 "movd %2, %%mm1\n" \ | 105 "movd %2, %%mm1\n" \ |
106 \ | 106 \ |
107 "movd %3, %%mm2\n" \ | 107 "movd %3, %%mm2\n" \ |
108 "movq %%mm1, %%mm5\n" \ | 108 "movq %%mm1, %%mm5\n" \ |
109 "pand %%mm2, %%mm5\n" \ | 109 "pand %%mm2, %%mm5\n" \ |
125 "movd %%mm1, %0\n" \ | 125 "movd %%mm1, %0\n" \ |
126 : "=m" (*dp) \ | 126 : "=m" (*dp) \ |
127 : "m" (*dp), "m" (sp[FP_GETH16(xv)]), "m" (qpdmask), "m" (qpdrm) \ | 127 : "m" (*dp), "m" (sp[FP_GETH16(xv)]), "m" (qpdmask), "m" (qpdrm) \ |
128 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; | 128 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; |
129 | 129 |
130 #define DM_BLITFUNC_FINISH asm("emms\n"); | 130 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
131 | 131 |
132 #else | 132 #else |
133 | 133 |
134 #define DM_BLITFUNC_SRC_TYPE DMColor | 134 #define DM_BLITFUNC_SRC_TYPE DMColor |
135 #define DM_BLITFUNC_DST_TYPE DMColor | 135 #define DM_BLITFUNC_DST_TYPE DMColor |
178 const Uint64 qpdrm = 0xff00ff00ff00ffULL; | 178 const Uint64 qpdrm = 0xff00ff00ff00ffULL; |
179 | 179 |
180 #define DM_BLITFUNC_SRC_TYPE Uint32 | 180 #define DM_BLITFUNC_SRC_TYPE Uint32 |
181 #define DM_BLITFUNC_DST_TYPE Uint32 | 181 #define DM_BLITFUNC_DST_TYPE Uint32 |
182 #define DM_BLITFUNC_INNER_INIT \ | 182 #define DM_BLITFUNC_INNER_INIT \ |
183 asm( \ | 183 __asm__( \ |
184 "movd %0, %%mm4\n" \ | 184 "movd %0, %%mm4\n" \ |
185 "punpcklwd %%mm4, %%mm4\n" \ | 185 "punpcklwd %%mm4, %%mm4\n" \ |
186 "punpckldq %%mm4, %%mm4\n" \ | 186 "punpckldq %%mm4, %%mm4\n" \ |
187 : \ | 187 : \ |
188 : "m" (alpha) \ | 188 : "m" (alpha) \ |
189 : "%mm4" ); | 189 : "%mm4" ); |
190 | 190 |
191 #define DM_BLITFUNC_INNER \ | 191 #define DM_BLITFUNC_INNER \ |
192 asm( \ | 192 __asm__( \ |
193 "movd %2, %%mm1\n" \ | 193 "movd %2, %%mm1\n" \ |
194 \ | 194 \ |
195 "movd %3, %%mm2\n" \ | 195 "movd %3, %%mm2\n" \ |
196 "movq %%mm1, %%mm5\n" \ | 196 "movq %%mm1, %%mm5\n" \ |
197 "pand %%mm2, %%mm5\n" \ | 197 "pand %%mm2, %%mm5\n" \ |
216 "movd %%mm1, %0\n" \ | 216 "movd %%mm1, %0\n" \ |
217 : "=m" (*dp) \ | 217 : "=m" (*dp) \ |
218 : "m" (*dp), "m" (sp[FP_GETH16(xv)]), "m" (qpdmask), "m" (qpdrm) \ | 218 : "m" (*dp), "m" (sp[FP_GETH16(xv)]), "m" (qpdmask), "m" (qpdrm) \ |
219 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; | 219 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; |
220 | 220 |
221 #define DM_BLITFUNC_FINISH asm("emms\n"); | 221 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
222 | 222 |
223 #else | 223 #else |
224 | 224 |
225 #define DM_BLITFUNC_SRC_TYPE DMColor | 225 #define DM_BLITFUNC_SRC_TYPE DMColor |
226 #define DM_BLITFUNC_DST_TYPE DMColor | 226 #define DM_BLITFUNC_DST_TYPE DMColor |
263 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ | 263 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ |
264 pal = (DMColor *) src->format->palette->colors; | 264 pal = (DMColor *) src->format->palette->colors; |
265 | 265 |
266 #ifdef DM_USE_SIMD | 266 #ifdef DM_USE_SIMD |
267 #define DM_BLITFUNC_INNER \ | 267 #define DM_BLITFUNC_INNER \ |
268 asm("movd %2, %%mm1\n" \ | 268 __asm__("movd %2, %%mm1\n" \ |
269 "movd %1, %%mm2\n" \ | 269 "movd %1, %%mm2\n" \ |
270 "paddusb %%mm2, %%mm1\n" \ | 270 "paddusb %%mm2, %%mm1\n" \ |
271 "movd %%mm1, %0\n" \ | 271 "movd %%mm1, %0\n" \ |
272 : "=m" (*dp) \ | 272 : "=m" (*dp) \ |
273 : "m" (*dp), "m" (pal[sp[FP_GETH16(xv)]]) \ | 273 : "m" (*dp), "m" (pal[sp[FP_GETH16(xv)]]) \ |
274 : "memory", "%mm1", "%mm2" ); dp++; | 274 : "memory", "%mm1", "%mm2" ); dp++; |
275 | 275 |
276 #define DM_BLITFUNC_FINISH asm("emms\n"); | 276 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
277 #else | 277 #else |
278 #define DM_BLITFUNC_INNER \ | 278 #define DM_BLITFUNC_INNER \ |
279 const DMColor q = pal[sp[FP_GETH16(xv)]]; \ | 279 const DMColor q = pal[sp[FP_GETH16(xv)]]; \ |
280 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ | 280 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ |
281 dp->r = qr < 256 ? qr : 255; \ | 281 dp->r = qr < 256 ? qr : 255; \ |
296 | 296 |
297 #ifdef DM_USE_SIMD | 297 #ifdef DM_USE_SIMD |
298 #define DM_BLITFUNC_SRC_TYPE Uint32 | 298 #define DM_BLITFUNC_SRC_TYPE Uint32 |
299 #define DM_BLITFUNC_DST_TYPE Uint32 | 299 #define DM_BLITFUNC_DST_TYPE Uint32 |
300 #define DM_BLITFUNC_INNER \ | 300 #define DM_BLITFUNC_INNER \ |
301 asm("movd %2, %%mm1\n" \ | 301 __asm__("movd %2, %%mm1\n" \ |
302 "movd %1, %%mm2\n" \ | 302 "movd %1, %%mm2\n" \ |
303 "paddusb %%mm2, %%mm1\n" \ | 303 "paddusb %%mm2, %%mm1\n" \ |
304 "movd %%mm1, %0\n" \ | 304 "movd %%mm1, %0\n" \ |
305 : "=m" (*dp) \ | 305 : "=m" (*dp) \ |
306 : "m" (*dp), "m" (sp[FP_GETH16(xv)]) \ | 306 : "m" (*dp), "m" (sp[FP_GETH16(xv)]) \ |
307 : "memory", "%mm1", "%mm2" ); dp++; | 307 : "memory", "%mm1", "%mm2" ); dp++; |
308 | 308 |
309 #define DM_BLITFUNC_FINISH asm("emms\n"); | 309 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
310 #else | 310 #else |
311 #define DM_BLITFUNC_SRC_TYPE DMColor | 311 #define DM_BLITFUNC_SRC_TYPE DMColor |
312 #define DM_BLITFUNC_DST_TYPE DMColor | 312 #define DM_BLITFUNC_DST_TYPE DMColor |
313 #define DM_BLITFUNC_INNER \ | 313 #define DM_BLITFUNC_INNER \ |
314 const DMColor q = sp[FP_GETH16(xv)]; \ | 314 const DMColor q = sp[FP_GETH16(xv)]; \ |
423 const Uint64 qpdrm = 0xff00ff00ff00ffULL; | 423 const Uint64 qpdrm = 0xff00ff00ff00ffULL; |
424 | 424 |
425 #define DM_BLITFUNC_SRC_TYPE Uint32 | 425 #define DM_BLITFUNC_SRC_TYPE Uint32 |
426 #define DM_BLITFUNC_DST_TYPE Uint32 | 426 #define DM_BLITFUNC_DST_TYPE Uint32 |
427 #define DM_BLITFUNC_INNER \ | 427 #define DM_BLITFUNC_INNER \ |
428 asm( \ | 428 __asm__( \ |
429 "movd %2, %%mm1\n" \ | 429 "movd %2, %%mm1\n" \ |
430 \ | 430 \ |
431 "movd %3, %%mm2\n" \ | 431 "movd %3, %%mm2\n" \ |
432 "movq %%mm1, %%mm5\n" \ | 432 "movq %%mm1, %%mm5\n" \ |
433 "pand %%mm2, %%mm5\n" \ | 433 "pand %%mm2, %%mm5\n" \ |
449 "movd %%mm1, %0\n" \ | 449 "movd %%mm1, %0\n" \ |
450 : "=m" (*dp) \ | 450 : "=m" (*dp) \ |
451 : "m" (*dp), "m" (sp[xv]), "m" (qpdmask), "m" (qpdrm) \ | 451 : "m" (*dp), "m" (sp[xv]), "m" (qpdmask), "m" (qpdrm) \ |
452 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; | 452 : "memory", "%mm1", "%mm2", "%mm3", "%mm4", "%mm5" ); dp++; |
453 | 453 |
454 #define DM_BLITFUNC_FINISH asm("emms\n"); | 454 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
455 | 455 |
456 #else | 456 #else |
457 | 457 |
458 #define DM_BLITFUNC_SRC_TYPE DMColor | 458 #define DM_BLITFUNC_SRC_TYPE DMColor |
459 #define DM_BLITFUNC_DST_TYPE DMColor | 459 #define DM_BLITFUNC_DST_TYPE DMColor |
496 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ | 496 if (src->format->palette == NULL || src->format->palette->ncolors < 256) return -2; \ |
497 pal = (DMColor *) src->format->palette->colors; | 497 pal = (DMColor *) src->format->palette->colors; |
498 | 498 |
499 #ifdef DM_USE_SIMD | 499 #ifdef DM_USE_SIMD |
500 #define DM_BLITFUNC_INNER \ | 500 #define DM_BLITFUNC_INNER \ |
501 asm("movd %2, %%mm1\n" \ | 501 __asm__("movd %2, %%mm1\n" \ |
502 "movd %1, %%mm2\n" \ | 502 "movd %1, %%mm2\n" \ |
503 "paddusb %%mm2, %%mm1\n" \ | 503 "paddusb %%mm2, %%mm1\n" \ |
504 "movd %%mm1, %0\n" \ | 504 "movd %%mm1, %0\n" \ |
505 : "=m" (*dp) \ | 505 : "=m" (*dp) \ |
506 : "m" (*dp), "m" (pal[sp[xv]]) \ | 506 : "m" (*dp), "m" (pal[sp[xv]]) \ |
507 : "memory", "%mm1", "%mm2" ); dp++; | 507 : "memory", "%mm1", "%mm2" ); dp++; |
508 | 508 |
509 #define DM_BLITFUNC_FINISH asm("emms\n"); | 509 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
510 #else | 510 #else |
511 #define DM_BLITFUNC_INNER \ | 511 #define DM_BLITFUNC_INNER \ |
512 const DMColor q = pal[sp[xv]]; \ | 512 const DMColor q = pal[sp[xv]]; \ |
513 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ | 513 const int qr = dp->r + q.r, qg = dp->g + q.g, qb = dp->b + q.b; \ |
514 dp->r = qr < 256 ? qr : 255; \ | 514 dp->r = qr < 256 ? qr : 255; \ |
529 | 529 |
530 #ifdef DM_USE_SIMD | 530 #ifdef DM_USE_SIMD |
531 #define DM_BLITFUNC_SRC_TYPE Uint32 | 531 #define DM_BLITFUNC_SRC_TYPE Uint32 |
532 #define DM_BLITFUNC_DST_TYPE Uint32 | 532 #define DM_BLITFUNC_DST_TYPE Uint32 |
533 #define DM_BLITFUNC_INNER \ | 533 #define DM_BLITFUNC_INNER \ |
534 asm("movd %2, %%mm1\n" \ | 534 __asm__("movd %2, %%mm1\n" \ |
535 "movd %1, %%mm2\n" \ | 535 "movd %1, %%mm2\n" \ |
536 "paddusb %%mm2, %%mm1\n" \ | 536 "paddusb %%mm2, %%mm1\n" \ |
537 "movd %%mm1, %0\n" \ | 537 "movd %%mm1, %0\n" \ |
538 : "=m" (*dp) \ | 538 : "=m" (*dp) \ |
539 : "m" (*dp), "m" (sp[xv]) \ | 539 : "m" (*dp), "m" (sp[xv]) \ |
540 : "memory", "%mm1", "%mm2" ); dp++; | 540 : "memory", "%mm1", "%mm2" ); dp++; |
541 | 541 |
542 #define DM_BLITFUNC_FINISH asm("emms\n"); | 542 #define DM_BLITFUNC_FINISH __asm__("emms\n"); |
543 #else | 543 #else |
544 #define DM_BLITFUNC_SRC_TYPE DMColor | 544 #define DM_BLITFUNC_SRC_TYPE DMColor |
545 #define DM_BLITFUNC_DST_TYPE DMColor | 545 #define DM_BLITFUNC_DST_TYPE DMColor |
546 #define DM_BLITFUNC_INNER \ | 546 #define DM_BLITFUNC_INNER \ |
547 const DMColor q = sp[xv]; \ | 547 const DMColor q = sp[xv]; \ |