diff options
author | Brian Paul <brian.paul@tungstengraphics.com> | 2008-10-10 14:44:52 -0600 |
---|---|---|
committer | Brian Paul <brian.paul@tungstengraphics.com> | 2008-10-10 14:44:52 -0600 |
commit | f42ef6f39d213b4c6315ba95791c16ca2b1a4b21 (patch) | |
tree | d609d13efbc820fc0fd60839f9c157c44fbff98e /src/gallium | |
parent | 78c67a726fff052abeb03417283504a5dd521665 (diff) |
cell: additional 'offset' checking in spe_lqd(), spe_stqd()
Diffstat (limited to 'src/gallium')
-rw-r--r-- | src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c | 18 |
1 files changed, 14 insertions, 4 deletions
diff --git a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c index 5b0f6bdd48..d0bacd08a6 100644 --- a/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c +++ b/src/gallium/auxiliary/rtasm/rtasm_ppc_spe.c @@ -552,14 +552,19 @@ spe_comment(struct spe_function *p, int rel_indent, const char *s) /** * Load quad word. - * NOTE: imm is in bytes and the least significant 4 bits must be zero! + * NOTE: offset is in bytes and the least significant 4 bits must be zero! */ void spe_lqd(struct spe_function *p, unsigned rT, unsigned rA, int offset) { const boolean pSave = p->print; - p->print = FALSE; + /* offset must be a multiple of 16 */ assert(offset % 16 == 0); + /* offset must fit in 10-bit signed int field, after shifting */ + assert((offset >> 4) <= 511); + assert((offset >> 4) >= -512); + + p->print = FALSE; emit_RI10(p, 0x034, rT, rA, offset >> 4, "spe_lqd"); p->print = pSave; @@ -572,14 +577,19 @@ void spe_lqd(struct spe_function *p, unsigned rT, unsigned rA, int offset) /** * Store quad word. - * NOTE: imm is in bytes and the least significant 4 bits must be zero! + * NOTE: offset is in bytes and the least significant 4 bits must be zero! */ void spe_stqd(struct spe_function *p, unsigned rT, unsigned rA, int offset) { const boolean pSave = p->print; - p->print = FALSE; + /* offset must be a multiple of 16 */ assert(offset % 16 == 0); + /* offset must fit in 10-bit signed int field, after shifting */ + assert((offset >> 4) <= 511); + assert((offset >> 4) >= -512); + + p->print = FALSE; emit_RI10(p, 0x024, rT, rA, offset >> 4, "spe_stqd"); p->print = pSave; |