From 3355749105ef81ea560daddf774ef85d02f26aaa Mon Sep 17 00:00:00 2001 From: Simon Perretta Date: Tue, 7 Feb 2023 10:53:13 +0000 Subject: [PATCH] pvr: Support loading immediate values Signed-off-by: Simon Perretta Acked-by Frank Binns Part-of: --- src/imagination/rogue/passes/rogue_constreg.c | 6 +++--- .../rogue/passes/rogue_lower_pseudo_ops.c | 15 ++++++++++++++- 2 files changed, 17 insertions(+), 4 deletions(-) diff --git a/src/imagination/rogue/passes/rogue_constreg.c b/src/imagination/rogue/passes/rogue_constreg.c index 0e113072154..3838159d1d8 100644 --- a/src/imagination/rogue/passes/rogue_constreg.c +++ b/src/imagination/rogue/passes/rogue_constreg.c @@ -33,8 +33,6 @@ */ /* Converts immediate values to constant register values. */ -/* TODO: For values that aren't in constant registers, either insert a bitwise - * mov, or ask driver to put it into shared regs. */ PUBLIC bool rogue_constreg(rogue_shader *shader) { @@ -45,8 +43,10 @@ bool rogue_constreg(rogue_shader *shader) rogue_foreach_imm_use_safe (imm_use, shader) { unsigned index = rogue_constreg_lookup(*imm_use->imm); + /* Skip values that aren't in the special constant registers; they'll be + * replaced with immediate movs. */ if (index == ROGUE_NO_CONST_REG) - unreachable("Immediate value not in constant registers."); + continue; rogue_reg *reg = rogue_const_reg(shader, index); diff --git a/src/imagination/rogue/passes/rogue_lower_pseudo_ops.c b/src/imagination/rogue/passes/rogue_lower_pseudo_ops.c index b89905d2c87..9ddd27d2e4f 100644 --- a/src/imagination/rogue/passes/rogue_lower_pseudo_ops.c +++ b/src/imagination/rogue/passes/rogue_lower_pseudo_ops.c @@ -74,7 +74,20 @@ static inline bool rogue_lower_MOV(rogue_builder *b, rogue_alu_instr *mov) mov->dst[0].ref.reg->class == ROGUE_REG_CLASS_VTXOUT) { instr = &rogue_UVSW_WRITE(b, mov->dst[0].ref, mov->src[0].ref)->instr; } else { - instr = &rogue_MBYP(b, mov->dst[0].ref, mov->src[0].ref)->instr; + /* If we're moving an immediate value not in special constants, + * we need to do a bitwise bypass. + */ + if (rogue_ref_is_imm(&mov->src[0].ref)) { + instr = &rogue_BYP0(b, + rogue_ref_io(ROGUE_IO_FT0), + mov->dst[0].ref, + rogue_ref_io(ROGUE_IO_S0), + rogue_ref_val( + rogue_ref_get_imm(&mov->src[0].ref)->imm.u32)) + ->instr; + } else { + instr = &rogue_MBYP(b, mov->dst[0].ref, mov->src[0].ref)->instr; + } } rogue_merge_instr_comment(instr, &mov->instr, "mov");