diff options
author | Kristian H. Kristensen <[email protected]> | 2019-03-27 23:05:01 -0700 |
---|---|---|
committer | Kristian H. Kristensen <[email protected]> | 2019-03-28 10:26:32 -0700 |
commit | f30d4a1ccaece3578fb92d245cc44a5c7dccdd7d (patch) | |
tree | 45a5c58af9d2bae521e0dc5ab97411906bae9de9 /src | |
parent | 7fefa4610d96bc65322c73879da83b24487b2c90 (diff) |
freedreno/ir3: Don't access beyond available regs
emit_cat5() needs to check if the last optional reg is there before it
accesses it.
Signed-off-by: Kristian H. Kristensen <[email protected]>
Reviewed-by: Rob Clark <[email protected]>
Diffstat (limited to 'src')
-rw-r--r-- | src/freedreno/ir3/ir3.c | 11 |
1 files changed, 7 insertions, 4 deletions
diff --git a/src/freedreno/ir3/ir3.c b/src/freedreno/ir3/ir3.c index f209585dd9a..1bded7dd122 100644 --- a/src/freedreno/ir3/ir3.c +++ b/src/freedreno/ir3/ir3.c @@ -451,10 +451,13 @@ static int emit_cat5(struct ir3_instruction *instr, void *ptr, * than tex/sampler idx, we use the first src reg in the ir to hold * samp_tex hvec2: */ - struct ir3_register *src1 = instr->regs[2]; - struct ir3_register *src2 = instr->regs[3]; + struct ir3_register *src1; + struct ir3_register *src2; instr_cat5_t *cat5 = ptr; + iassert((instr->regs_count == 2) || + (instr->regs_count == 3) || (instr->regs_count == 4)); + switch (instr->opc) { case OPC_DSX: case OPC_DSXPP_1: @@ -462,11 +465,11 @@ static int emit_cat5(struct ir3_instruction *instr, void *ptr, case OPC_DSYPP_1: iassert((instr->flags & IR3_INSTR_S2EN) == 0); src1 = instr->regs[1]; - src2 = instr->regs[2]; + src2 = instr->regs_count > 2 ? instr->regs[2] : NULL; break; default: src1 = instr->regs[2]; - src2 = instr->regs[3]; + src2 = instr->regs_count > 3 ? instr->regs[3] : NULL; break; } |