mirror of
https://github.com/shadps4-emu/shadPS4.git
synced 2025-04-21 12:04:45 +00:00
resolve
This commit is contained in:
parent
b4f82eedfa
commit
58394d24cb
4 changed files with 17 additions and 65 deletions
|
@ -123,7 +123,6 @@ void Translator::DS_ADD_U32(const GcnInst& inst) {
|
|||
const IR::U32 addr_offset = ir.IAdd(addr, offset);
|
||||
|
||||
const IR::U32 value = ir.SharedAtomicIAdd(addr_offset, data);
|
||||
ir.WriteShared(32, value, addr_offset);
|
||||
|
||||
SetDst(inst.dst[0], value);
|
||||
}
|
||||
|
@ -134,8 +133,7 @@ void Translator::DS_MIN_U32(const GcnInst& inst) {
|
|||
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
|
||||
const IR::U32 addr_offset = ir.IAdd(addr, offset);
|
||||
|
||||
const IR::U32 value = ir.SharedAtomicUMax(addr_offset, data);
|
||||
ir.WriteShared(32, value, addr_offset);
|
||||
const IR::U32 value = ir.SharedAtomicIMax(addr_offset, data, false);
|
||||
|
||||
SetDst(inst.dst[0], value);
|
||||
}
|
||||
|
@ -146,8 +144,7 @@ void Translator::DS_MAX_U32(const GcnInst& inst) {
|
|||
const IR::U32 offset = ir.Imm32(u32(inst.control.ds.offset0));
|
||||
const IR::U32 addr_offset = ir.IAdd(addr, offset);
|
||||
|
||||
const IR::U32 value = ir.SharedAtomicUMax(addr_offset, data);
|
||||
ir.WriteShared(32, value, addr_offset);
|
||||
const IR::U32 value = ir.SharedAtomicIMax(addr_offset, data, false);
|
||||
|
||||
SetDst(inst.dst[0], value);
|
||||
}
|
||||
|
|
|
@ -437,6 +437,7 @@ void Translator::BUFFER_STORE_FORMAT(u32 num_dwords, bool is_typed, bool is_form
|
|||
void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst) {
|
||||
const auto& mtbuf = inst.control.mtbuf;
|
||||
const IR::VectorReg vaddr{inst.src[0].code};
|
||||
const IR::VectorReg vdata{inst.src[1].code};
|
||||
const IR::ScalarReg sharp{inst.src[2].code * 4};
|
||||
const IR::Value address = [&] -> IR::Value {
|
||||
if (mtbuf.idxen && mtbuf.offen) {
|
||||
|
@ -459,7 +460,7 @@ void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst)
|
|||
ir.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
|
||||
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3));
|
||||
|
||||
const IR::Value value = ir.LoadBufferFormat(num_dwords, handle, address, info);
|
||||
const IR::Value value = ir.GetVectorReg(vdata);
|
||||
|
||||
const IR::Value result = [&] {
|
||||
switch (op) {
|
||||
|
@ -470,11 +471,11 @@ void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst)
|
|||
case AtomicOp::Smin:
|
||||
return ir.BufferAtomicIMin(handle, address, value, true, info);
|
||||
case AtomicOp::Umin:
|
||||
return ir.BufferAtomicUMin(handle, address, value, info);
|
||||
return ir.BufferAtomicIMin(handle, address, value, false, info);
|
||||
case AtomicOp::Smax:
|
||||
return ir.BufferAtomicIMax(handle, address, value, true, info);
|
||||
case AtomicOp::Umax:
|
||||
return ir.BufferAtomicUMax(handle, address, value, info);
|
||||
return ir.BufferAtomicIMax(handle, address, value, false, info);
|
||||
case AtomicOp::And:
|
||||
return ir.BufferAtomicAnd(handle, address, value, info);
|
||||
case AtomicOp::Or:
|
||||
|
@ -490,9 +491,9 @@ void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst)
|
|||
}
|
||||
}();
|
||||
|
||||
// TODO: Check if unused
|
||||
// const IR::VectorReg dst_reg{inst.src[1].code};
|
||||
ir.StoreBuffer(num_dwords, handle, address, value, info);
|
||||
if (mtbuf.glc) {
|
||||
ir.SetVectorReg(vdata, IR::U32{result});
|
||||
}
|
||||
}
|
||||
|
||||
void Translator::IMAGE_GET_LOD(const GcnInst& inst) {
|
||||
|
|
|
@ -298,28 +298,14 @@ U32U64 IREmitter::SharedAtomicIAdd(const U32U64& a, const U32U64& b) {
|
|||
}
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicSMin(const U32& a, const U32& b) {
|
||||
return Inst<U32>(Opcode::SharedAtomicSMin32, a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicUMin(const U32& a, const U32& b) {
|
||||
return Inst<U32>(Opcode::SharedAtomicUMin32, a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicIMin(const U32& a, const U32& b, bool is_signed) {
|
||||
return is_signed ? SharedAtomicSMin(a, b) : SharedAtomicUMin(a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicSMax(const U32& a, const U32& b) {
|
||||
return Inst<U32>(Opcode::SharedAtomicSMax32, a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicUMax(const U32& a, const U32& b) {
|
||||
return Inst<U32>(Opcode::SharedAtomicUMax32, a, b);
|
||||
return is_signed ? Inst<U32>(Opcode::SharedAtomicSMin32, a, b)
|
||||
: Inst<U32>(Opcode::SharedAtomicUMin32, a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::SharedAtomicIMax(const U32& a, const U32& b, bool is_signed) {
|
||||
return is_signed ? SharedAtomicSMax(a, b) : SharedAtomicUMax(a, b);
|
||||
return is_signed ? Inst<U32>(Opcode::SharedAtomicSMax32, a, b)
|
||||
: Inst<U32>(Opcode::SharedAtomicUMax32, a, b);
|
||||
}
|
||||
|
||||
U32 IREmitter::ReadConst(const Value& base, const U32& offset) {
|
||||
|
@ -388,36 +374,16 @@ Value IREmitter::BufferAtomicIAdd(const Value& handle, const Value& address, con
|
|||
return Inst(Opcode::BufferAtomicIAdd32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicSMin(const Value& handle, const Value& address, const Value& value,
|
||||
BufferInstInfo info) {
|
||||
return Inst(Opcode::BufferAtomicSMin32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicUMin(const Value& handle, const Value& address, const Value& value,
|
||||
BufferInstInfo info) {
|
||||
return Inst(Opcode::BufferAtomicUMin32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicIMin(const Value& handle, const Value& address, const Value& value,
|
||||
bool is_signed, BufferInstInfo info) {
|
||||
return is_signed ? BufferAtomicSMin(handle, address, value, info)
|
||||
: BufferAtomicUMin(handle, address, value, info);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicSMax(const Value& handle, const Value& address, const Value& value,
|
||||
BufferInstInfo info) {
|
||||
return Inst(Opcode::BufferAtomicSMax32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicUMax(const Value& handle, const Value& address, const Value& value,
|
||||
BufferInstInfo info) {
|
||||
return Inst(Opcode::BufferAtomicUMax32, Flags{info}, handle, address, value);
|
||||
return is_signed ? Inst(Opcode::BufferAtomicSMin32, Flags{info}, handle, address, value)
|
||||
: Inst(Opcode::BufferAtomicUMin32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicIMax(const Value& handle, const Value& address, const Value& value,
|
||||
bool is_signed, BufferInstInfo info) {
|
||||
return is_signed ? BufferAtomicSMax(handle, address, value, info)
|
||||
: BufferAtomicUMax(handle, address, value, info);
|
||||
return is_signed ? Inst(Opcode::BufferAtomicSMax32, Flags{info}, handle, address, value)
|
||||
: Inst(Opcode::BufferAtomicUMax32, Flags{info}, handle, address, value);
|
||||
}
|
||||
|
||||
Value IREmitter::BufferAtomicInc(const Value& handle, const Value& address, const Value& value,
|
||||
|
|
|
@ -85,11 +85,7 @@ public:
|
|||
void WriteShared(int bit_size, const Value& value, const U32& offset);
|
||||
|
||||
[[nodiscard]] U32U64 SharedAtomicIAdd(const U32U64& a, const U32U64& b);
|
||||
[[nodiscard]] U32 SharedAtomicSMin(const U32& a, const U32& b);
|
||||
[[nodiscard]] U32 SharedAtomicUMin(const U32& a, const U32& b);
|
||||
[[nodiscard]] U32 SharedAtomicIMin(const U32& a, const U32& b, bool is_signed);
|
||||
[[nodiscard]] U32 SharedAtomicSMax(const U32& a, const U32& b);
|
||||
[[nodiscard]] U32 SharedAtomicUMax(const U32& a, const U32& b);
|
||||
[[nodiscard]] U32 SharedAtomicIMax(const U32& a, const U32& b, bool is_signed);
|
||||
|
||||
[[nodiscard]] U32 ReadConst(const Value& base, const U32& offset);
|
||||
|
@ -106,16 +102,8 @@ public:
|
|||
|
||||
[[nodiscard]] Value BufferAtomicIAdd(const Value& handle, const Value& a, const Value& b,
|
||||
BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicSMin(const Value& handle, const Value& a, const Value& b,
|
||||
BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicUMin(const Value& handle, const Value& a, const Value& b,
|
||||
BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicIMin(const Value& handle, const Value& a, const Value& b,
|
||||
bool is_signed, BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicSMax(const Value& handle, const Value& a, const Value& b,
|
||||
BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicUMax(const Value& handle, const Value& a, const Value& b,
|
||||
BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicIMax(const Value& handle, const Value& a, const Value& b,
|
||||
bool is_signed, BufferInstInfo info);
|
||||
[[nodiscard]] Value BufferAtomicInc(const Value& handle, const Value& address,
|
||||
|
|
Loading…
Add table
Reference in a new issue