From 7d39c1ae76cc7dc6793980fd83db100399ee9179 Mon Sep 17 00:00:00 2001 From: Brian Date: Sat, 10 Mar 2007 11:50:50 -0700 Subject: [PATCH] Fix TEXREL issues. Patch submitted by Christoph Brill. See http://www.gentoo.org/proj/en/hardened/pic-fix-guide.xml --- src/mesa/x86/mmx_blend.S | 41 +++++++++++++-- src/mesa/x86/read_rgba_span_x86.S | 86 +++++++++++++++++++++++++++++++ 2 files changed, 122 insertions(+), 5 deletions(-) diff --git a/src/mesa/x86/mmx_blend.S b/src/mesa/x86/mmx_blend.S index 397d635a621..20ac5a20adf 100644 --- a/src/mesa/x86/mmx_blend.S +++ b/src/mesa/x86/mmx_blend.S @@ -1,4 +1,4 @@ - + ; /* * Written by José Fonseca */ @@ -240,7 +240,9 @@ TWO(PUNPCKHDQ ( MA2, MA2 )) /* pa2 | pa2 | pa ONE(MOVD ( MSS, REGIND(rgba) )) /* | | | | sa1 | sb1 | sg1 | sr1 */ ;\ TWO(MOVQ ( MSS, REGIND(rgba) )) /* sa2 | sb2 | sg2 | sr2 | sa1 | sb1 | sg1 | sr1 */ - +/* Kevin F. Quinn 2 July 2006 + * Replace data segment constants with text-segment + * constants (via pushl/movq) SEG_DATA ALIGNDATA8 @@ -249,6 +251,11 @@ const_0080: const_80: D_LONG 0x80808080, 0x80808080 +*/ +#define const_0080_l 0x00800080 +#define const_0080_h 0x00800080 +#define const_80_l 0x80808080 +#define const_80_h 0x80808080 SEG_TEXT @@ -302,8 +309,16 @@ TWO(MOVQ ( MM1, REGIND(rgba) )) #define TAG(x) CONCAT(x,_min) #define LLTAG(x) LLBL2(x,_min) +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions +#define INIT \ + MOVQ ( CONTENT(const_80), MM7 ) + */ #define INIT \ - MOVQ ( CONTENT(const_80), MM7 ) /* 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80*/ + PUSH_L ( CONST(const_80_h) ) /* 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80*/ ;\ + PUSH_L ( CONST(const_80_l) ) ;\ + MOVQ ( REGIND(ESP), MM7 ) ;\ + ADD_L ( CONST(8), ESP) #define MAIN( rgba, dest ) \ GMB_LOAD( rgba, dest, MM1, MM2 ) ;\ @@ -326,8 +341,16 @@ TWO(MOVQ ( MM1, REGIND(rgba) )) #define TAG(x) CONCAT(x,_max) #define LLTAG(x) LLBL2(x,_max) +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions #define INIT \ - MOVQ ( CONTENT(const_80), MM7 ) /* 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80*/ + MOVQ ( CONTENT(const_80), MM7 ) + */ +#define INIT \ + PUSH_L ( CONST(const_80_l) ) /* 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80| 0x80*/ ;\ + PUSH_L ( CONST(const_80_h) ) ;\ + MOVQ ( REGIND(ESP), MM7 ) ;\ + ADD_L ( CONST(8), ESP) #define MAIN( rgba, dest ) \ GMB_LOAD( rgba, dest, MM1, MM2 ) ;\ @@ -350,9 +373,17 @@ TWO(MOVQ ( MM1, REGIND(rgba) )) #define TAG(x) CONCAT(x,_modulate) #define LLTAG(x) LLBL2(x,_modulate) +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions +#define INIT \ + MOVQ ( CONTENT(const_0080), MM7 ) + */ #define INIT \ PXOR ( MM0, MM0 ) /* 0x0000 | 0x0000 | 0x0000 | 0x0000 */ ;\ - MOVQ ( CONTENT(const_0080), MM7 ) /* 0x0080 | 0x0080 | 0x0080 | 0x0080 */ + PUSH_L ( CONST(const_0080_l) ) /* 0x0080 | 0x0080 | 0x0080 | 0x0080 */ ;\ + PUSH_L ( CONST(const_0080_h) ) ;\ + MOVQ ( REGIND(ESP), MM7 ) ;\ + ADD_L ( CONST(8), ESP) #define MAIN( rgba, dest ) \ GMB_LOAD( rgba, dest, MM1, MM2 ) ;\ diff --git a/src/mesa/x86/read_rgba_span_x86.S b/src/mesa/x86/read_rgba_span_x86.S index 960cffa50bc..a6902838164 100644 --- a/src/mesa/x86/read_rgba_span_x86.S +++ b/src/mesa/x86/read_rgba_span_x86.S @@ -32,6 +32,8 @@ .file "read_rgba_span_x86.S" #if !defined(__DJGPP__) && !defined(__MINGW32__) /* this one cries for assyntax.h */ +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions .section .rodata .align 16 .type mask, @object @@ -45,6 +47,19 @@ mask: .long 0x00ff0000 .long 0x00ff0000 .long 0x00ff0000 + */ +#define LOAD_MASK(mvins,m1,m2) \ + pushl $0xff00ff00 ;\ + pushl $0xff00ff00 ;\ + pushl $0xff00ff00 ;\ + pushl $0xff00ff00 ;\ + mvins (%esp), m1 ;\ + pushl $0x00ff0000 ;\ + pushl $0x00ff0000 ;\ + pushl $0x00ff0000 ;\ + pushl $0x00ff0000 ;\ + mvins (%esp), m2 ;\ + addl $32, %esp /* I implemented these as macros because the appear in quite a few places, @@ -84,8 +99,12 @@ _generic_read_RGBA_span_BGRA8888_REV_MMX: #ifdef USE_INNER_EMMS emms #endif +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions movq mask, %mm1 movq mask+16, %mm2 + */ + LOAD_MASK(movq,%mm1,%mm2) movl 8(%esp), %ebx /* source pointer */ movl 16(%esp), %edx /* number of pixels to copy */ @@ -182,8 +201,12 @@ _generic_read_RGBA_span_BGRA8888_REV_SSE: #ifdef USE_INNER_EMMS emms #endif +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions movq mask, %mm1 movq mask+16, %mm2 + */ + LOAD_MASK(movq,%mm1,%mm2) movl 16(%esp), %ebx /* source pointer */ movl 24(%esp), %edx /* number of pixels to copy */ @@ -341,8 +364,12 @@ _generic_read_RGBA_span_BGRA8888_REV_SSE2: pushl %esi pushl %ebx +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions movdqa mask, %xmm1 movdqa mask+16, %xmm2 + */ + LOAD_MASK(movdqa,%xmm1,%xmm2) movl 12(%esp), %ebx /* source pointer */ movl 20(%esp), %edx /* number of pixels to copy */ @@ -464,6 +491,10 @@ _generic_read_RGBA_span_BGRA8888_REV_SSE2: +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions + */ +#if 0 .section .rodata .align 16 @@ -510,6 +541,26 @@ scale: alpha: .long 0x00000000 .long 0x00ff0000 +#endif + +#define MASK_565_L 0x07e0f800 +#define MASK_565_H 0x0000001f +#define SCALE_ADJUST 5 +#if SCALE_ADJUST == 5 +#define PRESCALE_L 0x00100001 +#define PRESCALE_H 0x00000200 +#define SCALE_L 0x40C620E8 +#define SCALE_H 0x0000839d +#elif SCALE_ADJUST == 0 +#define PRESCALE_L 0x00200001 +#define PRESCALE_H 0x00000800 +#define SCALE_L 0x01040108 +#define SCALE_H 0x00000108 +#else +#error SCALE_ADJUST must either be 5 or 0. +#endif +#define ALPHA_L 0x00000000 +#define ALPHA_H 0x00ff0000 /** * MMX optimized version of the RGB565 to RGBA copy routine. @@ -530,9 +581,25 @@ _generic_read_RGBA_span_RGB565_MMX: movl 8(%esp), %edx /* destination pointer */ movl 12(%esp), %ecx /* number of pixels to copy */ +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions movq mask_565, %mm5 movq prescale, %mm6 movq scale, %mm7 + */ + pushl MASK_565_H + pushl MASK_565_L + movq (%esp), %mm5 + pushl PRESCALE_H + pushl PRESCALE_L + movq (%esp), %mm6 + pushl SCALE_H + pushl SCALE_L + movq (%esp), %mm7 + pushl ALPHA_H + pushl ALPHA_L + movq (%esp), %mm3 + addl $32,%esp sarl $2, %ecx jle .L01 /* Bail early if the count is negative. */ @@ -581,8 +648,13 @@ _generic_read_RGBA_span_RGB565_MMX: /* Always set the alpha value to 0xff. */ +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions por alpha, %mm0 por alpha, %mm2 + */ + por %mm3, %mm0 + por %mm3, %mm2 /* Pack the 16-bit values to 8-bit values and store the converted @@ -609,8 +681,13 @@ _generic_read_RGBA_span_RGB565_MMX: pmulhuw %mm7, %mm0 pmulhuw %mm7, %mm2 +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions por alpha, %mm0 por alpha, %mm2 + */ + por %mm3, %mm0 + por %mm3, %mm2 packuswb %mm2, %mm0 @@ -647,8 +724,13 @@ _generic_read_RGBA_span_RGB565_MMX: pmulhuw %mm7, %mm0 pmulhuw %mm7, %mm2 +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions por alpha, %mm0 por alpha, %mm2 + */ + por %mm3, %mm0 + por %mm3, %mm2 packuswb %mm2, %mm0 @@ -675,7 +757,11 @@ _generic_read_RGBA_span_RGB565_MMX: #endif pmulhuw %mm7, %mm0 +/* Kevin F. Quinn 2nd July 2006 + * Replace data segment constants with text-segment instructions por alpha, %mm0 + */ + por %mm3, %mm0 packuswb %mm0, %mm0 -- 2.30.2