aco/isel: set per instruction float control modes

Reviewed-by: Rhys Perry <pendingchaos02@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/31172>
This commit is contained in:
Georg Lehmann
2024-09-13 19:57:43 +02:00
committed by Marge Bot
parent 9f1ad7d2f3
commit 9850f759dd
2 changed files with 9 additions and 0 deletions

View File

@@ -213,6 +213,9 @@ public:
std::vector<aco_ptr<Instruction>> *instructions;
std::vector<aco_ptr<Instruction>>::iterator it;
bool is_precise = false;
bool is_sz_preserve = false;
bool is_inf_preserve = false;
bool is_nan_preserve = false;
bool is_nuw = false;
Builder(Program *pgm) : program(pgm), use_iterator(false), start(false), lm(pgm ? pgm->lane_mask : s2), instructions(NULL) {}
@@ -617,6 +620,9 @@ formats = [(f if len(f) == 5 else f + ('',)) for f in formats]
% for i in range(num_definitions):
instr->definitions[${i}] = def${i};
instr->definitions[${i}].setPrecise(is_precise);
instr->definitions[${i}].setSZPreserve(is_sz_preserve);
instr->definitions[${i}].setInfPreserve(is_inf_preserve);
instr->definitions[${i}].setNaNPreserve(is_nan_preserve);
instr->definitions[${i}].setNUW(is_nuw);
% endfor
% for i in range(num_operands):

View File

@@ -121,6 +121,9 @@ create_alu_builder(isel_context* ctx, nir_alu_instr* instr)
{
Builder bld(ctx->program, ctx->block);
bld.is_precise = instr->exact;
bld.is_sz_preserve = nir_alu_instr_is_signed_zero_preserve(instr);
bld.is_inf_preserve = nir_alu_instr_is_inf_preserve(instr);
bld.is_nan_preserve = nir_alu_instr_is_nan_preserve(instr);
return bld;
}