From 5ce390285d6f0b568fda09c48aa02904abac5edf Mon Sep 17 00:00:00 2001 From: Peter Veenstra Date: Fri, 25 Sep 2009 19:20:46 +0000 Subject: [PATCH] add some more cmpxchg stuff. Normal core. with question comment ;) Imported-from: https://svn.code.sf.net/p/dosbox/code-0/dosbox/trunk@3469 --- src/cpu/core_normal/prefix_0f.h | 57 +++++++++++++++++++++++++++++++++ 1 file changed, 57 insertions(+) diff --git a/src/cpu/core_normal/prefix_0f.h b/src/cpu/core_normal/prefix_0f.h index fcdcdb40..1292396f 100644 --- a/src/cpu/core_normal/prefix_0f.h +++ b/src/cpu/core_normal/prefix_0f.h @@ -356,6 +356,63 @@ CASE_0F_W(0xaf) /* IMUL Gw,Ew */ RMGwEwOp3(DIMULW,*rmrw); break; + CASE_0F_B(0xb0) /* cmpxchg Eb,Gb */ + { + if (CPU_ArchitectureType= 0xc0 ) { + GetEArb; + if (reg_al == *earb) { + *earb=*rmrb; + SETFLAGBIT(ZF,1); + } else { + reg_al = *earb; + SETFLAGBIT(ZF,0); + } + } else { + GetEAa; + Bit8u val = LoadMb(eaa); + if (reg_al == val) { + SaveMb(eaa,*rmrb); + SETFLAGBIT(ZF,1); + } else { + SaveMb(eaa,val); //NEEDED ? (val doesn't change + reg_al = val; + SETFLAGBIT(ZF,0); + } + } + break; + } + CASE_0F_W(0xb1) /* cmpxchg Ew,Gw */ + { + if (CPU_ArchitectureType= 0xc0 ) { + GetEArw; + if(reg_ax == *earw) { + *earw = *rmrw; + SETFLAGBIT(ZF,1); + } else { + reg_ax = *earw; + SETFLAGBIT(ZF,0); + } + } else { + GetEAa; + Bit16u val = LoadMw(eaa); + if(reg_ax == val) { + SaveMw(eaa,*rmrw); + SETFLAGBIT(ZF,1); + } else { + SaveMw(eaa,val); + reg_ax = val; + SETFLAGBIT(ZF,0); + } + } + break; + } + CASE_0F_W(0xb2) /* LSS Ew */ { GetRMrw;