shader recompiler: removed unnecessary changes & missing consts
This commit is contained in:
parent
df257087d1
commit
7e0e99e21d
|
@ -79,7 +79,7 @@ template <>
|
||||||
IR::U32F32 Translator::GetSrc(const InstOperand& operand, bool force_flt) {
|
IR::U32F32 Translator::GetSrc(const InstOperand& operand, bool force_flt) {
|
||||||
IR::U32F32 value{};
|
IR::U32F32 value{};
|
||||||
|
|
||||||
bool is_float = operand.type == ScalarType::Float32 || force_flt;
|
const bool is_float = operand.type == ScalarType::Float32 || force_flt;
|
||||||
switch (operand.field) {
|
switch (operand.field) {
|
||||||
case OperandField::ScalarGPR:
|
case OperandField::ScalarGPR:
|
||||||
if (is_float) {
|
if (is_float) {
|
||||||
|
@ -190,7 +190,7 @@ IR::U64F64 Translator::GetSrc64(const InstOperand& operand, bool force_flt) {
|
||||||
IR::Value value_lo{};
|
IR::Value value_lo{};
|
||||||
|
|
||||||
bool immediate = false;
|
bool immediate = false;
|
||||||
bool is_float = operand.type == ScalarType::Float64 || force_flt;
|
const bool is_float = operand.type == ScalarType::Float64 || force_flt;
|
||||||
switch (operand.field) {
|
switch (operand.field) {
|
||||||
case OperandField::ScalarGPR:
|
case OperandField::ScalarGPR:
|
||||||
if (is_float) {
|
if (is_float) {
|
||||||
|
@ -344,7 +344,7 @@ void Translator::SetDst(const InstOperand& operand, const IR::U32F32& value) {
|
||||||
void Translator::SetDst64(const InstOperand& operand, const IR::U64F64& value_raw) {
|
void Translator::SetDst64(const InstOperand& operand, const IR::U64F64& value_raw) {
|
||||||
IR::U64F64 value_untyped = value_raw;
|
IR::U64F64 value_untyped = value_raw;
|
||||||
|
|
||||||
bool is_float = value_raw.Type() == IR::Type::F64 || value_raw.Type() == IR::Type::F32;
|
const bool is_float = value_raw.Type() == IR::Type::F64 || value_raw.Type() == IR::Type::F32;
|
||||||
if (is_float) {
|
if (is_float) {
|
||||||
if (operand.output_modifier.multiplier != 0.f) {
|
if (operand.output_modifier.multiplier != 0.f) {
|
||||||
value_untyped =
|
value_untyped =
|
||||||
|
@ -354,11 +354,12 @@ void Translator::SetDst64(const InstOperand& operand, const IR::U64F64& value_ra
|
||||||
value_untyped = ir.FPSaturate(value_raw);
|
value_untyped = ir.FPSaturate(value_raw);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
IR::U64 value = is_float ? ir.BitCast<IR::U64>(IR::F64{value_untyped}) : IR::U64{value_untyped};
|
const IR::U64 value =
|
||||||
|
is_float ? ir.BitCast<IR::U64>(IR::F64{value_untyped}) : IR::U64{value_untyped};
|
||||||
|
|
||||||
IR::Value unpacked{ir.UnpackUint2x32(value)};
|
const IR::Value unpacked{ir.UnpackUint2x32(value)};
|
||||||
IR::U32 lo{ir.CompositeExtract(unpacked, 0U)};
|
const IR::U32 lo{ir.CompositeExtract(unpacked, 0U)};
|
||||||
IR::U32 hi{ir.CompositeExtract(unpacked, 1U)};
|
const IR::U32 hi{ir.CompositeExtract(unpacked, 1U)};
|
||||||
switch (operand.field) {
|
switch (operand.field) {
|
||||||
case OperandField::ScalarGPR:
|
case OperandField::ScalarGPR:
|
||||||
ir.SetScalarReg(IR::ScalarReg(operand.code + 1), hi);
|
ir.SetScalarReg(IR::ScalarReg(operand.code + 1), hi);
|
||||||
|
|
|
@ -106,14 +106,14 @@ void Translator::V_ADDC_U32(const GcnInst& inst) {
|
||||||
scarry = ir.GetVccLo();
|
scarry = ir.GetVccLo();
|
||||||
}
|
}
|
||||||
|
|
||||||
IR::U32 result = ir.IAdd(ir.IAdd(src0, src1), scarry);
|
const IR::U32 result = ir.IAdd(ir.IAdd(src0, src1), scarry);
|
||||||
|
|
||||||
const IR::VectorReg dst_reg{inst.dst[0].code};
|
const IR::VectorReg dst_reg{inst.dst[0].code};
|
||||||
ir.SetVectorReg(dst_reg, result);
|
ir.SetVectorReg(dst_reg, result);
|
||||||
|
|
||||||
IR::U1 less_src0 = ir.ILessThan(result, src0, false);
|
const IR::U1 less_src0 = ir.ILessThan(result, src0, false);
|
||||||
IR::U1 less_src1 = ir.ILessThan(result, src1, false);
|
const IR::U1 less_src1 = ir.ILessThan(result, src1, false);
|
||||||
IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1);
|
const IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1);
|
||||||
ir.SetVcc(did_overflow);
|
ir.SetVcc(did_overflow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -325,14 +325,14 @@ void Translator::V_MAD_U64_U32(const GcnInst& inst) {
|
||||||
const auto src1 = GetSrc<IR::U32>(inst.src[1]);
|
const auto src1 = GetSrc<IR::U32>(inst.src[1]);
|
||||||
const auto src2 = GetSrc64<IR::U64>(inst.src[2]);
|
const auto src2 = GetSrc64<IR::U64>(inst.src[2]);
|
||||||
|
|
||||||
IR::U64 mul_result = ir.UConvert(64, ir.IMul(src0, src1));
|
const IR::U64 mul_result = ir.UConvert(64, ir.IMul(src0, src1));
|
||||||
IR::U64 sum_result = ir.IAdd(mul_result, src2);
|
const IR::U64 sum_result = ir.IAdd(mul_result, src2);
|
||||||
|
|
||||||
SetDst64(inst.dst[0], sum_result);
|
SetDst64(inst.dst[0], sum_result);
|
||||||
|
|
||||||
IR::U1 less_src0 = ir.ILessThan(sum_result, mul_result, false);
|
const IR::U1 less_src0 = ir.ILessThan(sum_result, mul_result, false);
|
||||||
IR::U1 less_src1 = ir.ILessThan(sum_result, src2, false);
|
const IR::U1 less_src1 = ir.ILessThan(sum_result, src2, false);
|
||||||
IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1);
|
const IR::U1 did_overflow = ir.LogicalOr(less_src0, less_src1);
|
||||||
ir.SetVcc(did_overflow);
|
ir.SetVcc(did_overflow);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1199,13 +1199,6 @@ U32U64 IREmitter::ConvertFToU(size_t bitsize, const F32F64& value) {
|
||||||
default:
|
default:
|
||||||
ThrowInvalidType(value.Type());
|
ThrowInvalidType(value.Type());
|
||||||
}
|
}
|
||||||
case 64:
|
|
||||||
switch (value.Type()) {
|
|
||||||
case Type::F32:
|
|
||||||
return Inst<U64>(Opcode::ConvertU64F32, value);
|
|
||||||
default:
|
|
||||||
ThrowInvalidType(value.Type());
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
UNREACHABLE_MSG("Invalid destination bitsize {}", bitsize);
|
UNREACHABLE_MSG("Invalid destination bitsize {}", bitsize);
|
||||||
}
|
}
|
||||||
|
@ -1276,20 +1269,6 @@ U16U32U64 IREmitter::UConvert(size_t result_bitsize, const U16U32U64& value) {
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 32:
|
|
||||||
switch (value.Type()) {
|
|
||||||
case Type::U64:
|
|
||||||
return Inst<U32>(Opcode::ConvertU32U64, value);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case 64:
|
|
||||||
switch (value.Type()) {
|
|
||||||
case Type::U32:
|
|
||||||
return Inst<U64>(Opcode::ConvertU64U32, value);
|
|
||||||
default:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
|
@ -293,9 +293,6 @@ OPCODE(ConvertF64S32, F64, U32,
|
||||||
OPCODE(ConvertF64U32, F64, U32, )
|
OPCODE(ConvertF64U32, F64, U32, )
|
||||||
OPCODE(ConvertF32U16, F32, U16, )
|
OPCODE(ConvertF32U16, F32, U16, )
|
||||||
OPCODE(ConvertU16U32, U16, U32, )
|
OPCODE(ConvertU16U32, U16, U32, )
|
||||||
OPCODE(ConvertU64U32, U64, U32, )
|
|
||||||
OPCODE(ConvertU32U64, U32, U64, )
|
|
||||||
OPCODE(ConvertU64F32, U64, F32, )
|
|
||||||
|
|
||||||
// Image operations
|
// Image operations
|
||||||
OPCODE(ImageSampleImplicitLod, F32x4, Opaque, Opaque, Opaque, Opaque, )
|
OPCODE(ImageSampleImplicitLod, F32x4, Opaque, Opaque, Opaque, Opaque, )
|
||||||
|
|
|
@ -310,8 +310,7 @@ private:
|
||||||
DefTable current_def;
|
DefTable current_def;
|
||||||
};
|
};
|
||||||
|
|
||||||
void VisitInst(Pass& pass, IR::Block* block, const IR::Block::iterator& iter) {
|
void VisitInst(Pass& pass, IR::Block* block, IR::Inst& inst) {
|
||||||
auto& inst{*iter};
|
|
||||||
const IR::Opcode opcode{inst.GetOpcode()};
|
const IR::Opcode opcode{inst.GetOpcode()};
|
||||||
switch (opcode) {
|
switch (opcode) {
|
||||||
case IR::Opcode::SetThreadBitScalarReg:
|
case IR::Opcode::SetThreadBitScalarReg:
|
||||||
|
@ -349,14 +348,14 @@ void VisitInst(Pass& pass, IR::Block* block, const IR::Block::iterator& iter) {
|
||||||
case IR::Opcode::GetThreadBitScalarReg:
|
case IR::Opcode::GetThreadBitScalarReg:
|
||||||
case IR::Opcode::GetScalarRegister: {
|
case IR::Opcode::GetScalarRegister: {
|
||||||
const IR::ScalarReg reg{inst.Arg(0).ScalarReg()};
|
const IR::ScalarReg reg{inst.Arg(0).ScalarReg()};
|
||||||
bool thread_bit = opcode == IR::Opcode::GetThreadBitScalarReg;
|
const bool thread_bit = opcode == IR::Opcode::GetThreadBitScalarReg;
|
||||||
IR::Value value = pass.ReadVariable(reg, block, thread_bit);
|
const IR::Value value = pass.ReadVariable(reg, block, thread_bit);
|
||||||
inst.ReplaceUsesWith(value);
|
inst.ReplaceUsesWith(value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case IR::Opcode::GetVectorRegister: {
|
case IR::Opcode::GetVectorRegister: {
|
||||||
const IR::VectorReg reg{inst.Arg(0).VectorReg()};
|
const IR::VectorReg reg{inst.Arg(0).VectorReg()};
|
||||||
IR::Value value = pass.ReadVariable(reg, block);
|
const IR::Value value = pass.ReadVariable(reg, block);
|
||||||
inst.ReplaceUsesWith(value);
|
inst.ReplaceUsesWith(value);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -387,9 +386,8 @@ void VisitInst(Pass& pass, IR::Block* block, const IR::Block::iterator& iter) {
|
||||||
}
|
}
|
||||||
|
|
||||||
void VisitBlock(Pass& pass, IR::Block* block) {
|
void VisitBlock(Pass& pass, IR::Block* block) {
|
||||||
const auto end{block->end()};
|
for (IR::Inst& inst : block->Instructions()) {
|
||||||
for (auto iter = block->begin(); iter != end; ++iter) {
|
VisitInst(pass, block, inst);
|
||||||
VisitInst(pass, block, iter);
|
|
||||||
}
|
}
|
||||||
pass.SealBlock(block);
|
pass.SealBlock(block);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue