aco: use v_cvt_f32_ubyte for signed casts too
The extract is always positive, so signed vs unsigned conversion doesn't matter. Foz-DB GFX11: Totals from 167 (0.13% of 133461) affected shaders: Instrs: 401631 -> 401225 (-0.10%) CodeSize: 2107256 -> 2104344 (-0.14%) VGPRs: 13320 -> 13332 (+0.09%) Latency: 6468063 -> 6467241 (-0.01%) InvThroughput: 801854 -> 801653 (-0.03%) Copies: 13926 -> 13927 (+0.01%); split: -0.08%, +0.09% Reviewed-by: Rhys Perry <pendingchaos02@gmail.com> Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24893>
This commit is contained in:
parent
144c2d4e4a
commit
cda5784eb3
1 changed files with 6 additions and 2 deletions
|
|
@ -1065,7 +1065,9 @@ can_apply_extract(opt_ctx& ctx, aco_ptr<Instruction>& instr, unsigned idx, ssa_i
|
|||
return false;
|
||||
} else if (sel.size() == 4) {
|
||||
return true;
|
||||
} else if (instr->opcode == aco_opcode::v_cvt_f32_u32 && sel.size() == 1 && !sel.sign_extend()) {
|
||||
} else if ((instr->opcode == aco_opcode::v_cvt_f32_u32 ||
|
||||
instr->opcode == aco_opcode::v_cvt_f32_i32) &&
|
||||
sel.size() == 1 && !sel.sign_extend()) {
|
||||
return true;
|
||||
} else if (instr->opcode == aco_opcode::v_lshlrev_b32 && instr->operands[0].isConstant() &&
|
||||
sel.offset() == 0 &&
|
||||
|
|
@ -1119,7 +1121,9 @@ apply_extract(opt_ctx& ctx, aco_ptr<Instruction>& instr, unsigned idx, ssa_info&
|
|||
|
||||
if (sel.size() == 4) {
|
||||
/* full dword selection */
|
||||
} else if (instr->opcode == aco_opcode::v_cvt_f32_u32 && sel.size() == 1 && !sel.sign_extend()) {
|
||||
} else if ((instr->opcode == aco_opcode::v_cvt_f32_u32 ||
|
||||
instr->opcode == aco_opcode::v_cvt_f32_i32) &&
|
||||
sel.size() == 1 && !sel.sign_extend()) {
|
||||
switch (sel.offset()) {
|
||||
case 0: instr->opcode = aco_opcode::v_cvt_f32_ubyte0; break;
|
||||
case 1: instr->opcode = aco_opcode::v_cvt_f32_ubyte1; break;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue