diff --git a/crates/xenia-cpu/src/disasm.rs b/crates/xenia-cpu/src/disasm.rs index 5a98981..352219c 100644 --- a/crates/xenia-cpu/src/disasm.rs +++ b/crates/xenia-cpu/src/disasm.rs @@ -361,7 +361,15 @@ pub fn format(instr: &DecodedInstr) -> DisasmText { PpcOpcode::dcbz => fmt_cache(instr, "dcbz"), PpcOpcode::dcbz128 => fmt_cache(instr, "dcbz128"), PpcOpcode::icbi => fmt_cache(instr, "icbi"), - PpcOpcode::sync => base("sync", String::new(), 0), + PpcOpcode::sync => { + // L-field at PPC bit 10 (host bit 21) selects lwsync (L=1), the + // acquire barrier in every Xbox 360 spinlock. PPCBUG-641. + if (instr.raw >> 21) & 1 == 1 { + with_ext("sync", String::new(), 0, "lwsync", String::new(), 0) + } else { + base("sync", String::new(), 0) + } + } PpcOpcode::eieio => base("eieio", String::new(), 0), PpcOpcode::isync => base("isync", String::new(), 0), diff --git a/crates/xenia-cpu/tests/golden/extended_mnemonics.json b/crates/xenia-cpu/tests/golden/extended_mnemonics.json index 6749f94..0c442dd 100644 --- a/crates/xenia-cpu/tests/golden/extended_mnemonics.json +++ b/crates/xenia-cpu/tests/golden/extended_mnemonics.json @@ -525,7 +525,9 @@ "raw": "0x7C2004AC", "addr": "0x82000000", "mnemonic": "sync", - "operands": "" + "operands": "", + "ext_mnemonic": "lwsync", + "ext_operands": "" }, { "label": "trap",