This commit is contained in:
microsoftv 2024-08-15 05:18:48 -04:00
parent b4f82eedfa
commit 58394d24cb
4 changed files with 17 additions and 65 deletions

View File

@ -123,7 +123,6 @@ void Translator::DS_ADD_U32(const GcnInst& inst) {
const IR::U32 addr_offset = ir.IAdd(addr, offset); const IR::U32 addr_offset = ir.IAdd(addr, offset);
const IR::U32 value = ir.SharedAtomicIAdd(addr_offset, data); const IR::U32 value = ir.SharedAtomicIAdd(addr_offset, data);
ir.WriteShared(32, value, addr_offset);
SetDst(inst.dst[0], value); 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 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset); const IR::U32 addr_offset = ir.IAdd(addr, offset);
const IR::U32 value = ir.SharedAtomicUMax(addr_offset, data); const IR::U32 value = ir.SharedAtomicIMax(addr_offset, data, false);
ir.WriteShared(32, value, addr_offset);
SetDst(inst.dst[0], value); 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 offset = ir.Imm32(u32(inst.control.ds.offset0));
const IR::U32 addr_offset = ir.IAdd(addr, offset); const IR::U32 addr_offset = ir.IAdd(addr, offset);
const IR::U32 value = ir.SharedAtomicUMax(addr_offset, data); const IR::U32 value = ir.SharedAtomicIMax(addr_offset, data, false);
ir.WriteShared(32, value, addr_offset);
SetDst(inst.dst[0], value); SetDst(inst.dst[0], value);
} }

View File

@ -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) { void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst) {
const auto& mtbuf = inst.control.mtbuf; const auto& mtbuf = inst.control.mtbuf;
const IR::VectorReg vaddr{inst.src[0].code}; 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::ScalarReg sharp{inst.src[2].code * 4};
const IR::Value address = [&] -> IR::Value { const IR::Value address = [&] -> IR::Value {
if (mtbuf.idxen && mtbuf.offen) { 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.CompositeConstruct(ir.GetScalarReg(sharp), ir.GetScalarReg(sharp + 1),
ir.GetScalarReg(sharp + 2), ir.GetScalarReg(sharp + 3)); 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 = [&] { const IR::Value result = [&] {
switch (op) { switch (op) {
@ -470,11 +471,11 @@ void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst)
case AtomicOp::Smin: case AtomicOp::Smin:
return ir.BufferAtomicIMin(handle, address, value, true, info); return ir.BufferAtomicIMin(handle, address, value, true, info);
case AtomicOp::Umin: case AtomicOp::Umin:
return ir.BufferAtomicUMin(handle, address, value, info); return ir.BufferAtomicIMin(handle, address, value, false, info);
case AtomicOp::Smax: case AtomicOp::Smax:
return ir.BufferAtomicIMax(handle, address, value, true, info); return ir.BufferAtomicIMax(handle, address, value, true, info);
case AtomicOp::Umax: case AtomicOp::Umax:
return ir.BufferAtomicUMax(handle, address, value, info); return ir.BufferAtomicIMax(handle, address, value, false, info);
case AtomicOp::And: case AtomicOp::And:
return ir.BufferAtomicAnd(handle, address, value, info); return ir.BufferAtomicAnd(handle, address, value, info);
case AtomicOp::Or: case AtomicOp::Or:
@ -490,9 +491,9 @@ void Translator::BUFFER_ATOMIC(u32 num_dwords, AtomicOp op, const GcnInst& inst)
} }
}(); }();
// TODO: Check if unused if (mtbuf.glc) {
// const IR::VectorReg dst_reg{inst.src[1].code}; ir.SetVectorReg(vdata, IR::U32{result});
ir.StoreBuffer(num_dwords, handle, address, value, info); }
} }
void Translator::IMAGE_GET_LOD(const GcnInst& inst) { void Translator::IMAGE_GET_LOD(const GcnInst& inst) {

View File

@ -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) { U32 IREmitter::SharedAtomicIMin(const U32& a, const U32& b, bool is_signed) {
return is_signed ? SharedAtomicSMin(a, b) : SharedAtomicUMin(a, b); return is_signed ? Inst<U32>(Opcode::SharedAtomicSMin32, a, b)
} : Inst<U32>(Opcode::SharedAtomicUMin32, 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);
} }
U32 IREmitter::SharedAtomicIMax(const U32& a, const U32& b, bool is_signed) { 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) { 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); 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, Value IREmitter::BufferAtomicIMin(const Value& handle, const Value& address, const Value& value,
bool is_signed, BufferInstInfo info) { bool is_signed, BufferInstInfo info) {
return is_signed ? BufferAtomicSMin(handle, address, value, info) return is_signed ? Inst(Opcode::BufferAtomicSMin32, Flags{info}, handle, address, value)
: BufferAtomicUMin(handle, address, value, info); : Inst(Opcode::BufferAtomicUMin32, Flags{info}, handle, address, value);
}
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);
} }
Value IREmitter::BufferAtomicIMax(const Value& handle, const Value& address, const Value& value, Value IREmitter::BufferAtomicIMax(const Value& handle, const Value& address, const Value& value,
bool is_signed, BufferInstInfo info) { bool is_signed, BufferInstInfo info) {
return is_signed ? BufferAtomicSMax(handle, address, value, info) return is_signed ? Inst(Opcode::BufferAtomicSMax32, Flags{info}, handle, address, value)
: BufferAtomicUMax(handle, address, value, info); : Inst(Opcode::BufferAtomicUMax32, Flags{info}, handle, address, value);
} }
Value IREmitter::BufferAtomicInc(const Value& handle, const Value& address, const Value& value, Value IREmitter::BufferAtomicInc(const Value& handle, const Value& address, const Value& value,

View File

@ -85,11 +85,7 @@ public:
void WriteShared(int bit_size, const Value& value, const U32& offset); void WriteShared(int bit_size, const Value& value, const U32& offset);
[[nodiscard]] U32U64 SharedAtomicIAdd(const U32U64& a, const U32U64& b); [[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 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 SharedAtomicIMax(const U32& a, const U32& b, bool is_signed);
[[nodiscard]] U32 ReadConst(const Value& base, const U32& offset); [[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, [[nodiscard]] Value BufferAtomicIAdd(const Value& handle, const Value& a, const Value& b,
BufferInstInfo info); 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, [[nodiscard]] Value BufferAtomicIMin(const Value& handle, const Value& a, const Value& b,
bool is_signed, BufferInstInfo info); 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, [[nodiscard]] Value BufferAtomicIMax(const Value& handle, const Value& a, const Value& b,
bool is_signed, BufferInstInfo info); bool is_signed, BufferInstInfo info);
[[nodiscard]] Value BufferAtomicInc(const Value& handle, const Value& address, [[nodiscard]] Value BufferAtomicInc(const Value& handle, const Value& address,