nak: impl SM*Op for Op

We can skip creating an &dyn and instead use a match to dispatch into
the inner type's functions.

Acked-by: Faith Ekstrand <faith.ekstrand@collabora.com>
Reviewed-by: Seán de Búrca <leftmostcat@gmail.com>
Part-of: <https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/37315>
This commit is contained in:
Mel Henning 2025-09-11 00:05:26 -04:00 committed by Marge Bot
parent 6f6c309167
commit 9257f5607f
4 changed files with 358 additions and 354 deletions

View file

@ -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<u32> {
@ -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<u32> {
@ -3076,7 +3077,7 @@ fn encode_sm20_shader(sm: &ShaderModel20, s: &Shader<'_>) -> Vec<u32> {
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[..]);
}

View file

@ -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<u32> {
@ -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[..]);
}

View file

@ -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<u32> {
@ -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 {

View file

@ -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<u32> {
@ -4141,7 +4142,7 @@ pub fn encode_sm70_shader(sm: &dyn ShaderModel, s: &Shader<'_>) -> Vec<u32> {
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[..]);