mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2024-12-28 18:46:06 +00:00
Fix some compiler problems with ds3 (#1793)
- Implement S_CMOVK_I32 - Handle Isoline abstract patch type
This commit is contained in:
parent
d2ac92481b
commit
9aa1c13c7e
|
@ -161,8 +161,9 @@ void Translator::EmitSOPK(const GcnInst& inst) {
|
||||||
switch (inst.opcode) {
|
switch (inst.opcode) {
|
||||||
// SOPK
|
// SOPK
|
||||||
case Opcode::S_MOVK_I32:
|
case Opcode::S_MOVK_I32:
|
||||||
return S_MOVK(inst);
|
return S_MOVK(inst, false);
|
||||||
|
case Opcode::S_CMOVK_I32:
|
||||||
|
return S_MOVK(inst, true);
|
||||||
case Opcode::S_CMPK_EQ_I32:
|
case Opcode::S_CMPK_EQ_I32:
|
||||||
return S_CMPK(ConditionOp::EQ, true, inst);
|
return S_CMPK(ConditionOp::EQ, true, inst);
|
||||||
case Opcode::S_CMPK_LG_I32:
|
case Opcode::S_CMPK_LG_I32:
|
||||||
|
@ -458,13 +459,16 @@ void Translator::S_ABSDIFF_I32(const GcnInst& inst) {
|
||||||
|
|
||||||
// SOPK
|
// SOPK
|
||||||
|
|
||||||
void Translator::S_MOVK(const GcnInst& inst) {
|
void Translator::S_MOVK(const GcnInst& inst, bool is_conditional) {
|
||||||
const auto simm16 = inst.control.sopk.simm;
|
const s16 simm16 = inst.control.sopk.simm;
|
||||||
if (simm16 & (1 << 15)) {
|
// do the sign extension
|
||||||
// TODO: need to verify the case of imm sign extension
|
const s32 simm32 = static_cast<s32>(simm16);
|
||||||
UNREACHABLE();
|
IR::U32 val = ir.Imm32(simm32);
|
||||||
|
if (is_conditional) {
|
||||||
|
// if !SCC its a NOP
|
||||||
|
val = IR::U32{ir.Select(ir.GetScc(), val, GetSrc(inst.dst[0]))};
|
||||||
}
|
}
|
||||||
SetDst(inst.dst[0], ir.Imm32(simm16));
|
SetDst(inst.dst[0], val);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) {
|
void Translator::S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst) {
|
||||||
|
|
|
@ -100,7 +100,7 @@ public:
|
||||||
void S_NOT_B32(const GcnInst& inst);
|
void S_NOT_B32(const GcnInst& inst);
|
||||||
|
|
||||||
// SOPK
|
// SOPK
|
||||||
void S_MOVK(const GcnInst& inst);
|
void S_MOVK(const GcnInst& inst, bool is_conditional);
|
||||||
void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst);
|
void S_CMPK(ConditionOp cond, bool is_signed, const GcnInst& inst);
|
||||||
void S_ADDK_I32(const GcnInst& inst);
|
void S_ADDK_I32(const GcnInst& inst);
|
||||||
void S_MULK_I32(const GcnInst& inst);
|
void S_MULK_I32(const GcnInst& inst);
|
||||||
|
|
|
@ -398,8 +398,8 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) {
|
||||||
// communicated to the driver.
|
// communicated to the driver.
|
||||||
// The layout seems to be implied by the type of the abstract domain.
|
// The layout seems to be implied by the type of the abstract domain.
|
||||||
switch (runtime_info.hs_info.tess_type) {
|
switch (runtime_info.hs_info.tess_type) {
|
||||||
case AmdGpu::TessellationType::Quad:
|
case AmdGpu::TessellationType::Isoline:
|
||||||
ASSERT(gcn_factor_idx < 6);
|
ASSERT(gcn_factor_idx < 2);
|
||||||
return IR::PatchFactor(gcn_factor_idx);
|
return IR::PatchFactor(gcn_factor_idx);
|
||||||
case AmdGpu::TessellationType::Triangle:
|
case AmdGpu::TessellationType::Triangle:
|
||||||
ASSERT(gcn_factor_idx < 4);
|
ASSERT(gcn_factor_idx < 4);
|
||||||
|
@ -407,9 +407,11 @@ void HullShaderTransform(IR::Program& program, RuntimeInfo& runtime_info) {
|
||||||
return IR::Patch::TessellationLodInteriorU;
|
return IR::Patch::TessellationLodInteriorU;
|
||||||
}
|
}
|
||||||
return IR::PatchFactor(gcn_factor_idx);
|
return IR::PatchFactor(gcn_factor_idx);
|
||||||
|
case AmdGpu::TessellationType::Quad:
|
||||||
|
ASSERT(gcn_factor_idx < 6);
|
||||||
|
return IR::PatchFactor(gcn_factor_idx);
|
||||||
default:
|
default:
|
||||||
// Point domain types haven't been seen so far
|
UNREACHABLE();
|
||||||
UNREACHABLE_MSG("Unhandled tess type");
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue