// NEON SIMD instruction encodings (extracted from Instruction::instr_bytes)
///|
fn Instruction::instr_bytes_simd(self : Instruction) -> (Int, Int, Int, Int) {
match self {
// ============ NEON SIMD Instructions ============
LdrQ(rd, rn, imm) => {
// LDR Qt, [Xn, #imm] (128-bit): 0x3DC00000 | (imm12/16 << 10) | (Rn << 5) | Rd
let scaled = (imm / 16) & 0xFFF
let enc = 0x3DC00000 | (scaled << 10) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
StrQ(rt, rn, imm) => {
// STR Qt, [Xn, #imm] (128-bit): 0x3D800000 | (imm12/16 << 10) | (Rn << 5) | Rt
let scaled = (imm / 16) & 0xFFF
let enc = 0x3D800000 | (scaled << 10) | ((rn & 31) << 5) | (rt & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Dup16B(rd, rn) => {
// DUP Vd.16B, Wn: 0x4E010C00 | (Rn << 5) | Rd
let enc = 0x4E010C00 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Dup8H(rd, rn) => {
// DUP Vd.8H, Wn: 0x4E020C00 | (Rn << 5) | Rd
let enc = 0x4E020C00 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Dup4S(rd, rn) => {
// DUP Vd.4S, Wn: 0x4E040C00 | (Rn << 5) | Rd
let enc = 0x4E040C00 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Dup2D(rd, rn) => {
// DUP Vd.2D, Xn: 0x4E080C00 | (Rn << 5) | Rd
let enc = 0x4E080C00 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
DupElem4S(rd, rn, lane) => {
// DUP Vd.4S, Vn.S[lane]: 0x4E040400 | (lane << 19) | (Rn << 5) | Rd
let enc = 0x4E040400 | ((lane & 3) << 19) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
DupElem2D(rd, rn, lane) => {
// DUP Vd.2D, Vn.D[lane]: 0x4E080400 | (lane << 20) | (Rn << 5) | Rd
let enc = 0x4E080400 | ((lane & 1) << 20) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
UmovB(rd, rn, lane) => {
// UMOV Wd, Vn.B[lane]: 0x0E013C00 | (lane << 17) | (Rn << 5) | Rd
let enc = 0x0E013C00 | ((lane & 15) << 17) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
UmovH(rd, rn, lane) => {
// UMOV Wd, Vn.H[lane]: 0x0E023C00 | (lane << 18) | (Rn << 5) | Rd
let enc = 0x0E023C00 | ((lane & 7) << 18) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
UmovS(rd, rn, lane) => {
// UMOV Wd, Vn.S[lane]: 0x0E043C00 | (lane << 19) | (Rn << 5) | Rd
let enc = 0x0E043C00 | ((lane & 3) << 19) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
UmovD(rd, rn, lane) => {
// UMOV Xd, Vn.D[lane]: 0x4E083C00 | (lane << 20) | (Rn << 5) | Rd
let enc = 0x4E083C00 | ((lane & 1) << 20) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
SmovB(rd, rn, lane) => {
// SMOV Wd, Vn.B[lane]: 0x0E012C00 | (lane << 17) | (Rn << 5) | Rd
let enc = 0x0E012C00 | ((lane & 15) << 17) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
SmovH(rd, rn, lane) => {
// SMOV Wd, Vn.H[lane]: 0x0E022C00 | (lane << 18) | (Rn << 5) | Rd
let enc = 0x0E022C00 | ((lane & 7) << 18) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
SmovS(rd, rn, lane) => {
// SMOV Xd, Vn.S[lane]: 0x4E042C00 | (lane << 19) | (Rn << 5) | Rd
let enc = 0x4E042C00 | ((lane & 3) << 19) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
DupScalarS(rd, rn, lane) => {
// DUP Sd, Vn.S[lane]: 0x5E040400 | (lane << 19) | (Rn << 5) | Rd
let enc = 0x5E040400 | ((lane & 3) << 19) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
DupScalarD(rd, rn, lane) => {
// DUP Dd, Vn.D[lane]: 0x5E080400 | (lane << 20) | (Rn << 5) | Rd
let enc = 0x5E080400 | ((lane & 1) << 20) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsB(rd, lane, rn) => {
// INS Vd.B[lane], Wn: 0x4E001C00 | (imm5 << 16) | (Rn << 5) | Rd
// imm5[0] = 1 (B size), imm5[4:1] = lane index (0-15)
let imm5 = (lane << 1) | 1
let enc = 0x4E001C00 | (imm5 << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsH(rd, lane, rn) => {
// INS Vd.H[lane], Wn: 0x4E001C00 | (imm5 << 16) | (Rn << 5) | Rd
// imm5[1:0] = 10 (H size), imm5[4:2] = lane index (0-7)
let imm5 = (lane << 2) | 2
let enc = 0x4E001C00 | (imm5 << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsS(rd, lane, rn) => {
// INS Vd.S[lane], Wn: 0x4E001C00 | (imm5 << 16) | (Rn << 5) | Rd
// imm5[2:0] = 100 (S size), imm5[4:3] = lane index (0-3)
let imm5 = (lane << 3) | 4
let enc = 0x4E001C00 | (imm5 << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsD(rd, lane, rn) => {
// INS Vd.D[lane], Xn: 0x4E001C00 | (imm5 << 16) | (Rn << 5) | Rd
// imm5[3:0] = 1000 (D size), imm5[4] = lane index
let imm5 = (lane << 4) | 8
let enc = 0x4E001C00 | (imm5 << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsElemS(rd, dlane, rn, slane) => {
// INS Vd.S[dlane], Vn.S[slane]: 0x6E000400 | (dlane << 19) | (slane << 13) | (Rn << 5) | Rd
let imm5 = (dlane << 3) | 4
let imm4 = slane << 2
let enc = 0x6E000400 |
(imm5 << 16) |
(imm4 << 11) |
((rn & 31) << 5) |
(rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
InsElemD(rd, dlane, rn, slane) => {
// INS Vd.D[dlane], Vn.D[slane]: 0x6E000400 | (dlane << 20) | (slane << 14) | (Rn << 5) | Rd
let imm5 = (dlane << 4) | 8
let imm4 = slane << 3
let enc = 0x6E000400 |
(imm5 << 16) |
(imm4 << 11) |
((rn & 31) << 5) |
(rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Not16B(rd, rn) => {
// NOT Vd.16B, Vn.16B: 0x6E205800 | (Rn << 5) | Rd
let enc = 0x6E205800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
And16B(rd, rn, rm) => {
// AND Vd.16B, Vn.16B, Vm.16B: 0x4E201C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E201C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Orr16B(rd, rn, rm) => {
// ORR Vd.16B, Vn.16B, Vm.16B: 0x4EA01C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA01C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Eor16B(rd, rn, rm) => {
// EOR Vd.16B, Vn.16B, Vm.16B: 0x6E201C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E201C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Bic16B(rd, rn, rm) => {
// BIC Vd.16B, Vn.16B, Vm.16B: 0x4E601C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E601C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Bsl16B(rd, rn, rm) => {
// BSL Vd.16B, Vn.16B, Vm.16B: 0x6E601C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E601C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Tbl1(rd, rn, rm) => {
// TBL Vd.16B, {Vn.16B}, Vm.16B: 0x4E000000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E000000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Add16B(rd, rn, rm) => {
// ADD Vd.16B, Vn.16B, Vm.16B: 0x4E208400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E208400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sub16B(rd, rn, rm) => {
// SUB Vd.16B, Vn.16B, Vm.16B: 0x6E208400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E208400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Add8H(rd, rn, rm) => {
// ADD Vd.8H, Vn.8H, Vm.8H: 0x4E608400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E608400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sub8H(rd, rn, rm) => {
// SUB Vd.8H, Vn.8H, Vm.8H: 0x6E608400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E608400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Mul8H(rd, rn, rm) => {
// MUL Vd.8H, Vn.8H, Vm.8H: 0x4E609C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E609C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Add4S(rd, rn, rm) => {
// ADD Vd.4S, Vn.4S, Vm.4S: 0x4EA08400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA08400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sub4S(rd, rn, rm) => {
// SUB Vd.4S, Vn.4S, Vm.4S: 0x6EA08400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6EA08400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Mul4S(rd, rn, rm) => {
// MUL Vd.4S, Vn.4S, Vm.4S: 0x4EA09C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA09C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Add2D(rd, rn, rm) => {
// ADD Vd.2D, Vn.2D, Vm.2D: 0x4EE08400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EE08400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sub2D(rd, rn, rm) => {
// SUB Vd.2D, Vn.2D, Vm.2D: 0x6EE08400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6EE08400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqadd16B(rd, rn, rm) => {
// SQADD Vd.16B, Vn.16B, Vm.16B: 0x4E200C00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E200C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqadd8H(rd, rn, rm) => {
let enc = 0x4E600C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqadd4S(rd, rn, rm) => {
let enc = 0x4EA00C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqadd2D(rd, rn, rm) => {
let enc = 0x4EE00C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqadd16B(rd, rn, rm) => {
// UQADD Vd.16B, Vn.16B, Vm.16B: 0x6E200C00 | ...
let enc = 0x6E200C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqadd8H(rd, rn, rm) => {
let enc = 0x6E600C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqadd4S(rd, rn, rm) => {
let enc = 0x6EA00C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqadd2D(rd, rn, rm) => {
let enc = 0x6EE00C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqsub16B(rd, rn, rm) => {
let enc = 0x4E202C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqsub8H(rd, rn, rm) => {
let enc = 0x4E602C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqsub4S(rd, rn, rm) => {
let enc = 0x4EA02C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqsub2D(rd, rn, rm) => {
let enc = 0x4EE02C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqsub16B(rd, rn, rm) => {
let enc = 0x6E202C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqsub8H(rd, rn, rm) => {
let enc = 0x6E602C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqsub4S(rd, rn, rm) => {
let enc = 0x6EA02C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqsub2D(rd, rn, rm) => {
let enc = 0x6EE02C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smin16B(rd, rn, rm) => {
let enc = 0x4E206C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smin8H(rd, rn, rm) => {
let enc = 0x4E606C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smin4S(rd, rn, rm) => {
let enc = 0x4EA06C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umin16B(rd, rn, rm) => {
let enc = 0x6E206C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umin8H(rd, rn, rm) => {
let enc = 0x6E606C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umin4S(rd, rn, rm) => {
let enc = 0x6EA06C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smax16B(rd, rn, rm) => {
let enc = 0x4E206400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smax8H(rd, rn, rm) => {
let enc = 0x4E606400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smax4S(rd, rn, rm) => {
let enc = 0x4EA06400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umax16B(rd, rn, rm) => {
let enc = 0x6E206400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umax8H(rd, rn, rm) => {
let enc = 0x6E606400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umax4S(rd, rn, rm) => {
let enc = 0x6EA06400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Urhadd16B(rd, rn, rm) => {
let enc = 0x6E201400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Urhadd8H(rd, rn, rm) => {
let enc = 0x6E601400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Urhadd4S(rd, rn, rm) => {
let enc = 0x6EA01400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Abs16B(rd, rn) => {
let enc = 0x4E20B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Abs8H(rd, rn) => {
let enc = 0x4E60B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Abs4S(rd, rn) => {
let enc = 0x4EA0B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Abs2D(rd, rn) => {
let enc = 0x4EE0B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Neg16B(rd, rn) => {
let enc = 0x6E20B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Neg8H(rd, rn) => {
let enc = 0x6E60B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Neg4S(rd, rn) => {
let enc = 0x6EA0B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Neg2D(rd, rn) => {
let enc = 0x6EE0B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cnt16B(rd, rn) => {
let enc = 0x4E205800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sshl16B(rd, rn, rm) => {
let enc = 0x4E204400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sshl8H(rd, rn, rm) => {
let enc = 0x4E604400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sshl4S(rd, rn, rm) => {
let enc = 0x4EA04400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sshl2D(rd, rn, rm) => {
let enc = 0x4EE04400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ushl16B(rd, rn, rm) => {
let enc = 0x6E204400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ushl8H(rd, rn, rm) => {
let enc = 0x6E604400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ushl4S(rd, rn, rm) => {
let enc = 0x6EA04400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ushl2D(rd, rn, rm) => {
let enc = 0x6EE04400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmeq16B(rd, rn, rm) => {
let enc = 0x6E208C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmeq8H(rd, rn, rm) => {
let enc = 0x6E608C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmeq4S(rd, rn, rm) => {
let enc = 0x6EA08C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmeq2D(rd, rn, rm) => {
let enc = 0x6EE08C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmgt16B(rd, rn, rm) => {
let enc = 0x4E203400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmgt8H(rd, rn, rm) => {
let enc = 0x4E603400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmgt4S(rd, rn, rm) => {
let enc = 0x4EA03400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmgt2D(rd, rn, rm) => {
let enc = 0x4EE03400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmge16B(rd, rn, rm) => {
let enc = 0x4E203C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmge8H(rd, rn, rm) => {
let enc = 0x4E603C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmge4S(rd, rn, rm) => {
let enc = 0x4EA03C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmge2D(rd, rn, rm) => {
let enc = 0x4EE03C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhi16B(rd, rn, rm) => {
let enc = 0x6E203400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhi8H(rd, rn, rm) => {
let enc = 0x6E603400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhi4S(rd, rn, rm) => {
let enc = 0x6EA03400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhi2D(rd, rn, rm) => {
let enc = 0x6EE03400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhs16B(rd, rn, rm) => {
let enc = 0x6E203C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhs8H(rd, rn, rm) => {
let enc = 0x6E603C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhs4S(rd, rn, rm) => {
let enc = 0x6EA03C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Cmhs2D(rd, rn, rm) => {
let enc = 0x6EE03C00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
OrrVec(rd, rn) => {
// ORR Vd.16B, Vn.16B, Vn.16B (vector move): same as Orr16B with rm=rn
let enc = 0x4EA01C00 | ((rn & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
MoviZero(rd) => {
// MOVI Vd.2D, #0: 0x6F00E400 | Rd
// This zeroes the entire 128-bit vector register
let enc = 0x6F00E400 | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umaxv16B(rd, rn) => {
// UMAXV Bd, Vn.16B: 0x6E30A800 | (Rn << 5) | Rd
let enc = 0x6E30A800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uminv16B(rd, rn) => {
// UMINV Bd, Vn.16B: 0x6E31A800 | (Rn << 5) | Rd
let enc = 0x6E31A800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uminv8H(rd, rn) => {
// UMINV Hd, Vn.8H: 0x6E71A800 | (Rn << 5) | Rd
// Note: U bit (bit 29) must be 1 for unsigned; 0x4E would be SMINV
let enc = 0x6E71A800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uminv4S(rd, rn) => {
// UMINV Sd, Vn.4S: 0x6EB1A800 | (Rn << 5) | Rd
let enc = 0x6EB1A800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uaddlp8H(rd, rn) => {
// UADDLP Vd.8H, Vn.16B: 0x6E202800 | (Rn << 5) | Rd
let enc = 0x6E202800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uaddlp4S(rd, rn) => {
// UADDLP Vd.4S, Vn.8H: 0x6E602800 | (Rn << 5) | Rd
let enc = 0x6E602800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uaddlp2D(rd, rn) => {
// UADDLP Vd.2D, Vn.4S: 0x6EA02800 | (Rn << 5) | Rd
let enc = 0x6EA02800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Signed pairwise add long
Saddlp8H(rd, rn) => {
// SADDLP Vd.8H, Vn.16B: 0x4E202800 | (Rn << 5) | Rd
let enc = 0x4E202800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Saddlp4S(rd, rn) => {
// SADDLP Vd.4S, Vn.8H: 0x4E602800 | (Rn << 5) | Rd
let enc = 0x4E602800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Pairwise add (for dot product)
Addp4S(rd, rn, rm) => {
// ADDP Vd.4S, Vn.4S, Vm.4S: 0x4EA0BC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA0BC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Addp8H(rd, rn, rm) => {
// ADDP Vd.8H, Vn.8H, Vm.8H: 0x4E60BC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60BC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Q15 saturating rounding multiply high
Sqrdmulh8H(rd, rn, rm) => {
// SQRDMULH Vd.8H, Vn.8H, Vm.8H: 0x6E60B400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E60B400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Float SIMD arithmetic
Fadd4S(rd, rn, rm) => {
// FADD Vd.4S, Vn.4S, Vm.4S: 0x4E20D400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E20D400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fadd2D(rd, rn, rm) => {
// FADD Vd.2D, Vn.2D, Vm.2D: 0x4E60D400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60D400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fsub4S(rd, rn, rm) => {
// FSUB Vd.4S, Vn.4S, Vm.4S: 0x4EA0D400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA0D400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fsub2D(rd, rn, rm) => {
// FSUB Vd.2D, Vn.2D, Vm.2D: 0x4EE0D400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EE0D400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmul4S(rd, rn, rm) => {
// FMUL Vd.4S, Vn.4S, Vm.4S: 0x6E20DC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E20DC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmul2D(rd, rn, rm) => {
// FMUL Vd.2D, Vn.2D, Vm.2D: 0x6E60DC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E60DC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fdiv4S(rd, rn, rm) => {
// FDIV Vd.4S, Vn.4S, Vm.4S: 0x6E20FC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E20FC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fdiv2D(rd, rn, rm) => {
// FDIV Vd.2D, Vn.2D, Vm.2D: 0x6E60FC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E60FC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmin4S(rd, rn, rm) => {
// FMIN Vd.4S, Vn.4S, Vm.4S: 0x4EA0F400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA0F400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmin2D(rd, rn, rm) => {
// FMIN Vd.2D, Vn.2D, Vm.2D: 0x4EE0F400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EE0F400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmax4S(rd, rn, rm) => {
// FMAX Vd.4S, Vn.4S, Vm.4S: 0x4E20F400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E20F400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmax2D(rd, rn, rm) => {
// FMAX Vd.2D, Vn.2D, Vm.2D: 0x4E60F400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60F400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmla4S(rd, rn, rm) => {
// FMLA Vd.4S, Vn.4S, Vm.4S: 0x4E20CC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E20CC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmla2D(rd, rn, rm) => {
// FMLA Vd.2D, Vn.2D, Vm.2D: 0x4E60CC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60CC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmls4S(rd, rn, rm) => {
// FMLS Vd.4S, Vn.4S, Vm.4S: 0x4EA0CC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA0CC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fmls2D(rd, rn, rm) => {
// FMLS Vd.2D, Vn.2D, Vm.2D: 0x4EE0CC00 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EE0CC00 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fabs4S(rd, rn) => {
// FABS Vd.4S, Vn.4S: 0x4EA0F800 | (Rn << 5) | Rd
let enc = 0x4EA0F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fabs2D(rd, rn) => {
// FABS Vd.2D, Vn.2D: 0x4EE0F800 | (Rn << 5) | Rd
let enc = 0x4EE0F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fneg4S(rd, rn) => {
// FNEG Vd.4S, Vn.4S: 0x6EA0F800 | (Rn << 5) | Rd
let enc = 0x6EA0F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fneg2D(rd, rn) => {
// FNEG Vd.2D, Vn.2D: 0x6EE0F800 | (Rn << 5) | Rd
let enc = 0x6EE0F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fsqrt4S(rd, rn) => {
// FSQRT Vd.4S, Vn.4S: 0x6EA1F800 | (Rn << 5) | Rd
let enc = 0x6EA1F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fsqrt2D(rd, rn) => {
// FSQRT Vd.2D, Vn.2D: 0x6EE1F800 | (Rn << 5) | Rd
let enc = 0x6EE1F800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Float comparisons
Fcmeq4S(rd, rn, rm) => {
// FCMEQ Vd.4S, Vn.4S, Vm.4S: 0x4E20E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E20E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcmeq2D(rd, rn, rm) => {
// FCMEQ Vd.2D, Vn.2D, Vm.2D: 0x4E60E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcmgt4S(rd, rn, rm) => {
// FCMGT Vd.4S, Vn.4S, Vm.4S: 0x6EA0E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6EA0E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcmgt2D(rd, rn, rm) => {
// FCMGT Vd.2D, Vn.2D, Vm.2D: 0x6EE0E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6EE0E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcmge4S(rd, rn, rm) => {
// FCMGE Vd.4S, Vn.4S, Vm.4S: 0x6E20E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E20E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcmge2D(rd, rn, rm) => {
// FCMGE Vd.2D, Vn.2D, Vm.2D: 0x6E60E400 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E60E400 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Float rounding
Frintp4S(rd, rn) => {
// FRINTP Vd.4S, Vn.4S (ceil): 0x4EA18800 | (Rn << 5) | Rd
let enc = 0x4EA18800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintp2D(rd, rn) => {
// FRINTP Vd.2D, Vn.2D (ceil): 0x4EE18800 | (Rn << 5) | Rd
let enc = 0x4EE18800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintm4S(rd, rn) => {
// FRINTM Vd.4S, Vn.4S (floor): 0x4E219800 | (Rn << 5) | Rd
let enc = 0x4E219800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintm2D(rd, rn) => {
// FRINTM Vd.2D, Vn.2D (floor): 0x4E619800 | (Rn << 5) | Rd
let enc = 0x4E619800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintz4S(rd, rn) => {
// FRINTZ Vd.4S, Vn.4S (trunc): 0x4EA19800 | (Rn << 5) | Rd
let enc = 0x4EA19800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintz2D(rd, rn) => {
// FRINTZ Vd.2D, Vn.2D (trunc): 0x4EE19800 | (Rn << 5) | Rd
let enc = 0x4EE19800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintn4S(rd, rn) => {
// FRINTN Vd.4S, Vn.4S (nearest): 0x4E218800 | (Rn << 5) | Rd
let enc = 0x4E218800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Frintn2D(rd, rn) => {
// FRINTN Vd.2D, Vn.2D (nearest): 0x4E618800 | (Rn << 5) | Rd
let enc = 0x4E618800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Rev64_4S(rd, rn) => {
// REV64 Vd.4S, Vn.4S: 0x4EA00800 | (Rn << 5) | Rd
// Swaps 32-bit halves within each 64-bit lane
let enc = 0x4EA00800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
ShlImm2D(rd, rn, imm) => {
// SHL Vd.2D, Vn.2D, #imm: 0x4F405400 | ((imm+64) << 16) | (Rn << 5) | Rd
// For .2D, shift amount encoding is (imm + 64)
let shift_enc = (imm + 64) & 127
let enc = 0x4F005400 | (shift_enc << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Xtn2S(rd, rn) => {
// XTN Vd.2S, Vn.2D: 0x0EA12800 | (Rn << 5) | Rd
// Narrows 64-bit elements to 32-bit, extracting lower halves
let enc = 0x0EA12800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull2D(rd, rn, rm) => {
// UMULL Vd.2D, Vn.2S, Vm.2S: 0x2EA0C000 | (Rm << 16) | (Rn << 5) | Rd
// Multiplies 32-bit elements, producing 64-bit results
let enc = 0x2EA0C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Integer to float conversions
Scvtf4S(rd, rn) => {
// SCVTF Vd.4S, Vn.4S (signed i32 -> f32): 0x4E21D800 | (Rn << 5) | Rd
let enc = 0x4E21D800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Scvtf2D(rd, rn) => {
// SCVTF Vd.2D, Vn.2D (signed i64 -> f64): 0x4E61D800 | (Rn << 5) | Rd
let enc = 0x4E61D800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ucvtf4S(rd, rn) => {
// UCVTF Vd.4S, Vn.4S (unsigned i32 -> f32): 0x6E21D800 | (Rn << 5) | Rd
let enc = 0x6E21D800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ucvtf2D(rd, rn) => {
// UCVTF Vd.2D, Vn.2D (unsigned i64 -> f64): 0x6E61D800 | (Rn << 5) | Rd
let enc = 0x6E61D800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Float to integer conversions (truncating toward zero, saturating)
Fcvtzs4S(rd, rn) => {
// FCVTZS Vd.4S, Vn.4S (f32 -> signed i32): 0x4EA1B800 | (Rn << 5) | Rd
let enc = 0x4EA1B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcvtzs2D(rd, rn) => {
// FCVTZS Vd.2D, Vn.2D (f64 -> signed i64): 0x4EE1B800 | (Rn << 5) | Rd
let enc = 0x4EE1B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcvtzu4S(rd, rn) => {
// FCVTZU Vd.4S, Vn.4S (f32 -> unsigned i32): 0x6EA1B800 | (Rn << 5) | Rd
let enc = 0x6EA1B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcvtzu2D(rd, rn) => {
// FCVTZU Vd.2D, Vn.2D (f64 -> unsigned i64): 0x6EE1B800 | (Rn << 5) | Rd
let enc = 0x6EE1B800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Sign/zero extend i32x2 to i64x2 (for low lane conversions)
Sxtl2D(rd, rn) => {
// SXTL Vd.2D, Vn.2S (aka SSHLL #0): 0x0F20A400 | (Rn << 5) | Rd
let enc = 0x0F20A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl2D(rd, rn) => {
// UXTL Vd.2D, Vn.2S (aka USHLL #0): 0x2F20A400 | (Rn << 5) | Rd
let enc = 0x2F20A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Additional extend operations (for all sizes)
Sxtl8H(rd, rn) => {
// SXTL Vd.8H, Vn.8B (aka SSHLL #0): 0x0F08A400 | (Rn << 5) | Rd
let enc = 0x0F08A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sxtl4S(rd, rn) => {
// SXTL Vd.4S, Vn.4H (aka SSHLL #0): 0x0F10A400 | (Rn << 5) | Rd
let enc = 0x0F10A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl8H(rd, rn) => {
// UXTL Vd.8H, Vn.8B (aka USHLL #0): 0x2F08A400 | (Rn << 5) | Rd
let enc = 0x2F08A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl4S(rd, rn) => {
// UXTL Vd.4S, Vn.4H (aka USHLL #0): 0x2F10A400 | (Rn << 5) | Rd
let enc = 0x2F10A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Extend high (SXTL2/UXTL2 - takes upper half of input)
Sxtl2_8H(rd, rn) => {
// SXTL2 Vd.8H, Vn.16B (aka SSHLL2 #0): 0x4F08A400 | (Rn << 5) | Rd
let enc = 0x4F08A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sxtl2_4S(rd, rn) => {
// SXTL2 Vd.4S, Vn.8H (aka SSHLL2 #0): 0x4F10A400 | (Rn << 5) | Rd
let enc = 0x4F10A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sxtl2_2D(rd, rn) => {
// SXTL2 Vd.2D, Vn.4S (aka SSHLL2 #0): 0x4F20A400 | (Rn << 5) | Rd
let enc = 0x4F20A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl2_8H(rd, rn) => {
// UXTL2 Vd.8H, Vn.16B (aka USHLL2 #0): 0x6F08A400 | (Rn << 5) | Rd
let enc = 0x6F08A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl2_4S(rd, rn) => {
// UXTL2 Vd.4S, Vn.8H (aka USHLL2 #0): 0x6F10A400 | (Rn << 5) | Rd
let enc = 0x6F10A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uxtl2_2D(rd, rn) => {
// UXTL2 Vd.2D, Vn.4S (aka USHLL2 #0): 0x6F20A400 | (Rn << 5) | Rd
let enc = 0x6F20A400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Float precision conversions
Fcvtn2S(rd, rn) => {
// FCVTN Vd.2S, Vn.2D (demote f64x2 to f32x2): 0x0E616800 | (Rn << 5) | Rd
let enc = 0x0E616800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Fcvtl2D(rd, rn) => {
// FCVTL Vd.2D, Vn.2S (promote f32x2 to f64x2): 0x0E617800 | (Rn << 5) | Rd
let enc = 0x0E617800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Saturating narrow (lower half)
// Note: 0x2800 is XTN (non-saturating), 0x4800 is SQXTN (saturating)
Sqxtn8B(rd, rn) => {
// SQXTN Vd.8B, Vn.8H: 0x0E214800 | (Rn << 5) | Rd
let enc = 0x0E214800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtn4H(rd, rn) => {
// SQXTN Vd.4H, Vn.4S: 0x0E614800 | (Rn << 5) | Rd
let enc = 0x0E614800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtn2S(rd, rn) => {
// SQXTN Vd.2S, Vn.2D: 0x0EA14800 | (Rn << 5) | Rd
// Note: 0x2800 is XTN (non-saturating), 0x4800 is SQXTN (saturating)
let enc = 0x0EA14800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtun8B(rd, rn) => {
// SQXTUN Vd.8B, Vn.8H: 0x2E212800 | (Rn << 5) | Rd
let enc = 0x2E212800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtun4H(rd, rn) => {
// SQXTUN Vd.4H, Vn.4S: 0x2E612800 | (Rn << 5) | Rd
let enc = 0x2E612800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Uqxtn2S(rd, rn) => {
// UQXTN Vd.2S, Vn.2D: 0x2EA14800 | (Rn << 5) | Rd
let enc = 0x2EA14800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Saturating narrow (upper half - writes to upper portion)
// Note: 0x2800 is XTN2 (non-saturating), 0x4800 is SQXTN2 (saturating)
Sqxtn2_16B(rd, rn) => {
// SQXTN2 Vd.16B, Vn.8H: 0x4E214800 | (Rn << 5) | Rd
let enc = 0x4E214800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtn2_8H(rd, rn) => {
// SQXTN2 Vd.8H, Vn.4S: 0x4E614800 | (Rn << 5) | Rd
let enc = 0x4E614800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtun2_16B(rd, rn) => {
// SQXTUN2 Vd.16B, Vn.8H: 0x6E212800 | (Rn << 5) | Rd
let enc = 0x6E212800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Sqxtun2_8H(rd, rn) => {
// SQXTUN2 Vd.8H, Vn.4S: 0x6E612800 | (Rn << 5) | Rd
let enc = 0x6E612800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Extended multiply (SMULL/UMULL - low half, SMULL2/UMULL2 - high half)
Smull8H(rd, rn, rm) => {
// SMULL Vd.8H, Vn.8B, Vm.8B: 0x0E20C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x0E20C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smull4S(rd, rn, rm) => {
// SMULL Vd.4S, Vn.4H, Vm.4H: 0x0E60C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x0E60C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smull2D(rd, rn, rm) => {
// SMULL Vd.2D, Vn.2S, Vm.2S: 0x0EA0C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x0EA0C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull8H(rd, rn, rm) => {
// UMULL Vd.8H, Vn.8B, Vm.8B: 0x2E20C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x2E20C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull4S(rd, rn, rm) => {
// UMULL Vd.4S, Vn.4H, Vm.4H: 0x2E60C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x2E60C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Note: Umull2D already defined above for i64x2.mul emulation
Smull2_8H(rd, rn, rm) => {
// SMULL2 Vd.8H, Vn.16B, Vm.16B: 0x4E20C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E20C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smull2_4S(rd, rn, rm) => {
// SMULL2 Vd.4S, Vn.8H, Vm.8H: 0x4E60C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4E60C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Smull2_2D(rd, rn, rm) => {
// SMULL2 Vd.2D, Vn.4S, Vm.4S: 0x4EA0C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x4EA0C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull2_8H(rd, rn, rm) => {
// UMULL2 Vd.8H, Vn.16B, Vm.16B: 0x6E20C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E20C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull2_4S(rd, rn, rm) => {
// UMULL2 Vd.4S, Vn.8H, Vm.8H: 0x6E60C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6E60C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Umull2_2D(rd, rn, rm) => {
// UMULL2 Vd.2D, Vn.4S, Vm.4S: 0x6EA0C000 | (Rm << 16) | (Rn << 5) | Rd
let enc = 0x6EA0C000 | ((rm & 31) << 16) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Load and replicate (LD1R)
Ld1rB(rd, rn) => {
// LD1R {Vd.16B}, [Xn]: 0x4D40C000 | (Rn << 5) | Rd
let enc = 0x4D40C000 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1rH(rd, rn) => {
// LD1R {Vd.8H}, [Xn]: 0x4D40C400 | (Rn << 5) | Rd
let enc = 0x4D40C400 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1rS(rd, rn) => {
// LD1R {Vd.4S}, [Xn]: 0x4D40C800 | (Rn << 5) | Rd
let enc = 0x4D40C800 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1rD(rd, rn) => {
// LD1R {Vd.2D}, [Xn]: 0x4D40CC00 | (Rn << 5) | Rd
let enc = 0x4D40CC00 | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Load single element to lane (LD1)
Ld1B(rd, rn, lane) => {
// LD1 {Vd.B}[lane], [Xn]: 0x0D400000 | (Q << 30) | (lane_hi << 11) | (lane_lo << 10) | (Rn << 5) | Rd
// For .B lanes 0-15: Q=lane[3], lane encoding in bits [12:10, 30]
let q = (lane >> 3) & 1
let s = (lane >> 2) & 1
let size = lane & 3
let enc = 0x0D400000 |
(q << 30) |
(s << 12) |
(size << 10) |
((rn & 31) << 5) |
(rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1H(rd, rn, lane) => {
// LD1 {Vd.H}[lane], [Xn]: lanes 0-7
let q = (lane >> 2) & 1
let s = (lane >> 1) & 1
let size = (lane & 1) << 1
let enc = 0x0D404000 |
(q << 30) |
(s << 12) |
(size << 10) |
((rn & 31) << 5) |
(rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1S(rd, rn, lane) => {
// LD1 {Vd.S}[lane], [Xn]: lanes 0-3
let q = (lane >> 1) & 1
let s = lane & 1
let enc = 0x0D408000 |
(q << 30) |
(s << 12) |
((rn & 31) << 5) |
(rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
Ld1D(rd, rn, lane) => {
// LD1 {Vd.D}[lane], [Xn]: lanes 0-1
let q = lane & 1
let enc = 0x0D408400 | (q << 30) | ((rn & 31) << 5) | (rd & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
// Store single element from lane (ST1)
St1B(rn, rd, lane) => {
// ST1 {Vn.B}[lane], [Xd]: Same encoding as LD1 but with L=0 instead of L=1
let q = (lane >> 3) & 1
let s = (lane >> 2) & 1
let size = lane & 3
let enc = 0x0D000000 |
(q << 30) |
(s << 12) |
(size << 10) |
((rd & 31) << 5) |
(rn & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
St1H(rn, rd, lane) => {
// ST1 {Vn.H}[lane], [Xd]: lanes 0-7
let q = (lane >> 2) & 1
let s = (lane >> 1) & 1
let size = (lane & 1) << 1
let enc = 0x0D004000 |
(q << 30) |
(s << 12) |
(size << 10) |
((rd & 31) << 5) |
(rn & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
St1S(rn, rd, lane) => {
// ST1 {Vn.S}[lane], [Xd]: lanes 0-3
let q = (lane >> 1) & 1
let s = lane & 1
let enc = 0x0D008000 |
(q << 30) |
(s << 12) |
((rd & 31) << 5) |
(rn & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
St1D(rn, rd, lane) => {
// ST1 {Vn.D}[lane], [Xd]: lanes 0-1
let q = lane & 1
let enc = 0x0D008400 | (q << 30) | ((rd & 31) << 5) | (rn & 31)
(enc & 0xFF, (enc >> 8) & 0xFF, (enc >> 16) & 0xFF, (enc >> 24) & 0xFF)
}
_ =>
abort(
"non-SIMD instruction routed to instr_bytes_simd: \{self.annotate()}",
)
}
}