diff options
| author | 2014-12-22 22:10:47 -0500 | |
|---|---|---|
| committer | 2014-12-22 23:51:59 -0500 | |
| commit | 8e2accd9746d33116c6398e6f30db5b8b4e1f188 (patch) | |
| tree | c39bd43bf51a9eead458b8743e0cc925947edbd4 /src/core/arm/interpreter/armemu.cpp | |
| parent | Merge pull request #322 from chinhodado/master (diff) | |
| download | yuzu-8e2accd9746d33116c6398e6f30db5b8b4e1f188.tar.gz yuzu-8e2accd9746d33116c6398e6f30db5b8b4e1f188.tar.xz yuzu-8e2accd9746d33116c6398e6f30db5b8b4e1f188.zip | |
armemu: Fix construction of the CPSR
Diffstat (limited to 'src/core/arm/interpreter/armemu.cpp')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 55 |
1 files changed, 46 insertions, 9 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 610e04f10..d19d3a49f 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -5877,6 +5877,8 @@ L_stm_s_takeabort: | |||
| 5877 | state->Cpsr &= ~(1 << 18); | 5877 | state->Cpsr &= ~(1 << 18); |
| 5878 | state->Cpsr &= ~(1 << 19); | 5878 | state->Cpsr &= ~(1 << 19); |
| 5879 | } | 5879 | } |
| 5880 | |||
| 5881 | ARMul_CPSRAltered(state); | ||
| 5880 | return 1; | 5882 | return 1; |
| 5881 | } | 5883 | } |
| 5882 | // SADD8/SSUB8 | 5884 | // SADD8/SSUB8 |
| @@ -5948,6 +5950,7 @@ L_stm_s_takeabort: | |||
| 5948 | state->Cpsr &= ~(1 << 19); | 5950 | state->Cpsr &= ~(1 << 19); |
| 5949 | } | 5951 | } |
| 5950 | 5952 | ||
| 5953 | ARMul_CPSRAltered(state); | ||
| 5951 | state->Reg[rd_idx] = (lo_val1 | lo_val2 << 8 | hi_val1 << 16 | hi_val2 << 24); | 5954 | state->Reg[rd_idx] = (lo_val1 | lo_val2 << 8 | hi_val1 << 16 | hi_val2 << 24); |
| 5952 | return 1; | 5955 | return 1; |
| 5953 | } | 5956 | } |
| @@ -6024,15 +6027,33 @@ L_stm_s_takeabort: | |||
| 6024 | if ((instr & 0x0F0) == 0x070) { // USUB16 | 6027 | if ((instr & 0x0F0) == 0x070) { // USUB16 |
| 6025 | h1 = ((u16)from - (u16)to); | 6028 | h1 = ((u16)from - (u16)to); |
| 6026 | h2 = ((u16)(from >> 16) - (u16)(to >> 16)); | 6029 | h2 = ((u16)(from >> 16) - (u16)(to >> 16)); |
| 6027 | if (!(h1 & 0xffff0000)) state->Cpsr |= (3 << 16); | 6030 | |
| 6028 | if (!(h2 & 0xffff0000)) state->Cpsr |= (3 << 18); | 6031 | if (!(h1 & 0xffff0000)) |
| 6032 | state->Cpsr |= (3 << 16); | ||
| 6033 | else | ||
| 6034 | state->Cpsr &= ~(3 << 16); | ||
| 6035 | |||
| 6036 | if (!(h2 & 0xffff0000)) | ||
| 6037 | state->Cpsr |= (3 << 18); | ||
| 6038 | else | ||
| 6039 | state->Cpsr &= ~(3 << 18); | ||
| 6029 | } | 6040 | } |
| 6030 | else { // UADD16 | 6041 | else { // UADD16 |
| 6031 | h1 = ((u16)from + (u16)to); | 6042 | h1 = ((u16)from + (u16)to); |
| 6032 | h2 = ((u16)(from >> 16) + (u16)(to >> 16)); | 6043 | h2 = ((u16)(from >> 16) + (u16)(to >> 16)); |
| 6033 | if (h1 & 0xffff0000) state->Cpsr |= (3 << 16); | 6044 | |
| 6034 | if (h2 & 0xffff0000) state->Cpsr |= (3 << 18); | 6045 | if (h1 & 0xffff0000) |
| 6046 | state->Cpsr |= (3 << 16); | ||
| 6047 | else | ||
| 6048 | state->Cpsr &= ~(3 << 16); | ||
| 6049 | |||
| 6050 | if (h2 & 0xffff0000) | ||
| 6051 | state->Cpsr |= (3 << 18); | ||
| 6052 | else | ||
| 6053 | state->Cpsr &= ~(3 << 18); | ||
| 6035 | } | 6054 | } |
| 6055 | |||
| 6056 | ARMul_CPSRAltered(state); | ||
| 6036 | state->Reg[rd] = (u32)((h1 & 0xffff) | ((h2 & 0xffff) << 16)); | 6057 | state->Reg[rd] = (u32)((h1 & 0xffff) | ((h2 & 0xffff) << 16)); |
| 6037 | return 1; | 6058 | return 1; |
| 6038 | } | 6059 | } |
| @@ -6045,10 +6066,26 @@ L_stm_s_takeabort: | |||
| 6045 | b2 = ((u8)(from >> 8) - (u8)(to >> 8)); | 6066 | b2 = ((u8)(from >> 8) - (u8)(to >> 8)); |
| 6046 | b3 = ((u8)(from >> 16) - (u8)(to >> 16)); | 6067 | b3 = ((u8)(from >> 16) - (u8)(to >> 16)); |
| 6047 | b4 = ((u8)(from >> 24) - (u8)(to >> 24)); | 6068 | b4 = ((u8)(from >> 24) - (u8)(to >> 24)); |
| 6048 | if (!(b1 & 0xffffff00)) state->Cpsr |= (1 << 16); | 6069 | |
| 6049 | if (!(b2 & 0xffffff00)) state->Cpsr |= (1 << 17); | 6070 | if (!(b1 & 0xffffff00)) |
| 6050 | if (!(b3 & 0xffffff00)) state->Cpsr |= (1 << 18); | 6071 | state->Cpsr |= (1 << 16); |
| 6051 | if (!(b4 & 0xffffff00)) state->Cpsr |= (1 << 19); | 6072 | else |
| 6073 | state->Cpsr &= ~(1 << 16); | ||
| 6074 | |||
| 6075 | if (!(b2 & 0xffffff00)) | ||
| 6076 | state->Cpsr |= (1 << 17); | ||
| 6077 | else | ||
| 6078 | state->Cpsr &= ~(1 << 17); | ||
| 6079 | |||
| 6080 | if (!(b3 & 0xffffff00)) | ||
| 6081 | state->Cpsr |= (1 << 18); | ||
| 6082 | else | ||
| 6083 | state->Cpsr &= ~(1 << 18); | ||
| 6084 | |||
| 6085 | if (!(b4 & 0xffffff00)) | ||
| 6086 | state->Cpsr |= (1 << 19); | ||
| 6087 | else | ||
| 6088 | state->Cpsr &= ~(1 << 19); | ||
| 6052 | } | 6089 | } |
| 6053 | else { // UADD8 | 6090 | else { // UADD8 |
| 6054 | b1 = ((u8)from + (u8)to); | 6091 | b1 = ((u8)from + (u8)to); |
| @@ -6071,13 +6108,13 @@ L_stm_s_takeabort: | |||
| 6071 | else | 6108 | else |
| 6072 | state->Cpsr &= ~(1 << 18); | 6109 | state->Cpsr &= ~(1 << 18); |
| 6073 | 6110 | ||
| 6074 | |||
| 6075 | if (b4 & 0xffffff00) | 6111 | if (b4 & 0xffffff00) |
| 6076 | state->Cpsr |= (1 << 19); | 6112 | state->Cpsr |= (1 << 19); |
| 6077 | else | 6113 | else |
| 6078 | state->Cpsr &= ~(1 << 19); | 6114 | state->Cpsr &= ~(1 << 19); |
| 6079 | } | 6115 | } |
| 6080 | 6116 | ||
| 6117 | ARMul_CPSRAltered(state); | ||
| 6081 | state->Reg[rd] = (u32)(b1 | (b2 & 0xff) << 8 | (b3 & 0xff) << 16 | (b4 & 0xff) << 24); | 6118 | state->Reg[rd] = (u32)(b1 | (b2 & 0xff) << 8 | (b3 & 0xff) << 16 | (b4 & 0xff) << 24); |
| 6082 | return 1; | 6119 | return 1; |
| 6083 | } | 6120 | } |