|
|
|
@ -38,6 +38,7 @@ void TranslatorVisitor::MEMBAR(u64 inst) { |
|
|
|
u64 raw; |
|
|
|
BitField<8, 2, LocalScope> scope; |
|
|
|
} membar{inst}; |
|
|
|
|
|
|
|
ir.MemoryBarrier(LocalScopeToMemoryScope(membar.scope)); |
|
|
|
} |
|
|
|
|
|
|
|
@ -45,8 +46,61 @@ void TranslatorVisitor::DEPBAR() { |
|
|
|
// DEPBAR is a no-op
|
|
|
|
} |
|
|
|
|
|
|
|
void TranslatorVisitor::BAR(u64) { |
|
|
|
throw NotImplementedException("Instruction {} is not implemented", Opcode::BAR); |
|
|
|
void TranslatorVisitor::BAR(u64 insn) { |
|
|
|
enum class Mode { |
|
|
|
RedPopc, |
|
|
|
Scan, |
|
|
|
RedAnd, |
|
|
|
RedOr, |
|
|
|
Sync, |
|
|
|
Arrive, |
|
|
|
}; |
|
|
|
union { |
|
|
|
u64 raw; |
|
|
|
BitField<43, 1, u64> is_a_imm; |
|
|
|
BitField<44, 1, u64> is_b_imm; |
|
|
|
BitField<8, 8, u64> imm_a; |
|
|
|
BitField<20, 12, u64> imm_b; |
|
|
|
BitField<42, 1, u64> neg_pred; |
|
|
|
BitField<39, 3, IR::Pred> pred; |
|
|
|
} const bar{insn}; |
|
|
|
|
|
|
|
const Mode mode{[insn] { |
|
|
|
switch (insn & 0x0000009B00000000ULL) { |
|
|
|
case 0x0000000200000000ULL: |
|
|
|
return Mode::RedPopc; |
|
|
|
case 0x0000000300000000ULL: |
|
|
|
return Mode::Scan; |
|
|
|
case 0x0000000A00000000ULL: |
|
|
|
return Mode::RedAnd; |
|
|
|
case 0x0000001200000000ULL: |
|
|
|
return Mode::RedOr; |
|
|
|
case 0x0000008000000000ULL: |
|
|
|
return Mode::Sync; |
|
|
|
case 0x0000008100000000ULL: |
|
|
|
return Mode::Arrive; |
|
|
|
} |
|
|
|
throw NotImplementedException("Invalid encoding"); |
|
|
|
}()}; |
|
|
|
if (mode != Mode::Sync) { |
|
|
|
throw NotImplementedException("BAR mode {}", mode); |
|
|
|
} |
|
|
|
if (bar.is_a_imm == 0) { |
|
|
|
throw NotImplementedException("Non-immediate input A"); |
|
|
|
} |
|
|
|
if (bar.imm_a != 0) { |
|
|
|
throw NotImplementedException("Non-zero input A"); |
|
|
|
} |
|
|
|
if (bar.is_b_imm == 0) { |
|
|
|
throw NotImplementedException("Non-immediate input B"); |
|
|
|
} |
|
|
|
if (bar.imm_b != 0) { |
|
|
|
throw NotImplementedException("Non-zero input B"); |
|
|
|
} |
|
|
|
if (bar.pred != IR::Pred::PT && bar.neg_pred != 0) { |
|
|
|
throw NotImplementedException("Non-true input predicate"); |
|
|
|
} |
|
|
|
ir.Barrier(); |
|
|
|
} |
|
|
|
|
|
|
|
} // namespace Shader::Maxwell
|