nak: Add OpBreak

Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/24998>
This commit is contained in:
Faith Ekstrand 2023-10-24 12:44:55 -05:00 committed by Marge Bot
parent 3957124492
commit 95f368a105
3 changed files with 26 additions and 2 deletions

View file

@ -1615,6 +1615,12 @@ impl SM75Instr {
self.set_bit(84, op.clear);
}
fn encode_break(&mut self, op: &OpBreak) {
self.set_opcode(0x942);
self.set_field(16..20, op.bar.idx());
self.set_pred_src(87..90, 90, op.cond);
}
fn encode_bssy(
&mut self,
op: &OpBSSy,
@ -1824,6 +1830,7 @@ impl SM75Instr {
Op::Ipa(op) => si.encode_ipa(&op),
Op::MemBar(op) => si.encode_membar(&op),
Op::BMov(op) => si.encode_bmov(&op),
Op::Break(op) => si.encode_break(&op),
Op::BSSy(op) => si.encode_bssy(&op, ip, labels),
Op::BSync(op) => si.encode_bsync(&op),
Op::Bra(op) => si.encode_bra(&op, ip, labels),

View file

@ -3515,6 +3515,21 @@ impl fmt::Display for OpBMov {
}
}
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
pub struct OpBreak {
pub bar: BarRef,
#[src_type(Pred)]
pub cond: Src,
}
impl fmt::Display for OpBreak {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "BREAK {} {}", self.cond, self.bar)
}
}
#[repr(C)]
#[derive(SrcsAsSlice, DstsAsSlice)]
pub struct OpBSSy {
@ -4108,6 +4123,7 @@ pub enum Op {
Ipa(OpIpa),
MemBar(OpMemBar),
BMov(OpBMov),
Break(OpBreak),
BSSy(OpBSSy),
BSync(OpBSync),
Bra(OpBra),
@ -4462,6 +4478,7 @@ impl Instr {
| Op::AtomCas(_)
| Op::MemBar(_)
| Op::Kill(_)
| Op::Break(_)
| Op::BSSy(_)
| Op::BSync(_)
| Op::Bra(_)
@ -4541,7 +4558,7 @@ impl Instr {
| Op::MemBar(_) => false,
// Control-flow ops
Op::BMov(_) | Op::BSSy(_) | Op::BSync(_) => false,
Op::BMov(_) | Op::Break(_) | Op::BSSy(_) | Op::BSync(_) => false,
Op::Bra(_) | Op::Exit(_) => true,
Op::WarpSync(_) => false,

View file

@ -260,7 +260,7 @@ fn legalize_instr(b: &mut impl SSABuilder, instr: &mut Instr) {
copy_src_if_not_reg(b, &mut op.handle, RegFile::GPR);
}
Op::Ldc(_) => (), // Nothing to do
Op::BMov(_) | Op::BSSy(_) | Op::BSync(_) => (), // Nothing to do
Op::BMov(_) | Op::Break(_) | Op::BSSy(_) | Op::BSync(_) => (),
Op::Copy(_) => (), // Nothing to do
_ => {
let src_types = instr.src_types();