fix psq_st disasm

This commit is contained in:
Richard Patel 2022-04-09 02:09:44 +02:00
parent da869222d0
commit 70192c75a4
4 changed files with 33 additions and 25 deletions

View File

@ -1130,6 +1130,7 @@ pub enum Field {
simm(Simm),
uimm(Uimm),
offset(Offset),
ps_offset(Offset),
BO(OpaqueU),
BI(OpaqueU),
BD(BranchDest),
@ -1820,66 +1821,66 @@ impl Ins {
],
Opcode::PsqL => vec![
Field::frD(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::offset(Offset(
(((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as _,
Field::ps_offset(Offset(
(((self.code & 0xfff) ^ 0x800).wrapping_sub(0x800)) as _,
)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqLu => vec![
Field::frD(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::offset(Offset(
(((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as _,
Field::ps_offset(Offset(
(((self.code & 0xfff) ^ 0x800).wrapping_sub(0x800)) as _,
)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqLux => vec![
Field::frD(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::rB(GPR(((self.code >> 11u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqLx => vec![
Field::frD(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::rB(GPR(((self.code >> 11u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqSt => vec![
Field::frS(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::offset(Offset(
(((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as _,
Field::ps_offset(Offset(
(((self.code & 0xfff) ^ 0x800).wrapping_sub(0x800)) as _,
)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqStu => vec![
Field::frS(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::offset(Offset(
(((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as _,
Field::ps_offset(Offset(
(((self.code & 0xfff) ^ 0x800).wrapping_sub(0x800)) as _,
)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqStux => vec![
Field::frS(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::rB(GPR(((self.code >> 11u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsqStx => vec![
Field::frS(FPR(((self.code >> 21u8) & 0x1f) as _)),
Field::rA(GPR(((self.code >> 16u8) & 0x1f) as _)),
Field::rB(GPR(((self.code >> 11u8) & 0x1f) as _)),
Field::ps_W(OpaqueU(((self.code >> 16u8) & 0x0) as _)),
Field::ps_W(OpaqueU(((self.code >> 15u8) & 0x1) as _)),
Field::ps_l(GQR(((self.code >> 12u8) & 0x7) as _)),
],
Opcode::PsAbs => vec![
@ -5709,6 +5710,10 @@ impl Ins {
(((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as _
}
#[inline(always)]
pub fn field_ps_offset(&self) -> isize {
(((self.code & 0xfff) ^ 0x800).wrapping_sub(0x800)) as _
}
#[inline(always)]
pub fn field_BO(&self) -> usize {
((self.code >> 21u8) & 0x1f) as _
}
@ -5814,7 +5819,7 @@ impl Ins {
}
#[inline(always)]
pub fn field_ps_W(&self) -> usize {
((self.code >> 16u8) & 0x0) as _
((self.code >> 15u8) & 0x1) as _
}
#[inline(always)]
pub fn field_NB(&self) -> usize {

View File

@ -172,6 +172,7 @@ impl Field {
Field::simm(x) => Some(Argument::Simm(*x)),
Field::uimm(x) => Some(Argument::Uimm(*x)),
Field::offset(x) => Some(Argument::Offset(*x)),
Field::ps_offset(x) => Some(Argument::Offset(*x)),
Field::BO(x) => Some(Argument::OpaqueU(*x)),
Field::BI(x) => Some(Argument::OpaqueU(*x)),
Field::BD(x) => Some(Argument::BranchDest(*x)),

View File

@ -638,13 +638,11 @@ fn test_ins_psq_lx() {
assert_asm!(0x1000000C, "psq_lx f0, r0, r0, 0, qr0");
}
/*
#[test]
fn test_ins_psq_st() {
assert_asm!(0xF1230210, "psq_st f9, 0x210(r3), 0, qr0");
assert_asm!(0xF1238008, "psq_st f9, 8(r3), 1, qr0");
assert_asm!(0xF1238008, "psq_st f9, 0x8(r3), 1, qr0");
}
*/
#[test]
fn test_ins_psq_stu() {

View File

@ -11,6 +11,10 @@ fields:
arg: Offset
bits: 16..32
signed: true
- name: ps_offset
arg: Offset
bits: 20..32
signed: true
# Branch fields
- name: BO
arg: OpaqueU
@ -111,7 +115,7 @@ fields:
bits: 17..20
- name: ps_W
arg: OpaqueU
bits: 16
bits: 16..17
# Misc
- name: NB
arg: OpaqueU
@ -1262,7 +1266,7 @@ opcodes:
desc: Paired Single Quantized Load
bitmask: 0xfc000000
pattern: 0xe0000000
args: [ frD, offset, rA, ps_W, ps_l ]
args: [ frD, ps_offset, rA, ps_W, ps_l ]
defs: [ frD ]
uses: [ rA.nz ]
@ -1270,7 +1274,7 @@ opcodes:
desc: Paired Single Quantized Load with Update
bitmask: 0xfc000000
pattern: 0xe4000000
args: [ frD, offset, rA, ps_W, ps_l ]
args: [ frD, ps_offset, rA, ps_W, ps_l ]
defs: [ frD, rA ]
uses: [ rA ]
@ -1294,14 +1298,14 @@ opcodes:
desc: Paired Single Quantized Store
bitmask: 0xfc000000
pattern: 0xf0000000
args: [ frS, offset, rA, ps_W, ps_l ]
args: [ frS, ps_offset, rA, ps_W, ps_l ]
uses: [ frS, rA.nz ]
- name: psq_stu
desc: Paired Single Quantized Store with Update
bitmask: 0xfc000000
pattern: 0xf4000000
args: [ frS, offset, rA, ps_W, ps_l ]
args: [ frS, ps_offset, rA, ps_W, ps_l ]
defs: [ rA ]
uses: [ frS, rA ]