diff --git a/src/nouveau/compiler/nak/sm20.rs b/src/nouveau/compiler/nak/sm20.rs index 729912133aa..88e50dbbf21 100644 --- a/src/nouveau/compiler/nak/sm20.rs +++ b/src/nouveau/compiler/nak/sm20.rs @@ -113,7 +113,7 @@ impl ShaderModel for ShaderModel20 { } fn legalize_op(&self, b: &mut LegalizeBuilder, op: &mut Op) { - as_sm20_op_mut(op).legalize(b); + op.legalize(b); } fn encode_shader(&self, s: &Shader<'_>) -> Vec { @@ -2961,96 +2961,97 @@ impl SM20Op for OpOut { } } -macro_rules! as_sm20_op_match { - ($op: expr) => { +macro_rules! sm20_op_match { + ($op: expr, |$x: ident| $y: expr) => { match $op { - Op::FAdd(op) => op, - Op::FFma(op) => op, - Op::FMnMx(op) => op, - Op::FMul(op) => op, - Op::Rro(op) => op, - Op::MuFu(op) => op, - Op::FSet(op) => op, - Op::FSetP(op) => op, - Op::FSwz(op) => op, - Op::DAdd(op) => op, - Op::DFma(op) => op, - Op::DMnMx(op) => op, - Op::DMul(op) => op, - Op::DSetP(op) => op, - Op::Bfe(op) => op, - Op::Flo(op) => op, - Op::IAdd2(op) => op, - Op::IAdd2X(op) => op, - Op::IMad(op) => op, - Op::IMul(op) => op, - Op::IMnMx(op) => op, - Op::ISetP(op) => op, - Op::Lop2(op) => op, - Op::PopC(op) => op, - Op::Shl(op) => op, - Op::Shr(op) => op, - Op::F2F(op) => op, - Op::F2I(op) => op, - Op::I2F(op) => op, - Op::I2I(op) => op, - Op::Mov(op) => op, - Op::Prmt(op) => op, - Op::Sel(op) => op, - Op::Shfl(op) => op, - Op::PSetP(op) => op, - Op::Tex(op) => op, - Op::Tld(op) => op, - Op::Tld4(op) => op, - Op::Tmml(op) => op, - Op::Txd(op) => op, - Op::Txq(op) => op, - Op::SuClamp(op) => op, - Op::SuBfm(op) => op, - Op::SuEau(op) => op, - Op::IMadSp(op) => op, - Op::SuLdGa(op) => op, - Op::SuStGa(op) => op, - Op::Ld(op) => op, - Op::Ldc(op) => op, - Op::LdSharedLock(op) => op, - Op::St(op) => op, - Op::StSCheckUnlock(op) => op, - Op::Atom(op) => op, - Op::AL2P(op) => op, - Op::ALd(op) => op, - Op::ASt(op) => op, - Op::Ipa(op) => op, - Op::CCtl(op) => op, - Op::MemBar(op) => op, - Op::Bra(op) => op, - Op::SSy(op) => op, - Op::Sync(op) => op, - Op::Brk(op) => op, - Op::PBk(op) => op, - Op::Cont(op) => op, - Op::PCnt(op) => op, - Op::Exit(op) => op, - Op::Bar(op) => op, - Op::TexDepBar(op) => op, - Op::ViLd(op) => op, - Op::Kill(op) => op, - Op::Nop(op) => op, - Op::PixLd(op) => op, - Op::S2R(op) => op, - Op::Vote(op) => op, - Op::Out(op) => op, + Op::FAdd($x) => $y, + Op::FFma($x) => $y, + Op::FMnMx($x) => $y, + Op::FMul($x) => $y, + Op::Rro($x) => $y, + Op::MuFu($x) => $y, + Op::FSet($x) => $y, + Op::FSetP($x) => $y, + Op::FSwz($x) => $y, + Op::DAdd($x) => $y, + Op::DFma($x) => $y, + Op::DMnMx($x) => $y, + Op::DMul($x) => $y, + Op::DSetP($x) => $y, + Op::Bfe($x) => $y, + Op::Flo($x) => $y, + Op::IAdd2($x) => $y, + Op::IAdd2X($x) => $y, + Op::IMad($x) => $y, + Op::IMul($x) => $y, + Op::IMnMx($x) => $y, + Op::ISetP($x) => $y, + Op::Lop2($x) => $y, + Op::PopC($x) => $y, + Op::Shl($x) => $y, + Op::Shr($x) => $y, + Op::F2F($x) => $y, + Op::F2I($x) => $y, + Op::I2F($x) => $y, + Op::I2I($x) => $y, + Op::Mov($x) => $y, + Op::Prmt($x) => $y, + Op::Sel($x) => $y, + Op::Shfl($x) => $y, + Op::PSetP($x) => $y, + Op::Tex($x) => $y, + Op::Tld($x) => $y, + Op::Tld4($x) => $y, + Op::Tmml($x) => $y, + Op::Txd($x) => $y, + Op::Txq($x) => $y, + Op::SuClamp($x) => $y, + Op::SuBfm($x) => $y, + Op::SuEau($x) => $y, + Op::IMadSp($x) => $y, + Op::SuLdGa($x) => $y, + Op::SuStGa($x) => $y, + Op::Ld($x) => $y, + Op::Ldc($x) => $y, + Op::LdSharedLock($x) => $y, + Op::St($x) => $y, + Op::StSCheckUnlock($x) => $y, + Op::Atom($x) => $y, + Op::AL2P($x) => $y, + Op::ALd($x) => $y, + Op::ASt($x) => $y, + Op::Ipa($x) => $y, + Op::CCtl($x) => $y, + Op::MemBar($x) => $y, + Op::Bra($x) => $y, + Op::SSy($x) => $y, + Op::Sync($x) => $y, + Op::Brk($x) => $y, + Op::PBk($x) => $y, + Op::Cont($x) => $y, + Op::PCnt($x) => $y, + Op::Exit($x) => $y, + Op::Bar($x) => $y, + Op::TexDepBar($x) => $y, + Op::ViLd($x) => $y, + Op::Kill($x) => $y, + Op::Nop($x) => $y, + Op::PixLd($x) => $y, + Op::S2R($x) => $y, + Op::Vote($x) => $y, + Op::Out($x) => $y, _ => panic!("Unhandled instruction {}", $op), } }; } -fn as_sm20_op(op: &Op) -> &dyn SM20Op { - as_sm20_op_match!(op) -} - -fn as_sm20_op_mut(op: &mut Op) -> &mut dyn SM20Op { - as_sm20_op_match!(op) +impl SM20Op for Op { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + sm20_op_match!(self, |op| op.legalize(b)); + } + fn encode(&self, e: &mut SM20Encoder<'_>) { + sm20_op_match!(self, |op| op.encode(e)); + } } fn encode_sm20_shader(sm: &ShaderModel20, s: &Shader<'_>) -> Vec { @@ -3076,7 +3077,7 @@ fn encode_sm20_shader(sm: &ShaderModel20, s: &Shader<'_>) -> Vec { labels: &labels, inst: [0_u32; 2], }; - as_sm20_op(&instr.op).encode(&mut e); + instr.op.encode(&mut e); e.set_pred(&instr.pred); encoded.extend(&e.inst[..]); } @@ -3098,7 +3099,7 @@ impl KeplerInstructionEncoder for ShaderModel20 { labels, inst: [0_u32; 2], }; - as_sm20_op(&instr.op).encode(&mut e); + instr.op.encode(&mut e); e.set_pred(&instr.pred); encoded.extend(&e.inst[..]); } diff --git a/src/nouveau/compiler/nak/sm32.rs b/src/nouveau/compiler/nak/sm32.rs index 4b1e64e9255..76ad114c958 100644 --- a/src/nouveau/compiler/nak/sm32.rs +++ b/src/nouveau/compiler/nak/sm32.rs @@ -115,7 +115,7 @@ impl ShaderModel for ShaderModel32 { } fn legalize_op(&self, b: &mut LegalizeBuilder, op: &mut Op) { - as_sm32_op_mut(op).legalize(b); + op.legalize(b); } fn encode_shader(&self, s: &Shader<'_>) -> Vec { @@ -3280,97 +3280,98 @@ impl SM32Op for OpOut { // - 0x1b8 quadon (enable all threads in quad) // - 0x1c0 quadpop (redisable them) // - 0x190 ret -macro_rules! as_sm50_op_match { - ($op: expr) => { +macro_rules! sm32_op_match { + ($op: expr, |$x: ident| $y: expr) => { match $op { - Op::FAdd(op) => op, - Op::FFma(op) => op, - Op::FMnMx(op) => op, - Op::FMul(op) => op, - Op::Rro(op) => op, - Op::MuFu(op) => op, - Op::FSet(op) => op, - Op::FSetP(op) => op, - Op::FSwz(op) => op, - Op::DAdd(op) => op, - Op::DFma(op) => op, - Op::DMnMx(op) => op, - Op::DMul(op) => op, - Op::DSetP(op) => op, - Op::Bfe(op) => op, - Op::Flo(op) => op, - Op::IAdd2(op) => op, - Op::IAdd2X(op) => op, - Op::IMad(op) => op, - Op::IMul(op) => op, - Op::IMnMx(op) => op, - Op::ISetP(op) => op, - Op::Lop2(op) => op, - Op::PopC(op) => op, - Op::Shf(op) => op, - Op::Shl(op) => op, - Op::Shr(op) => op, - Op::F2F(op) => op, - Op::F2I(op) => op, - Op::I2F(op) => op, - Op::I2I(op) => op, - Op::Mov(op) => op, - Op::Prmt(op) => op, - Op::Sel(op) => op, - Op::Shfl(op) => op, - Op::PSetP(op) => op, - Op::Tex(op) => op, - Op::Tld(op) => op, - Op::Tld4(op) => op, - Op::Tmml(op) => op, - Op::Txd(op) => op, - Op::Txq(op) => op, - Op::SuClamp(op) => op, - Op::SuBfm(op) => op, - Op::SuEau(op) => op, - Op::IMadSp(op) => op, - Op::SuLdGa(op) => op, - Op::SuStGa(op) => op, - Op::Ld(op) => op, - Op::Ldc(op) => op, - Op::LdSharedLock(op) => op, - Op::St(op) => op, - Op::StSCheckUnlock(op) => op, - Op::Atom(op) => op, - Op::AL2P(op) => op, - Op::ALd(op) => op, - Op::ASt(op) => op, - Op::Ipa(op) => op, - Op::CCtl(op) => op, - Op::MemBar(op) => op, - Op::Bra(op) => op, - Op::SSy(op) => op, - Op::Sync(op) => op, - Op::Brk(op) => op, - Op::PBk(op) => op, - Op::Cont(op) => op, - Op::PCnt(op) => op, - Op::Exit(op) => op, - Op::Bar(op) => op, - Op::TexDepBar(op) => op, - Op::ViLd(op) => op, - Op::Kill(op) => op, - Op::Nop(op) => op, - Op::PixLd(op) => op, - Op::S2R(op) => op, - Op::Vote(op) => op, - Op::Out(op) => op, + Op::FAdd($x) => $y, + Op::FFma($x) => $y, + Op::FMnMx($x) => $y, + Op::FMul($x) => $y, + Op::Rro($x) => $y, + Op::MuFu($x) => $y, + Op::FSet($x) => $y, + Op::FSetP($x) => $y, + Op::FSwz($x) => $y, + Op::DAdd($x) => $y, + Op::DFma($x) => $y, + Op::DMnMx($x) => $y, + Op::DMul($x) => $y, + Op::DSetP($x) => $y, + Op::Bfe($x) => $y, + Op::Flo($x) => $y, + Op::IAdd2($x) => $y, + Op::IAdd2X($x) => $y, + Op::IMad($x) => $y, + Op::IMul($x) => $y, + Op::IMnMx($x) => $y, + Op::ISetP($x) => $y, + Op::Lop2($x) => $y, + Op::PopC($x) => $y, + Op::Shf($x) => $y, + Op::Shl($x) => $y, + Op::Shr($x) => $y, + Op::F2F($x) => $y, + Op::F2I($x) => $y, + Op::I2F($x) => $y, + Op::I2I($x) => $y, + Op::Mov($x) => $y, + Op::Prmt($x) => $y, + Op::Sel($x) => $y, + Op::Shfl($x) => $y, + Op::PSetP($x) => $y, + Op::Tex($x) => $y, + Op::Tld($x) => $y, + Op::Tld4($x) => $y, + Op::Tmml($x) => $y, + Op::Txd($x) => $y, + Op::Txq($x) => $y, + Op::SuClamp($x) => $y, + Op::SuBfm($x) => $y, + Op::SuEau($x) => $y, + Op::IMadSp($x) => $y, + Op::SuLdGa($x) => $y, + Op::SuStGa($x) => $y, + Op::Ld($x) => $y, + Op::Ldc($x) => $y, + Op::LdSharedLock($x) => $y, + Op::St($x) => $y, + Op::StSCheckUnlock($x) => $y, + Op::Atom($x) => $y, + Op::AL2P($x) => $y, + Op::ALd($x) => $y, + Op::ASt($x) => $y, + Op::Ipa($x) => $y, + Op::CCtl($x) => $y, + Op::MemBar($x) => $y, + Op::Bra($x) => $y, + Op::SSy($x) => $y, + Op::Sync($x) => $y, + Op::Brk($x) => $y, + Op::PBk($x) => $y, + Op::Cont($x) => $y, + Op::PCnt($x) => $y, + Op::Exit($x) => $y, + Op::Bar($x) => $y, + Op::TexDepBar($x) => $y, + Op::ViLd($x) => $y, + Op::Kill($x) => $y, + Op::Nop($x) => $y, + Op::PixLd($x) => $y, + Op::S2R($x) => $y, + Op::Vote($x) => $y, + Op::Out($x) => $y, _ => panic!("Unhandled instruction {}", $op), } }; } -fn as_sm32_op(op: &Op) -> &dyn SM32Op { - as_sm50_op_match!(op) -} - -fn as_sm32_op_mut(op: &mut Op) -> &mut dyn SM32Op { - as_sm50_op_match!(op) +impl SM32Op for Op { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + sm32_op_match!(self, |op| op.legalize(b)); + } + fn encode(&self, e: &mut SM32Encoder<'_>) { + sm32_op_match!(self, |op| op.encode(e)); + } } impl KeplerInstructionEncoder for ShaderModel32 { @@ -3386,7 +3387,7 @@ impl KeplerInstructionEncoder for ShaderModel32 { labels, inst: [0_u32; 2], }; - as_sm32_op(&instr.op).encode(&mut e); + instr.op.encode(&mut e); e.set_pred(&instr.pred); encoded.extend(&e.inst[..]); } diff --git a/src/nouveau/compiler/nak/sm50.rs b/src/nouveau/compiler/nak/sm50.rs index 4cc1f323189..34c3f83942e 100644 --- a/src/nouveau/compiler/nak/sm50.rs +++ b/src/nouveau/compiler/nak/sm50.rs @@ -160,7 +160,7 @@ impl ShaderModel for ShaderModel50 { } fn legalize_op(&self, b: &mut LegalizeBuilder, op: &mut Op) { - as_sm50_op_mut(op).legalize(b); + op.legalize(b); } fn encode_shader(&self, s: &Shader<'_>) -> Vec { @@ -3270,92 +3270,93 @@ impl SM50Op for OpOut { } } -macro_rules! as_sm50_op_match { - ($op: expr) => { +macro_rules! sm50_op_match { + ($op: expr, |$x: ident| $y: expr) => { match $op { - Op::FAdd(op) => op, - Op::FMnMx(op) => op, - Op::FMul(op) => op, - Op::FFma(op) => op, - Op::FSet(op) => op, - Op::FSetP(op) => op, - Op::FSwzAdd(op) => op, - Op::Rro(op) => op, - Op::MuFu(op) => op, - Op::Flo(op) => op, - Op::DAdd(op) => op, - Op::DFma(op) => op, - Op::DMnMx(op) => op, - Op::DMul(op) => op, - Op::DSetP(op) => op, - Op::IAdd2(op) => op, - Op::IAdd2X(op) => op, - Op::Mov(op) => op, - Op::Sel(op) => op, - Op::Shfl(op) => op, - Op::Vote(op) => op, - Op::PSetP(op) => op, - Op::SuSt(op) => op, - Op::S2R(op) => op, - Op::PopC(op) => op, - Op::Prmt(op) => op, - Op::Ld(op) => op, - Op::Ldc(op) => op, - Op::St(op) => op, - Op::Lop2(op) => op, - Op::Shf(op) => op, - Op::Shl(op) => op, - Op::Shr(op) => op, - Op::F2F(op) => op, - Op::F2I(op) => op, - Op::I2F(op) => op, - Op::I2I(op) => op, - Op::IMad(op) => op, - Op::IMul(op) => op, - Op::IMnMx(op) => op, - Op::ISetP(op) => op, - Op::Tex(op) => op, - Op::Tld(op) => op, - Op::Tld4(op) => op, - Op::Tmml(op) => op, - Op::Txd(op) => op, - Op::Txq(op) => op, - Op::Ipa(op) => op, - Op::AL2P(op) => op, - Op::ALd(op) => op, - Op::ASt(op) => op, - Op::CCtl(op) => op, - Op::MemBar(op) => op, - Op::Atom(op) => op, - Op::Bra(op) => op, - Op::SSy(op) => op, - Op::Sync(op) => op, - Op::Brk(op) => op, - Op::PBk(op) => op, - Op::Cont(op) => op, - Op::PCnt(op) => op, - Op::Exit(op) => op, - Op::Bar(op) => op, - Op::SuLd(op) => op, - Op::SuAtom(op) => op, - Op::Kill(op) => op, - Op::CS2R(op) => op, - Op::Nop(op) => op, - Op::PixLd(op) => op, - Op::Isberd(op) => op, - Op::Out(op) => op, - Op::Bfe(op) => op, + Op::FAdd($x) => $y, + Op::FMnMx($x) => $y, + Op::FMul($x) => $y, + Op::FFma($x) => $y, + Op::FSet($x) => $y, + Op::FSetP($x) => $y, + Op::FSwzAdd($x) => $y, + Op::Rro($x) => $y, + Op::MuFu($x) => $y, + Op::Flo($x) => $y, + Op::DAdd($x) => $y, + Op::DFma($x) => $y, + Op::DMnMx($x) => $y, + Op::DMul($x) => $y, + Op::DSetP($x) => $y, + Op::IAdd2($x) => $y, + Op::IAdd2X($x) => $y, + Op::Mov($x) => $y, + Op::Sel($x) => $y, + Op::Shfl($x) => $y, + Op::Vote($x) => $y, + Op::PSetP($x) => $y, + Op::SuSt($x) => $y, + Op::S2R($x) => $y, + Op::PopC($x) => $y, + Op::Prmt($x) => $y, + Op::Ld($x) => $y, + Op::Ldc($x) => $y, + Op::St($x) => $y, + Op::Lop2($x) => $y, + Op::Shf($x) => $y, + Op::Shl($x) => $y, + Op::Shr($x) => $y, + Op::F2F($x) => $y, + Op::F2I($x) => $y, + Op::I2F($x) => $y, + Op::I2I($x) => $y, + Op::IMad($x) => $y, + Op::IMul($x) => $y, + Op::IMnMx($x) => $y, + Op::ISetP($x) => $y, + Op::Tex($x) => $y, + Op::Tld($x) => $y, + Op::Tld4($x) => $y, + Op::Tmml($x) => $y, + Op::Txd($x) => $y, + Op::Txq($x) => $y, + Op::Ipa($x) => $y, + Op::AL2P($x) => $y, + Op::ALd($x) => $y, + Op::ASt($x) => $y, + Op::CCtl($x) => $y, + Op::MemBar($x) => $y, + Op::Atom($x) => $y, + Op::Bra($x) => $y, + Op::SSy($x) => $y, + Op::Sync($x) => $y, + Op::Brk($x) => $y, + Op::PBk($x) => $y, + Op::Cont($x) => $y, + Op::PCnt($x) => $y, + Op::Exit($x) => $y, + Op::Bar($x) => $y, + Op::SuLd($x) => $y, + Op::SuAtom($x) => $y, + Op::Kill($x) => $y, + Op::CS2R($x) => $y, + Op::Nop($x) => $y, + Op::PixLd($x) => $y, + Op::Isberd($x) => $y, + Op::Out($x) => $y, + Op::Bfe($x) => $y, _ => panic!("Unhandled instruction {}", $op), } }; } -fn as_sm50_op(op: &Op) -> &dyn SM50Op { - as_sm50_op_match!(op) -} - -fn as_sm50_op_mut(op: &mut Op) -> &mut dyn SM50Op { - as_sm50_op_match!(op) +impl SM50Op for Op { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + sm50_op_match!(self, |op| op.legalize(b)); + } + fn encode(&self, e: &mut SM50Encoder<'_>) { + sm50_op_match!(self, |op| op.encode(e)); + } } fn encode_instr( @@ -3375,7 +3376,7 @@ fn encode_instr( }; if let Some(instr) = instr { - as_sm50_op(&instr.op).encode(&mut e); + instr.op.encode(&mut e); e.set_pred(&instr.pred); e.set_instr_deps(&instr.deps); } else { diff --git a/src/nouveau/compiler/nak/sm70_encode.rs b/src/nouveau/compiler/nak/sm70_encode.rs index 48107515261..68e480f50ea 100644 --- a/src/nouveau/compiler/nak/sm70_encode.rs +++ b/src/nouveau/compiler/nak/sm70_encode.rs @@ -4002,108 +4002,109 @@ impl SM70Op for OpLdsm { } } -macro_rules! as_sm70_op_match { - ($op: expr) => { +macro_rules! sm70_op_match { + ($op: expr, |$x: ident| $y: expr) => { match $op { - Op::FAdd(op) => op, - Op::FFma(op) => op, - Op::FMnMx(op) => op, - Op::FMul(op) => op, - Op::FSet(op) => op, - Op::FSetP(op) => op, - Op::FSwzAdd(op) => op, - Op::DAdd(op) => op, - Op::DFma(op) => op, - Op::DMul(op) => op, - Op::DSetP(op) => op, - Op::HAdd2(op) => op, - Op::HFma2(op) => op, - Op::HMul2(op) => op, - Op::HSet2(op) => op, - Op::HSetP2(op) => op, - Op::HMnMx2(op) => op, - Op::MuFu(op) => op, - Op::BMsk(op) => op, - Op::BRev(op) => op, - Op::Flo(op) => op, - Op::IAbs(op) => op, - Op::IAdd3(op) => op, - Op::IAdd3X(op) => op, - Op::IDp4(op) => op, - Op::IMad(op) => op, - Op::IMad64(op) => op, - Op::IMnMx(op) => op, - Op::ISetP(op) => op, - Op::Lea(op) => op, - Op::LeaX(op) => op, - Op::Lop3(op) => op, - Op::PopC(op) => op, - Op::Shf(op) => op, - Op::F2F(op) => op, - Op::F2FP(op) => op, - Op::F2I(op) => op, - Op::I2F(op) => op, - Op::FRnd(op) => op, - Op::Mov(op) => op, - Op::Prmt(op) => op, - Op::Sel(op) => op, - Op::Shfl(op) => op, - Op::PLop3(op) => op, - Op::R2UR(op) => op, - Op::Redux(op) => op, - Op::Tex(op) => op, - Op::Tld(op) => op, - Op::Tld4(op) => op, - Op::Tmml(op) => op, - Op::Txd(op) => op, - Op::Txq(op) => op, - Op::SuLd(op) => op, - Op::SuSt(op) => op, - Op::SuAtom(op) => op, - Op::Ld(op) => op, - Op::Ldc(op) => op, - Op::St(op) => op, - Op::Atom(op) => op, - Op::AL2P(op) => op, - Op::ALd(op) => op, - Op::ASt(op) => op, - Op::Ipa(op) => op, - Op::LdTram(op) => op, - Op::CCtl(op) => op, - Op::MemBar(op) => op, - Op::BClear(op) => op, - Op::BMov(op) => op, - Op::Break(op) => op, - Op::BSSy(op) => op, - Op::BSync(op) => op, - Op::Bra(op) => op, - Op::Exit(op) => op, - Op::WarpSync(op) => op, - Op::Bar(op) => op, - Op::CS2R(op) => op, - Op::Isberd(op) => op, - Op::Kill(op) => op, - Op::Nop(op) => op, - Op::PixLd(op) => op, - Op::S2R(op) => op, - Op::Out(op) => op, - Op::OutFinal(op) => op, - Op::Vote(op) => op, - Op::Match(op) => op, - Op::Hmma(op) => op, - Op::Imma(op) => op, - Op::Ldsm(op) => op, + Op::FAdd($x) => $y, + Op::FFma($x) => $y, + Op::FMnMx($x) => $y, + Op::FMul($x) => $y, + Op::FSet($x) => $y, + Op::FSetP($x) => $y, + Op::FSwzAdd($x) => $y, + Op::DAdd($x) => $y, + Op::DFma($x) => $y, + Op::DMul($x) => $y, + Op::DSetP($x) => $y, + Op::HAdd2($x) => $y, + Op::HFma2($x) => $y, + Op::HMul2($x) => $y, + Op::HSet2($x) => $y, + Op::HSetP2($x) => $y, + Op::HMnMx2($x) => $y, + Op::MuFu($x) => $y, + Op::BMsk($x) => $y, + Op::BRev($x) => $y, + Op::Flo($x) => $y, + Op::IAbs($x) => $y, + Op::IAdd3($x) => $y, + Op::IAdd3X($x) => $y, + Op::IDp4($x) => $y, + Op::IMad($x) => $y, + Op::IMad64($x) => $y, + Op::IMnMx($x) => $y, + Op::ISetP($x) => $y, + Op::Lea($x) => $y, + Op::LeaX($x) => $y, + Op::Lop3($x) => $y, + Op::PopC($x) => $y, + Op::Shf($x) => $y, + Op::F2F($x) => $y, + Op::F2FP($x) => $y, + Op::F2I($x) => $y, + Op::I2F($x) => $y, + Op::FRnd($x) => $y, + Op::Mov($x) => $y, + Op::Prmt($x) => $y, + Op::Sel($x) => $y, + Op::Shfl($x) => $y, + Op::PLop3($x) => $y, + Op::R2UR($x) => $y, + Op::Redux($x) => $y, + Op::Tex($x) => $y, + Op::Tld($x) => $y, + Op::Tld4($x) => $y, + Op::Tmml($x) => $y, + Op::Txd($x) => $y, + Op::Txq($x) => $y, + Op::SuLd($x) => $y, + Op::SuSt($x) => $y, + Op::SuAtom($x) => $y, + Op::Ld($x) => $y, + Op::Ldc($x) => $y, + Op::St($x) => $y, + Op::Atom($x) => $y, + Op::AL2P($x) => $y, + Op::ALd($x) => $y, + Op::ASt($x) => $y, + Op::Ipa($x) => $y, + Op::LdTram($x) => $y, + Op::CCtl($x) => $y, + Op::MemBar($x) => $y, + Op::BClear($x) => $y, + Op::BMov($x) => $y, + Op::Break($x) => $y, + Op::BSSy($x) => $y, + Op::BSync($x) => $y, + Op::Bra($x) => $y, + Op::Exit($x) => $y, + Op::WarpSync($x) => $y, + Op::Bar($x) => $y, + Op::CS2R($x) => $y, + Op::Isberd($x) => $y, + Op::Kill($x) => $y, + Op::Nop($x) => $y, + Op::PixLd($x) => $y, + Op::S2R($x) => $y, + Op::Out($x) => $y, + Op::OutFinal($x) => $y, + Op::Vote($x) => $y, + Op::Match($x) => $y, + Op::Hmma($x) => $y, + Op::Imma($x) => $y, + Op::Ldsm($x) => $y, _ => panic!("Unsupported op: {}", $op), } }; } -fn as_sm70_op(op: &Op) -> &dyn SM70Op { - as_sm70_op_match!(op) -} - -fn as_sm70_op_mut(op: &mut Op) -> &mut dyn SM70Op { - as_sm70_op_match!(op) +impl SM70Op for Op { + fn legalize(&mut self, b: &mut LegalizeBuilder) { + sm70_op_match!(self, |op| op.legalize(b)); + } + fn encode(&self, e: &mut SM70Encoder<'_>) { + sm70_op_match!(self, |op| op.encode(e)); + } } pub fn legalize_sm70_op( @@ -4111,7 +4112,7 @@ pub fn legalize_sm70_op( b: &mut LegalizeBuilder, op: &mut Op, ) { - as_sm70_op_mut(op).legalize(b); + op.legalize(b); } pub fn encode_sm70_shader(sm: &dyn ShaderModel, s: &Shader<'_>) -> Vec { @@ -4141,7 +4142,7 @@ pub fn encode_sm70_shader(sm: &dyn ShaderModel, s: &Shader<'_>) -> Vec { labels: &labels, inst: [0_u32; 4], }; - as_sm70_op(&instr.op).encode(&mut e); + instr.op.encode(&mut e); e.set_pred(&instr.pred); e.set_instr_deps(&instr.deps); encoded.extend_from_slice(&e.inst[..]);