Fix mcrf, mcrfs, mcrxr, twi, twui
This commit is contained in:
parent
fa42bb6c9a
commit
3a9be32f66
|
@ -770,13 +770,13 @@ impl Opcode {
|
||||||
if code & 0xfc0007ff == 0x7c00002e {
|
if code & 0xfc0007ff == 0x7c00002e {
|
||||||
return Opcode::Lwzx;
|
return Opcode::Lwzx;
|
||||||
}
|
}
|
||||||
if code & 0xfc300fff == 0x4c000000 {
|
if code & 0xfc63ffff == 0x4c000000 {
|
||||||
return Opcode::Mcrf;
|
return Opcode::Mcrf;
|
||||||
}
|
}
|
||||||
if code & 0xfc30ffff == 0xfc000080 {
|
if code & 0xfc63ffff == 0xfc000080 {
|
||||||
return Opcode::Mcrfs;
|
return Opcode::Mcrfs;
|
||||||
}
|
}
|
||||||
if code & 0xfc30ffff == 0x7c000400 {
|
if code & 0xfc7fffff == 0x7c000400 {
|
||||||
return Opcode::Mcrxr;
|
return Opcode::Mcrxr;
|
||||||
}
|
}
|
||||||
if code & 0xfc1fffff == 0x7c000026 {
|
if code & 0xfc1fffff == 0x7c000026 {
|
||||||
|
@ -1109,7 +1109,7 @@ impl Opcode {
|
||||||
if code & 0xfc0007ff == 0x7c000008 {
|
if code & 0xfc0007ff == 0x7c000008 {
|
||||||
return Opcode::Tw;
|
return Opcode::Tw;
|
||||||
}
|
}
|
||||||
if code & 0xfc000000 == 0xc0000000 {
|
if code & 0xfc000000 == 0xc000000 {
|
||||||
return Opcode::Twi;
|
return Opcode::Twi;
|
||||||
}
|
}
|
||||||
if code & 0xfc0007fe == 0x7c000278 {
|
if code & 0xfc0007fe == 0x7c000278 {
|
||||||
|
@ -7593,6 +7593,41 @@ impl Ins {
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Opcode::Tw => {
|
||||||
|
if ((self.code >> 21u8) & 0x1f) == 4 {
|
||||||
|
return SimplifiedIns {
|
||||||
|
mnemonic: "tweq",
|
||||||
|
suffix: String::new(),
|
||||||
|
args: vec![
|
||||||
|
Argument::GPR(GPR(((self.code >> 16u8) & 0x1f) as _)),
|
||||||
|
Argument::GPR(GPR(((self.code >> 11u8) & 0x1f) as _)),
|
||||||
|
],
|
||||||
|
ins: self,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if ((self.code >> 21u8) & 0x1f) == 5 {
|
||||||
|
return SimplifiedIns {
|
||||||
|
mnemonic: "twlge",
|
||||||
|
suffix: String::new(),
|
||||||
|
args: vec![
|
||||||
|
Argument::GPR(GPR(((self.code >> 16u8) & 0x1f) as _)),
|
||||||
|
Argument::GPR(GPR(((self.code >> 11u8) & 0x1f) as _)),
|
||||||
|
],
|
||||||
|
ins: self,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if ((self.code >> 21u8) & 0x1f) == 31
|
||||||
|
&& ((self.code >> 16u8) & 0x1f) == 0
|
||||||
|
&& ((self.code >> 11u8) & 0x1f) == 0
|
||||||
|
{
|
||||||
|
return SimplifiedIns {
|
||||||
|
mnemonic: "trap",
|
||||||
|
suffix: String::new(),
|
||||||
|
args: vec![],
|
||||||
|
ins: self,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
}
|
||||||
Opcode::Twi => {
|
Opcode::Twi => {
|
||||||
if ((self.code >> 21u8) & 0x1f) == 8 {
|
if ((self.code >> 21u8) & 0x1f) == 8 {
|
||||||
return SimplifiedIns {
|
return SimplifiedIns {
|
||||||
|
@ -7622,6 +7657,20 @@ impl Ins {
|
||||||
ins: self,
|
ins: self,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
if ((self.code >> 21u8) & 0x1f) == 31 {
|
||||||
|
return SimplifiedIns {
|
||||||
|
mnemonic: "twui",
|
||||||
|
suffix: String::new(),
|
||||||
|
args: vec![
|
||||||
|
Argument::GPR(GPR(((self.code >> 16u8) & 0x1f) as _)),
|
||||||
|
Argument::Simm(Simm(
|
||||||
|
((((self.code & 0xffff) ^ 0x8000).wrapping_sub(0x8000)) as i32)
|
||||||
|
as _,
|
||||||
|
)),
|
||||||
|
],
|
||||||
|
ins: self,
|
||||||
|
};
|
||||||
|
}
|
||||||
}
|
}
|
||||||
_ => {}
|
_ => {}
|
||||||
}
|
}
|
||||||
|
|
|
@ -530,6 +530,21 @@ fn test_ins_lwzx() {
|
||||||
assert_asm!(0x7C03002E, "lwzx r0, r3, r0");
|
assert_asm!(0x7C03002E, "lwzx r0, r3, r0");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ins_mcrf() {
|
||||||
|
assert_asm!(0x4E1C0000, "mcrf cr4, cr7");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ins_mcrfs() {
|
||||||
|
assert_asm!(0xFE1C0080, "mcrfs cr4, cr7");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_ins_mcrxr() {
|
||||||
|
assert_asm!(0x7F800400, "mcrxr cr7");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ins_mfcr() {
|
fn test_ins_mfcr() {
|
||||||
assert_asm!(0x7C000026, "mfcr r0");
|
assert_asm!(0x7C000026, "mfcr r0");
|
||||||
|
@ -844,6 +859,7 @@ fn test_ins_rfi() {
|
||||||
fn test_ins_rlwimi() {
|
fn test_ins_rlwimi() {
|
||||||
assert_asm!(0x500306FE, "rlwimi r3, r0, 0, 27, 31");
|
assert_asm!(0x500306FE, "rlwimi r3, r0, 0, 27, 31");
|
||||||
assert_asm!(0x50032D74, "rlwimi r3, r0, 5, 21, 26");
|
assert_asm!(0x50032D74, "rlwimi r3, r0, 5, 21, 26");
|
||||||
|
assert_asm!(0x5400003F, "clrrwi. r0, r0, 0");
|
||||||
}
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
|
@ -1037,6 +1053,32 @@ fn test_ins_sync() {
|
||||||
assert_asm!(0x7C0004AC, "sync");
|
assert_asm!(0x7C0004AC, "sync");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_tlbie() {
|
||||||
|
assert_asm!(0x7C001A64, "tlbie r3");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_tlbsync() {
|
||||||
|
assert_asm!(0x7C00046C, "tlbsync");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_tw() {
|
||||||
|
assert_asm!(0x7C063808, "tw 0, r6, r7");
|
||||||
|
assert_asm!(0x7C842808, "tweq r4, r5");
|
||||||
|
assert_asm!(0x7CA42808, "twlge r4, r5");
|
||||||
|
assert_asm!(0x7FE00008, "trap");
|
||||||
|
}
|
||||||
|
|
||||||
|
#[test]
|
||||||
|
fn test_twi() {
|
||||||
|
assert_asm!(0x0C000000, "twi 0, r0, 0x0");
|
||||||
|
assert_asm!(0x0D07FFFF, "twgti r7, -0x1");
|
||||||
|
assert_asm!(0x0CC4FF01, "twllei r4, -0xff");
|
||||||
|
assert_asm!(0x0FE40003, "twui r4, 0x3");
|
||||||
|
}
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_ins_xor() {
|
fn test_ins_xor() {
|
||||||
assert_asm!(0x7C052A78, "xor r5, r0, r5");
|
assert_asm!(0x7C052A78, "xor r5, r0, r5");
|
||||||
|
|
20
isa.yaml
20
isa.yaml
|
@ -1058,7 +1058,7 @@ opcodes:
|
||||||
|
|
||||||
- name: mcrf
|
- name: mcrf
|
||||||
desc: Move Condition Register Field
|
desc: Move Condition Register Field
|
||||||
bitmask: 0xfc300fff
|
bitmask: 0xfc63ffff
|
||||||
pattern: 0x4c000000
|
pattern: 0x4c000000
|
||||||
args: [ crfD, crfS ]
|
args: [ crfD, crfS ]
|
||||||
defs: [ crfD ]
|
defs: [ crfD ]
|
||||||
|
@ -1066,7 +1066,7 @@ opcodes:
|
||||||
|
|
||||||
- name: mcrfs
|
- name: mcrfs
|
||||||
desc: Move to Condition Register from FPSCR
|
desc: Move to Condition Register from FPSCR
|
||||||
bitmask: 0xfc30ffff
|
bitmask: 0xfc63ffff
|
||||||
pattern: 0xfc000080
|
pattern: 0xfc000080
|
||||||
args: [ crfD, crfS ]
|
args: [ crfD, crfS ]
|
||||||
defs: [ crfD ]
|
defs: [ crfD ]
|
||||||
|
@ -1074,7 +1074,7 @@ opcodes:
|
||||||
|
|
||||||
- name: mcrxr
|
- name: mcrxr
|
||||||
desc: Move to Condition Register from XER
|
desc: Move to Condition Register from XER
|
||||||
bitmask: 0xfc30ffff
|
bitmask: 0xfc7fffff
|
||||||
pattern: 0x7c000400
|
pattern: 0x7c000400
|
||||||
args: [ crfD ]
|
args: [ crfD ]
|
||||||
defs: [ crfD, xer ]
|
defs: [ crfD, xer ]
|
||||||
|
@ -1938,7 +1938,7 @@ opcodes:
|
||||||
- name: twi
|
- name: twi
|
||||||
desc: Trap Word Immediate
|
desc: Trap Word Immediate
|
||||||
bitmask: 0xfc000000
|
bitmask: 0xfc000000
|
||||||
pattern: 0xc0000000
|
pattern: 0x0c000000
|
||||||
args: [ TO, rA, simm ]
|
args: [ TO, rA, simm ]
|
||||||
uses: [ rA ]
|
uses: [ rA ]
|
||||||
|
|
||||||
|
@ -2118,6 +2118,17 @@ mnemonics:
|
||||||
condition: crbA == crbB
|
condition: crbA == crbB
|
||||||
|
|
||||||
# Misc
|
# Misc
|
||||||
|
- name: tweq
|
||||||
|
opcode: tw
|
||||||
|
args: [ rA, rB ]
|
||||||
|
condition: TO == 4
|
||||||
|
- name: twlge
|
||||||
|
opcode: tw
|
||||||
|
args: [ rA, rB ]
|
||||||
|
condition: TO == 5
|
||||||
|
- name: trap
|
||||||
|
opcode: tw
|
||||||
|
condition: TO == 31 && rA == 0 && rB == 0
|
||||||
- name: twgti
|
- name: twgti
|
||||||
opcode: twi
|
opcode: twi
|
||||||
args: [ rA, simm ]
|
args: [ rA, simm ]
|
||||||
|
@ -2127,6 +2138,7 @@ mnemonics:
|
||||||
args: [ rA, simm ]
|
args: [ rA, simm ]
|
||||||
condition: TO == 6
|
condition: TO == 6
|
||||||
- name: twui
|
- name: twui
|
||||||
|
opcode: twi
|
||||||
args: [ rA, simm ]
|
args: [ rA, simm ]
|
||||||
condition: TO == 31
|
condition: TO == 31
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue