mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2025-12-27 19:10:14 +01:00
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:
parent
6f6c309167
commit
9257f5607f
4 changed files with 358 additions and 354 deletions
|
|
@ -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[..]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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[..]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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[..]);
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue