From 2cc0c3b99703bb10e0b320001183acb728e5488e Mon Sep 17 00:00:00 2001 From: Ian Romanick Date: Thu, 14 Feb 2008 18:29:51 -0800 Subject: Correct the convert to and from float instructions --- src/mesa/ppc/rtasm/spe_asm.c | 34 ++++++++++++++++++++++++++++++++++ src/mesa/ppc/rtasm/spe_asm.h | 12 ++++++++---- 2 files changed, 42 insertions(+), 4 deletions(-) (limited to 'src/mesa/ppc') diff --git a/src/mesa/ppc/rtasm/spe_asm.c b/src/mesa/ppc/rtasm/spe_asm.c index f8aff9050bf..10376372502 100644 --- a/src/mesa/ppc/rtasm/spe_asm.c +++ b/src/mesa/ppc/rtasm/spe_asm.c @@ -87,6 +87,20 @@ union spe_inst_RI7 { }; +/** + * Encode one output register with one input reg. and an 8-bit signed immed + */ +union spe_inst_RI8 { + uint32_t bits; + struct { + unsigned op:10; + unsigned i8:8; + unsigned rA:7; + unsigned rT:7; + } inst; +}; + + /** * Encode one output register with one input reg. and a 10-bit signed immed */ @@ -169,6 +183,20 @@ static void emit_RI7(struct spe_function *p, unsigned op, unsigned rT, +static void emit_RI8(struct spe_function *p, unsigned op, unsigned rT, + unsigned rA, int imm) +{ + union spe_inst_RI8 inst; + inst.inst.op = op; + inst.inst.i8 = imm; + inst.inst.rA = rA; + inst.inst.rT = rT; + *p->csr = inst.bits; + p->csr++; +} + + + static void emit_RI10(struct spe_function *p, unsigned op, unsigned rT, unsigned rA, int imm) { @@ -238,6 +266,12 @@ void _name (struct spe_function *p, unsigned rT, unsigned rA, int imm) \ emit_RI7(p, _op, rT, rA, imm); \ } +#define EMIT_RI8(_name, _op) \ +void _name (struct spe_function *p, unsigned rT, unsigned rA, int imm) \ +{ \ + emit_RI8(p, _op, rT, rA, 155 - imm); \ +} + #define EMIT_RI10(_name, _op) \ void _name (struct spe_function *p, unsigned rT, unsigned rA, int imm) \ { \ diff --git a/src/mesa/ppc/rtasm/spe_asm.h b/src/mesa/ppc/rtasm/spe_asm.h index 9532669b8c1..6d69ae655d1 100644 --- a/src/mesa/ppc/rtasm/spe_asm.h +++ b/src/mesa/ppc/rtasm/spe_asm.h @@ -60,6 +60,9 @@ extern void spe_release_func(struct spe_function *p); #define EMIT_RI7(_name, _op) \ extern void _name (struct spe_function *p, unsigned rT, unsigned rA, \ int imm) +#define EMIT_RI8(_name, _op) \ + extern void _name (struct spe_function *p, unsigned rT, unsigned rA, \ + int imm) #define EMIT_RI10(_name, _op) \ extern void _name (struct spe_function *p, unsigned rT, unsigned rA, \ int imm) @@ -270,10 +273,10 @@ EMIT_RR (spe_dfnma, 0x35f); EMIT_R (spe_frest, 0x1b8); EMIT_R (spe_frsqest, 0x1b9); EMIT_RR (spe_fi, 0x3d4); -EMIT_RI7 (spe_csflt, 0x3da); -EMIT_RI7 (spe_cflts, 0x3d8); -EMIT_RI7 (spe_cuflt, 0x3db); -EMIT_RI7 (spe_cfltu, 0x3d9); +EMIT_RI8 (spe_csflt, 0x1da); +EMIT_RI8 (spe_cflts, 0x1d8); +EMIT_RI8 (spe_cuflt, 0x1db); +EMIT_RI8 (spe_cfltu, 0x1d9); EMIT_R (spe_frds, 0x3b9); EMIT_R (spe_fesd, 0x3b8); EMIT_RR (spe_dfceq, 0x3c3); @@ -302,6 +305,7 @@ EMIT_R (spe_wrch, 0x10d); #undef EMIT_RR #undef EMIT_RRR #undef EMIT_RI7 +#undef EMIT_RI8 #undef EMIT_RI10 #undef EMIT_RI16 #undef EMIT_RI18 -- cgit v1.2.3