summaryrefslogtreecommitdiffstats
path: root/src/mesa
diff options
context:
space:
mode:
Diffstat (limited to 'src/mesa')
-rw-r--r--src/mesa/main/texcompress_fxt1.c93
1 files changed, 64 insertions, 29 deletions
diff --git a/src/mesa/main/texcompress_fxt1.c b/src/mesa/main/texcompress_fxt1.c
index ded3a53f413..866485c4c79 100644
--- a/src/mesa/main/texcompress_fxt1.c
+++ b/src/mesa/main/texcompress_fxt1.c
@@ -282,6 +282,41 @@ const struct gl_texture_format _mesa_texformat_rgba_fxt1 = {
#define ISTBLACK(v) (*((unsigned long *)(v)) == 0)
+#ifdef __GNUC__
+
+#define FX64_NATIVE 1
+
+typedef unsigned long long Fx64;
+
+#define FX64_MOV32(a, b) a = b;
+#define FX64_OR32(a, b) a |= b;
+#define FX64_SHL(a, c) a <<= c;
+
+#else /* !__GNUC__ */
+
+#define FX64_NATIVE 0
+
+typedef struct {
+ unsigned long lo, hi;
+} Fx64;
+
+#define FX64_MOV32(a, b) a.lo = b
+#define FX64_OR32(a, b) a.lo |= b
+
+#define FX64_SHL(a, c) \
+ do { \
+ if ((c) >= 32) { \
+ a.hi = a.lo << ((c) - 32); \
+ a.lo = 0; \
+ } else { \
+ a.hi = (a.hi << (c)) | (a.lo >> (32 - (c))); \
+ a.lo <<= (c); \
+ } \
+ } while (0)
+
+#endif /* !__GNUC__ */
+
+
static int
fxt1_bestcol (float vec[][MAX_COMP], int nv,
unsigned char input[MAX_COMP], int nc)
@@ -558,22 +593,22 @@ fxt1_quantize_CHROMA (unsigned long *cc,
const int n_comp = 3; /* 3 components: R, G, B */
float vec[MAX_VECT][MAX_COMP];
int i, j, k;
- unsigned long long hi; /* high quadword */
+ Fx64 hi; /* high quadword */
unsigned long lohi, lolo; /* low quadword: hi dword, lo dword */
if (fxt1_choose(vec, n_vect, input, n_comp, N_TEXELS) != 0) {
fxt1_lloyd(vec, n_vect, input, n_comp, N_TEXELS);
}
- hi = 4; /* cc-chroma = "010" + unused bit */
+ FX64_MOV32(hi, 4); /* cc-chroma = "010" + unused bit */
for (j = n_vect - 1; j >= 0; j--) {
for (i = 0; i < n_comp; i++) {
/* add in colors */
- hi <<= 5;
- hi |= (unsigned int)(vec[j][i] / 8.0);
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, (unsigned int)(vec[j][i] / 8.0));
}
}
- ((unsigned long long *)cc)[1] = hi;
+ ((Fx64 *)cc)[1] = hi;
lohi = lolo = 0;
/* right microtile */
@@ -600,7 +635,7 @@ fxt1_quantize_ALPHA0 (unsigned long *cc,
const int n_comp = 4; /* 4 components: R, G, B, A */
float vec[MAX_VECT][MAX_COMP];
int i, j, k;
- unsigned long long hi; /* high quadword */
+ Fx64 hi; /* high quadword */
unsigned long lohi, lolo; /* low quadword: hi dword, lo dword */
/* the last vector indicates zero */
@@ -613,20 +648,20 @@ fxt1_quantize_ALPHA0 (unsigned long *cc,
fxt1_lloyd(vec, n_vect, reord, n_comp, n);
}
- hi = 6; /* alpha = "011" + lerp = 0 */
+ FX64_MOV32(hi, 6); /* alpha = "011" + lerp = 0 */
for (j = n_vect - 1; j >= 0; j--) {
/* add in alphas */
- hi <<= 5;
- hi |= (unsigned int)(vec[j][ACOMP] / 8.0);
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, (unsigned int)(vec[j][ACOMP] / 8.0));
}
for (j = n_vect - 1; j >= 0; j--) {
for (i = 0; i < n_comp - 1; i++) {
/* add in colors */
- hi <<= 5;
- hi |= (unsigned int)(vec[j][i] / 8.0);
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, (unsigned int)(vec[j][i] / 8.0));
}
}
- ((unsigned long long *)cc)[1] = hi;
+ ((Fx64 *)cc)[1] = hi;
lohi = lolo = 0;
/* right microtile */
@@ -653,7 +688,7 @@ fxt1_quantize_ALPHA1 (unsigned long *cc,
float vec[1 + 1 + 1][MAX_COMP]; /* 1.5 extrema for each sub-block */
float b, iv[MAX_COMP]; /* interpolation vector */
int i, j, k;
- unsigned long long hi; /* high quadword */
+ Fx64 hi; /* high quadword */
unsigned long lohi, lolo; /* low quadword: hi dword, lo dword */
int minSum;
@@ -817,20 +852,20 @@ fxt1_quantize_ALPHA1 (unsigned long *cc,
cc[1] = lohi;
}
- hi = 7; /* alpha = "011" + lerp = 1 */
+ FX64_MOV32(hi, 7); /* alpha = "011" + lerp = 1 */
for (j = n_vect - 1; j >= 0; j--) {
/* add in alphas */
- hi <<= 5;
- hi |= (unsigned int)(vec[j][ACOMP] / 8.0);
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, (unsigned int)(vec[j][ACOMP] / 8.0));
}
for (j = n_vect - 1; j >= 0; j--) {
for (i = 0; i < n_comp - 1; i++) {
/* add in colors */
- hi <<= 5;
- hi |= (unsigned int)(vec[j][i] / 8.0);
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, (unsigned int)(vec[j][i] / 8.0));
}
}
- ((unsigned long long *)cc)[1] = hi;
+ ((Fx64 *)cc)[1] = hi;
}
@@ -940,7 +975,7 @@ fxt1_quantize_MIXED1 (unsigned long *cc,
unsigned char vec[2 * 2][MAX_COMP]; /* 2 extrema for each sub-block */
float b, iv[MAX_COMP]; /* interpolation vector */
int i, j, k;
- unsigned long long hi; /* high quadword */
+ Fx64 hi; /* high quadword */
unsigned long lohi, lolo; /* low quadword: hi dword, lo dword */
int minSum;
@@ -1101,15 +1136,15 @@ fxt1_quantize_MIXED1 (unsigned long *cc,
}
}
- hi = 9 | (vec[3][GCOMP] & 4) | ((vec[1][GCOMP] >> 1) & 2); /* chroma = "1" */
+ FX64_MOV32(hi, 9 | (vec[3][GCOMP] & 4) | ((vec[1][GCOMP] >> 1) & 2)); /* chroma = "1" */
for (j = 2 * 2 - 1; j >= 0; j--) {
for (i = 0; i < n_comp; i++) {
/* add in colors */
- hi <<= 5;
- hi |= vec[j][i] >> 3;
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, vec[j][i] >> 3);
}
}
- ((unsigned long long *)cc)[1] = hi;
+ ((Fx64 *)cc)[1] = hi;
}
@@ -1122,7 +1157,7 @@ fxt1_quantize_MIXED0 (unsigned long *cc,
unsigned char vec[2 * 2][MAX_COMP]; /* 2 extrema for each sub-block */
float b, iv[MAX_COMP]; /* interpolation vector */
int i, j, k;
- unsigned long long hi; /* high quadword */
+ Fx64 hi; /* high quadword */
unsigned long lohi, lolo; /* low quadword: hi dword, lo dword */
int minColL, maxColL;
@@ -1314,15 +1349,15 @@ fxt1_quantize_MIXED0 (unsigned long *cc,
cc[1] = lohi;
}
- hi = 8 | (vec[3][GCOMP] & 4) | ((vec[1][GCOMP] >> 1) & 2); /* chroma = "1" */
+ FX64_MOV32(hi, 8 | (vec[3][GCOMP] & 4) | ((vec[1][GCOMP] >> 1) & 2)); /* chroma = "1" */
for (j = 2 * 2 - 1; j >= 0; j--) {
for (i = 0; i < n_comp; i++) {
/* add in colors */
- hi <<= 5;
- hi |= vec[j][i] >> 3;
+ FX64_SHL(hi, 5);
+ FX64_OR32(hi, vec[j][i] >> 3);
}
}
- ((unsigned long long *)cc)[1] = hi;
+ ((Fx64 *)cc)[1] = hi;
}