summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorKeith Whitwell <[email protected]>2008-05-21 20:32:43 +0100
committerKeith Whitwell <[email protected]>2008-05-23 09:16:56 +0100
commit2302a5d3c1ea2c682dfc034012a054b8327a81de (patch)
tree1aae56c3625e05c986deec066fc13e118a142a37 /src
parent194a7be28f6eed502f2475d9a637cb3610ca75f6 (diff)
draw: fix fpu control word manipulations
Diffstat (limited to 'src')
-rw-r--r--src/gallium/auxiliary/draw/draw_vs_aos.c33
1 files changed, 20 insertions, 13 deletions
diff --git a/src/gallium/auxiliary/draw/draw_vs_aos.c b/src/gallium/auxiliary/draw/draw_vs_aos.c
index 67761f881d8..e736990acc7 100644
--- a/src/gallium/auxiliary/draw/draw_vs_aos.c
+++ b/src/gallium/auxiliary/draw/draw_vs_aos.c
@@ -690,41 +690,47 @@ static void x87_fstp_dest4( struct aos_compilation *cp,
x87_fstp_or_pop(cp->func, writemask, 3, ptr);
}
+#define FPU_MANIP 1
/* Save current x87 state and put it into single precision mode.
*/
static void save_fpu_state( struct aos_compilation *cp )
{
-#if 0
- x87_fnstcw( cp->func, x86_make_disp(regEDX, get_offset(m, &m->fpucntl_restore)));
- x87_fldcw( cp->func, );
+#if FPU_MANIP
+ x87_fnstcw( cp->func, x86_make_disp(cp->machine_EDX,
+ Offset(struct aos_machine, fpu_restore)));
#endif
}
static void restore_fpu_state( struct aos_compilation *cp )
{
-#if 0
+#if FPU_MANIP
x87_fnclex(cp->func);
- x87_fldcw(cp->func, x86_make_disp(regEDX, get_offset(m, &m->fpucntl_restore)));
+ x87_fldcw( cp->func, x86_make_disp(cp->machine_EDX,
+ Offset(struct aos_machine, fpu_restore)));
#endif
}
static void set_fpu_round_neg_inf( struct aos_compilation *cp )
{
-#if 0
- if (cp->fpucntl != RND_NEG_FPU) {
- struct x86_reg regEDX = x86_make_reg(file_REG32, reg_DX);
- struct arb_vp_machine *m = NULL;
-
- cp->fpucntl = RND_NEG_FPU;
+#if FPU_MANIP
+ if (cp->fpucntl != FPU_RND_NEG) {
+ cp->fpucntl = FPU_RND_NEG;
x87_fnclex(cp->func);
- x87_fldcw(cp->func, x86_make_disp(regEDX, get_offset(m, &m->fpucntl_rnd_neg)));
+ x87_fldcw( cp->func, x86_make_disp(cp->machine_EDX,
+ Offset(struct aos_machine, fpu_rnd_neg_inf)));
}
#endif
}
static void set_fpu_round_nearest( struct aos_compilation *cp )
{
-#if 0
+#if FPU_MANIP
+ if (cp->fpucntl != FPU_RND_NEAREST) {
+ cp->fpucntl = FPU_RND_NEAREST;
+ x87_fnclex(cp->func);
+ x87_fldcw( cp->func, x86_make_disp(cp->machine_EDX,
+ Offset(struct aos_machine, fpu_rnd_nearest)));
+ }
#endif
}
@@ -1590,6 +1596,7 @@ static boolean build_vertex_program( struct draw_vs_varient_aos_sse *varient,
Offset( struct draw_vs_varient_aos_sse, machine )));
save_fpu_state( &cp );
+ set_fpu_round_nearest( &cp );
/* Note address for loop jump
*/