|
|
|
@@ -474,6 +474,13 @@ bool valu_can_accept_literal(opt_ctx& ctx, aco_ptr<Instruction>& instr, unsigned |
|
|
|
operand == 0 && can_accept_constant(instr, operand); |
|
|
|
} |
|
|
|
|
|
|
|
bool valu_can_accept_vgpr(aco_ptr<Instruction>& instr, unsigned operand) |
|
|
|
{ |
|
|
|
if (instr->opcode == aco_opcode::v_readlane_b32 || instr->opcode == aco_opcode::v_writelane_b32) |
|
|
|
return operand != 1; |
|
|
|
return true; |
|
|
|
} |
|
|
|
|
|
|
|
bool parse_base_offset(opt_ctx &ctx, Instruction* instr, unsigned op_index, Temp *base, uint32_t *offset) |
|
|
|
{ |
|
|
|
Operand op = instr->operands[op_index]; |
|
|
|
@@ -579,7 +586,7 @@ void label_instruction(opt_ctx &ctx, aco_ptr<Instruction>& instr) |
|
|
|
|
|
|
|
/* VALU: propagate neg, abs & inline constants */ |
|
|
|
else if (instr->isVALU()) { |
|
|
|
if (info.is_temp() && info.temp.type() == RegType::vgpr) { |
|
|
|
if (info.is_temp() && info.temp.type() == RegType::vgpr && valu_can_accept_vgpr(instr, i)) { |
|
|
|
instr->operands[i].setTemp(info.temp); |
|
|
|
info = ctx.info[info.temp.id()]; |
|
|
|
} |