use core::arch::asm;
macro_rules! dsp_rr {
($(#[$meta:meta])* $name:ident, $f3:literal, $f7:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(a: usize, b: usize) -> usize {
let value: usize;
unsafe {
asm!(
concat!(".insn r 0x7F,", $f3, ", ", $f7, ", {}, {}, {}"),
lateout(reg) value, in(reg) a, in(reg) b,
options(pure, nomem, nostack),
);
}
value
}
};
}
macro_rules! dsp_rrr {
($(#[$meta:meta])* $name:ident, $f3:literal, $f7:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(t: usize, a: usize, b: usize) -> usize {
let mut value: usize;
unsafe {
asm!(
concat!(".insn r 0x7F,", $f3, ", ", $f7, ", {}, {}, {}"),
inlateout(reg) t => value, in(reg) a, in(reg) b,
options(pure, nomem, nostack),
);
}
value
}
};
}
macro_rules! dsp_oneop {
($(#[$meta:meta])* $name:ident, $imm:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
concat!(".insn i 0x7F, 0x0,{}, {}, %lo(", $imm, ")"),
lateout(reg) value, in(reg) a,
options(pure, nomem, nostack),
);
}
value
}
};
}
dsp_rr!( add16, "0x0", "0x20");
dsp_rr!( radd16, "0x0", "0x00");
dsp_rr!( uradd16, "0x0", "0x10");
dsp_rr!( kadd16, "0x0", "0x08");
dsp_rr!( ukadd16, "0x0", "0x18");
dsp_rr!( sub16, "0x0", "0x21");
dsp_rr!( rsub16, "0x0", "0x01");
dsp_rr!( ursub16, "0x0", "0x11");
dsp_rr!( ksub16, "0x0", "0x09");
dsp_rr!( uksub16, "0x0", "0x19");
dsp_rr!( cras16, "0x0", "0x22");
dsp_rr!( rcras16, "0x0", "0x02");
dsp_rr!( urcras16, "0x0", "0x12");
dsp_rr!( kcras16, "0x0", "0x0A");
dsp_rr!( ukcras16, "0x0", "0x1A");
dsp_rr!( crsa16, "0x0", "0x23");
dsp_rr!( rcrsa16, "0x0", "0x03");
dsp_rr!( urcrsa16, "0x0", "0x13");
dsp_rr!( kcrsa16, "0x0", "0x0B");
dsp_rr!( ukcrsa16, "0x0", "0x1B");
dsp_rr!( stas16, "0x3", "0x22");
dsp_rr!( rstas16, "0x3", "0x02");
dsp_rr!( urstas16, "0x3", "0x12");
dsp_rr!( kstas16, "0x3", "0x0A");
dsp_rr!( ukstas16, "0x3", "0x1A");
dsp_rr!( stsa16, "0x3", "0x23");
dsp_rr!( rstsa16, "0x3", "0x03");
dsp_rr!( urstsa16, "0x3", "0x13");
dsp_rr!( kstsa16, "0x3", "0x0B");
dsp_rr!( ukstsa16, "0x3", "0x1B");
dsp_rr!( add8, "0x0", "0x24");
dsp_rr!( radd8, "0x0", "0x04");
dsp_rr!( uradd8, "0x0", "0x14");
dsp_rr!( kadd8, "0x0", "0x0C");
dsp_rr!( ukadd8, "0x0", "0x1C");
dsp_rr!( sub8, "0x0", "0x25");
dsp_rr!( rsub8, "0x0", "0x05");
dsp_rr!( ursub8, "0x0", "0x15");
dsp_rr!( ksub8, "0x0", "0x0D");
dsp_rr!( uksub8, "0x0", "0x1D");
dsp_rr!( sra16, "0x0", "0x28");
dsp_rr!( sra16u, "0x0", "0x30");
dsp_rr!( srl16, "0x0", "0x29");
dsp_rr!( srl16u, "0x0", "0x31");
dsp_rr!( sll16, "0x0", "0x2A");
dsp_rr!( ksll16, "0x0", "0x32");
dsp_rr!( kslra16, "0x0", "0x2B");
dsp_rr!( kslra16u, "0x0", "0x33");
dsp_rr!( sra8, "0x0", "0x2C");
dsp_rr!( sra8u, "0x0", "0x34");
dsp_rr!( srl8, "0x0", "0x2D");
dsp_rr!( srl8u, "0x0", "0x35");
dsp_rr!( sll8, "0x0", "0x2E");
dsp_rr!( ksll8, "0x0", "0x36");
dsp_rr!( kslra8, "0x0", "0x2F");
dsp_rr!( kslra8u, "0x0", "0x37");
dsp_rr!( cmpeq16, "0x0", "0x26");
dsp_rr!( scmplt16, "0x0", "0x06");
dsp_rr!( scmple16, "0x0", "0x0E");
dsp_rr!( ucmplt16, "0x0", "0x16");
dsp_rr!( ucmple16, "0x0", "0x1E");
dsp_rr!( cmpeq8, "0x0", "0x27");
dsp_rr!( scmplt8, "0x0", "0x07");
dsp_rr!( scmple8, "0x0", "0x0F");
dsp_rr!( ucmplt8, "0x0", "0x17");
dsp_rr!( ucmple8, "0x0", "0x1F");
dsp_rr!( smin16, "0x0", "0x40");
dsp_rr!( umin16, "0x0", "0x48");
dsp_rr!( smax16, "0x0", "0x41");
dsp_rr!( umax16, "0x0", "0x49");
dsp_rr!( smin8, "0x0", "0x44");
dsp_rr!( umin8, "0x0", "0x4C");
dsp_rr!( smax8, "0x0", "0x45");
dsp_rr!( umax8, "0x0", "0x4D");
dsp_oneop!( kabs16, "0xAD1");
dsp_oneop!( kabs8, "0xAD0");
dsp_oneop!( clrs16, "0xAE8");
dsp_oneop!( clrs8, "0xAE0");
dsp_oneop!( clrs32, "0xAF8");
dsp_oneop!( clz16, "0xAE9");
dsp_oneop!( clz8, "0xAE1");
dsp_oneop!( clz32, "0xAF9");
#[inline(always)]
pub fn swap16(a: usize) -> usize {
let value: usize;
unsafe {
asm!(".insn r 0x7F,0x0, 0x0F, {}, {}, {}",
lateout(reg) value, in(reg) a, in(reg) a,
options(pure, nomem, nostack));
}
value
}
dsp_oneop!( swap8, "0xAD8");
dsp_rr!( pkbt16, "0x1", "0x0F");
dsp_rr!( pktb16, "0x1", "0x1F");
dsp_oneop!( sunpkd810, "0xAC8");
dsp_oneop!( sunpkd820, "0xAC9");
dsp_oneop!( sunpkd830, "0xACA");
dsp_oneop!( sunpkd831, "0xACB");
dsp_oneop!( sunpkd832, "0xAD3");
dsp_oneop!( zunpkd810, "0xACC");
dsp_oneop!( zunpkd820, "0xACD");
dsp_oneop!( zunpkd830, "0xACE");
dsp_oneop!( zunpkd831, "0xACF");
dsp_oneop!( zunpkd832, "0xAD7");
dsp_rrr!( smaqa, "0x0", "0x64");
dsp_rrr!( umaqa, "0x0", "0x66");
dsp_rrr!( smaqasu, "0x0", "0x65");
dsp_rr!( kaddh, "0x1", "0x02");
dsp_rr!( ksubh, "0x1", "0x03");
dsp_rr!( ukaddh, "0x1", "0x0A");
dsp_rr!( uksubh, "0x1", "0x0B");
dsp_rr!( pbsad, "0x0", "0x7E");
dsp_rrr!( pbsada, "0x0", "0x7F");
dsp_rr!(
smmul, "0x1", "0x20"
);
dsp_rr!(
smmul_u, "0x1", "0x28"
);
dsp_rr!(
kwmmul, "0x1", "0x31"
);
dsp_rr!(
kwmmul_u, "0x1", "0x39"
);
dsp_rrr!(
kmmac, "0x1", "0x30"
);
dsp_rrr!(
kmmac_u, "0x1", "0x38"
);
dsp_rrr!(
kmmsb, "0x1", "0x21"
);
dsp_rrr!(
kmmsb_u, "0x1", "0x29"
);
dsp_rr!(
smmwb, "0x1", "0x22"
);
dsp_rr!(
smmwb_u, "0x1", "0x2A"
);
dsp_rr!(
smmwt, "0x1", "0x32"
);
dsp_rr!(
smmwt_u, "0x1", "0x3A"
);
dsp_rr!(
kmmwb2, "0x1", "0x47"
);
dsp_rr!(
kmmwb2_u, "0x1", "0x4F"
);
dsp_rr!(
kmmwt2, "0x1", "0x57"
);
dsp_rr!(
kmmwt2_u, "0x1", "0x5F"
);
dsp_rrr!(
kmmawb, "0x1", "0x23"
);
dsp_rrr!(
kmmawb_u, "0x1", "0x2B"
);
dsp_rrr!(
kmmawt, "0x1", "0x33"
);
dsp_rrr!(
kmmawt_u, "0x1", "0x3B"
);
dsp_rrr!(
kmmawb2, "0x1", "0x67"
);
dsp_rrr!(
kmmawb2_u, "0x1", "0x6F"
);
dsp_rrr!(
kmmawt2, "0x1", "0x77"
);
dsp_rrr!(
kmmawt2_u, "0x1", "0x7F"
);
dsp_rr!(
smbb16, "0x1", "0x04"
);
dsp_rr!(
smbt16, "0x1", "0x0C"
);
dsp_rr!(
smtt16, "0x1", "0x14"
);
dsp_rr!(
kmda, "0x1", "0x1C"
);
dsp_rr!(
kmxda, "0x1", "0x1D"
);
dsp_rr!(
smds, "0x1", "0x2C"
);
dsp_rr!(
smdrs, "0x1", "0x34"
);
dsp_rr!(
smxds, "0x1", "0x3C"
);
dsp_rrr!(
kmabb, "0x1", "0x2D"
);
dsp_rrr!(
kmabt, "0x1", "0x35"
);
dsp_rrr!(
kmatt, "0x1", "0x3D"
);
dsp_rrr!(
kmada, "0x1", "0x24"
);
dsp_rrr!(
kmaxda, "0x1", "0x25"
);
dsp_rrr!(
kmads, "0x1", "0x2E"
);
dsp_rrr!(
kmadrs, "0x1", "0x36"
);
dsp_rrr!(
kmaxds, "0x1", "0x3E"
);
dsp_rrr!(
kmsda, "0x1", "0x26"
);
dsp_rrr!(
kmsxda, "0x1", "0x27"
);
dsp_rr!(
kdmbb, "0x1", "0x05"
);
dsp_rr!(
kdmbt, "0x1", "0x0D"
);
dsp_rr!(
kdmtt, "0x1", "0x15"
);
dsp_rrr!(
kdmabb, "0x1", "0x69"
);
dsp_rrr!(
kdmabt, "0x1", "0x71"
);
dsp_rrr!(
kdmatt, "0x1", "0x79"
);
dsp_rr!(
khmbb, "0x1", "0x06"
);
dsp_rr!(
khmbt, "0x1", "0x0E"
);
dsp_rr!(
khmtt, "0x1", "0x16"
);
dsp_rr!(
khm16, "0x0", "0x43"
);
dsp_rr!(
khmx16, "0x0", "0x4B"
);
dsp_rr!(
khm8, "0x0", "0x47"
);
dsp_rr!(
khmx8, "0x0", "0x4F"
);
dsp_rr!(
kaddw, "0x1", "0x00"
);
dsp_rr!(
ksubw, "0x1", "0x01"
);
dsp_rr!(
ukaddw, "0x1", "0x08"
);
dsp_rr!(
uksubw, "0x1", "0x09"
);
dsp_rr!(
raddw, "0x1", "0x10"
);
dsp_rr!(
rsubw, "0x1", "0x11"
);
dsp_rr!(
uraddw, "0x1", "0x18"
);
dsp_rr!(
ursubw, "0x1", "0x19"
);
dsp_rr!(
maxw, "0x0", "0x79"
);
dsp_rr!(
minw, "0x0", "0x78"
);
dsp_rr!(
ave, "0x0", "0x70"
);
dsp_rr!(
sra_u, "0x1", "0x12"
);
dsp_rr!(
ksllw, "0x1", "0x13"
);
dsp_rr!(
kslraw, "0x1", "0x37"
);
dsp_rr!(
kslraw_u, "0x1", "0x3F"
);
dsp_rr!(
bitrev, "0x0", "0x73"
);
dsp_rrr!(
maddr32, "0x1", "0x62"
);
dsp_rrr!(
msubr32, "0x1", "0x63"
);
dsp_rr!(
pkbb16, "0x1", "0x07"
);
dsp_rr!(
pktt16, "0x1", "0x17"
);
#[inline(always)]
pub fn kabsw(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x56, {rd}, {rs1}, x20",
rd = lateout(reg) value,
rs1 = in(reg) a,
out("x20") _,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn clo8(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x57, {rd}, {rs1}, x3",
rd = lateout(reg) value,
rs1 = in(reg) a,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn clo16(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x57, {rd}, {rs1}, x11",
rd = lateout(reg) value,
rs1 = in(reg) a,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn clo32(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x57, {rd}, {rs1}, x27",
rd = lateout(reg) value,
rs1 = in(reg) a,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn smul16(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x50, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn smulx16(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x51, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn umul16(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x58, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn umulx16(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x59, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn smul8(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x54, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn smulx8(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x55, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn umul8(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x5C, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn umulx8(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x5D, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
out("a4") lo,
out("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
macro_rules! dsp_pair {
($(#[$meta:meta])* $name:ident, $f3:literal, $f7:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(a: (usize, usize), b: (usize, usize)) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
concat!(".insn r 0x7F,", $f3, ", ", $f7, ", a4, a0, a2"),
in("a0") a.0, in("a1") a.1,
in("a2") b.0, in("a3") b.1,
lateout("a4") lo, lateout("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
};
}
macro_rules! dsp_pair_acc {
($(#[$meta:meta])* $name:ident, $f3:literal, $f7:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(t: (usize, usize), a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
concat!(".insn r 0x7F,", $f3, ", ", $f7, ", a4, {rs1}, {rs2}"),
rs1 = in(reg) a,
rs2 = in(reg) b,
inlateout("a4") t.0 => lo,
inlateout("a5") t.1 => hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
};
}
dsp_pair!(
add64, "0x1", "0x60"
);
dsp_pair!(
sub64, "0x1", "0x61"
);
dsp_pair!(
radd64, "0x1", "0x40"
);
dsp_pair!(
uradd64, "0x1", "0x50"
);
dsp_pair!(
kadd64, "0x1", "0x48"
);
dsp_pair!(
ukadd64, "0x1", "0x58"
);
dsp_pair!(
rsub64, "0x1", "0x41"
);
dsp_pair!(
ursub64, "0x1", "0x51"
);
dsp_pair!(
ksub64, "0x1", "0x49"
);
dsp_pair!(
uksub64, "0x1", "0x59"
);
dsp_pair_acc!(
smar64, "0x1", "0x42"
);
dsp_pair_acc!(
smsr64, "0x1", "0x43"
);
dsp_pair_acc!(
umar64, "0x1", "0x52"
);
dsp_pair_acc!(
umsr64, "0x1", "0x53"
);
dsp_pair_acc!(
kmar64, "0x1", "0x4A"
);
dsp_pair_acc!(
kmsr64, "0x1", "0x4B"
);
dsp_pair_acc!(
ukmar64, "0x1", "0x5A"
);
dsp_pair_acc!(
ukmsr64, "0x1", "0x5B"
);
macro_rules! dsp_pair_acc_16 {
($(#[$meta:meta])* $name:ident, $f3:literal, $f7:literal) => {
$(#[$meta])*
#[inline(always)]
pub fn $name(t: (usize, usize), a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
concat!(".insn r 0x7F,", $f3, ", ", $f7, ", a4, {rs1}, {rs2}"),
rs1 = in(reg) a,
rs2 = in(reg) b,
inlateout("a4") t.0 => lo,
inlateout("a5") t.1 => hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
};
}
dsp_pair_acc_16!(
smal, "0x1", "0x2F"
);
dsp_pair_acc_16!(
smalbb, "0x1", "0x44"
);
dsp_pair_acc_16!(
smalbt, "0x1", "0x4C"
);
dsp_pair_acc_16!(
smaltt, "0x1", "0x54"
);
dsp_pair_acc_16!(
smalda, "0x1", "0x46"
);
dsp_pair_acc_16!(
smalxda, "0x1", "0x4E"
);
dsp_pair_acc_16!(
smalds, "0x1", "0x45"
);
dsp_pair_acc_16!(
smaldrs, "0x1", "0x4D"
);
dsp_pair_acc_16!(
smalxds, "0x1", "0x55"
);
dsp_pair_acc_16!(
smslda, "0x1", "0x56"
);
dsp_pair_acc_16!(
smslxda, "0x1", "0x5E"
);
#[inline(always)]
pub fn mulr64(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x1, 0x78, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
lateout("a4") lo,
lateout("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn mulsr64(a: usize, b: usize) -> (usize, usize) {
let lo: usize;
let hi: usize;
unsafe {
asm!(
".insn r 0x7F,0x1, 0x70, a4, {rs1}, {rs2}",
rs1 = in(reg) a,
rs2 = in(reg) b,
lateout("a4") lo,
lateout("a5") hi,
options(pure, nomem, nostack),
);
}
(lo, hi)
}
#[inline(always)]
pub fn sclip32<const IMM: u8>(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn i 0x7F, 0x0,{rd}, {rs1}, {imm}",
rd = lateout(reg) value,
rs1 = in(reg) a,
imm = const (0x72_i32 * 32 + (IMM as i32 & 0x1F)),
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn uclip32<const IMM: u8>(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn i 0x7F, 0x0,{rd}, {rs1}, {imm}",
rd = lateout(reg) value,
rs1 = in(reg) a,
imm = const (0x7A_i32 * 32 + (IMM as i32 & 0x1F)),
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn kslliw<const IMM: u8>(a: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn i 0x7F, 0x1, {rd}, {rs1}, {imm}",
rd = lateout(reg) value,
rs1 = in(reg) a,
imm = const (0x1B_i32 * 32 + (IMM as i32 & 0x1F)),
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn wext(pair: (usize, usize), lsb: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r 0x7F,0x0, 0x67, {rd}, a4, {rs2}",
rd = lateout(reg) value,
in("a4") pair.0,
in("a5") pair.1,
rs2 = in(reg) lsb,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn bpick(a: usize, b: usize, rc: usize) -> usize {
let value: usize;
unsafe {
asm!(
".insn r4 0x7F, 0x2, 0x3, {rd}, {rs1}, {rs2}, {rc}",
rd = lateout(reg) value,
rs1 = in(reg) a,
rs2 = in(reg) b,
rc = in(reg) rc,
options(pure, nomem, nostack),
);
}
value
}
#[inline(always)]
pub fn insb<const POS: u8>(t: usize, a: usize) -> usize {
let mut value: usize;
unsafe {
asm!(
".insn i 0x7F, 0x0,{rd}, {rs1}, {imm}",
rd = inlateout(reg) t => value,
rs1 = in(reg) a,
imm = const (0x56_i32 * 32 + (POS as i32 & 0x3)),
options(pure, nomem, nostack),
);
}
value
}