diff options
| -rw-r--r-- | README.md | 2 | ||||
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 139 | ||||
| -rw-r--r-- | src/core/arm/interpreter/armsupp.cpp | 13 | ||||
| -rw-r--r-- | src/core/arm/skyeye_common/armdefs.h | 2 | ||||
| -rw-r--r-- | src/core/arm/skyeye_common/armemu.h | 8 |
5 files changed, 116 insertions, 48 deletions
| @@ -10,7 +10,7 @@ For development discussion, please join us @ #citra on [freenode](http://webchat | |||
| 10 | 10 | ||
| 11 | ### Development | 11 | ### Development |
| 12 | 12 | ||
| 13 | If you want to contribute please take a took at the [Contributor's Guide](CONTRIBUTING.md), [Roadmap](https://github.com/citra-emu/citra/wiki/Roadmap) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information) pages. You should as well contact any of the developers in the forum in order to know about the current state of the emulator. | 13 | If you want to contribute please take a look at the [Contributor's Guide](CONTRIBUTING.md), [Roadmap](https://github.com/citra-emu/citra/wiki/Roadmap) and [Developer Information](https://github.com/citra-emu/citra/wiki/Developer-Information) pages. You should as well contact any of the developers in the forum in order to know about the current state of the emulator. |
| 14 | 14 | ||
| 15 | ### Building | 15 | ### Building |
| 16 | 16 | ||
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 610e04f10..b2f671f94 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -1670,7 +1670,7 @@ mainswitch: | |||
| 1670 | op1 *= op2; | 1670 | op1 *= op2; |
| 1671 | //printf("SMLA_INST:BB,op1=0x%x, op2=0x%x. Rn=0x%x\n", op1, op2, Rn); | 1671 | //printf("SMLA_INST:BB,op1=0x%x, op2=0x%x. Rn=0x%x\n", op1, op2, Rn); |
| 1672 | if (AddOverflow(op1, Rn, op1 + Rn)) | 1672 | if (AddOverflow(op1, Rn, op1 + Rn)) |
| 1673 | SETS; | 1673 | SETQ; |
| 1674 | state->Reg[BITS (16, 19)] = op1 + Rn; | 1674 | state->Reg[BITS (16, 19)] = op1 + Rn; |
| 1675 | break; | 1675 | break; |
| 1676 | } | 1676 | } |
| @@ -1682,7 +1682,7 @@ mainswitch: | |||
| 1682 | ARMword result = op1 + op2; | 1682 | ARMword result = op1 + op2; |
| 1683 | if (AddOverflow(op1, op2, result)) { | 1683 | if (AddOverflow(op1, op2, result)) { |
| 1684 | result = POS (result) ? 0x80000000 : 0x7fffffff; | 1684 | result = POS (result) ? 0x80000000 : 0x7fffffff; |
| 1685 | SETS; | 1685 | SETQ; |
| 1686 | } | 1686 | } |
| 1687 | state->Reg[BITS (12, 15)] = result; | 1687 | state->Reg[BITS (12, 15)] = result; |
| 1688 | break; | 1688 | break; |
| @@ -1724,7 +1724,7 @@ mainswitch: | |||
| 1724 | TAKEABORT; | 1724 | TAKEABORT; |
| 1725 | } else if ((BITS (0, 11) == 0) && (LHSReg == 15)) { /* MRS CPSR */ | 1725 | } else if ((BITS (0, 11) == 0) && (LHSReg == 15)) { /* MRS CPSR */ |
| 1726 | UNDEF_MRSPC; | 1726 | UNDEF_MRSPC; |
| 1727 | DEST = ECC | EINT | EMODE; | 1727 | DEST = ARMul_GetCPSR(state); |
| 1728 | } else { | 1728 | } else { |
| 1729 | UNDEF_Test; | 1729 | UNDEF_Test; |
| 1730 | } | 1730 | } |
| @@ -1795,7 +1795,7 @@ mainswitch: | |||
| 1795 | ARMword Rn = state->Reg[BITS(12, 15)]; | 1795 | ARMword Rn = state->Reg[BITS(12, 15)]; |
| 1796 | 1796 | ||
| 1797 | if (AddOverflow((ARMword)result, Rn, (ARMword)(result + Rn))) | 1797 | if (AddOverflow((ARMword)result, Rn, (ARMword)(result + Rn))) |
| 1798 | SETS; | 1798 | SETQ; |
| 1799 | result += Rn; | 1799 | result += Rn; |
| 1800 | } | 1800 | } |
| 1801 | state->Reg[BITS (16, 19)] = (ARMword)result; | 1801 | state->Reg[BITS (16, 19)] = (ARMword)result; |
| @@ -1811,7 +1811,7 @@ mainswitch: | |||
| 1811 | if (SubOverflow | 1811 | if (SubOverflow |
| 1812 | (op1, op2, result)) { | 1812 | (op1, op2, result)) { |
| 1813 | result = POS (result) ? 0x80000000 : 0x7fffffff; | 1813 | result = POS (result) ? 0x80000000 : 0x7fffffff; |
| 1814 | SETS; | 1814 | SETQ; |
| 1815 | } | 1815 | } |
| 1816 | 1816 | ||
| 1817 | state->Reg[BITS (12, 15)] = result; | 1817 | state->Reg[BITS (12, 15)] = result; |
| @@ -1934,13 +1934,13 @@ mainswitch: | |||
| 1934 | 1934 | ||
| 1935 | if (AddOverflow | 1935 | if (AddOverflow |
| 1936 | (op2, op2, op2d)) { | 1936 | (op2, op2, op2d)) { |
| 1937 | SETS; | 1937 | SETQ; |
| 1938 | op2d = POS (op2d) ? 0x80000000 : 0x7fffffff; | 1938 | op2d = POS (op2d) ? 0x80000000 : 0x7fffffff; |
| 1939 | } | 1939 | } |
| 1940 | 1940 | ||
| 1941 | result = op1 + op2d; | 1941 | result = op1 + op2d; |
| 1942 | if (AddOverflow(op1, op2d, result)) { | 1942 | if (AddOverflow(op1, op2d, result)) { |
| 1943 | SETS; | 1943 | SETQ; |
| 1944 | result = POS (result) ? 0x80000000 : 0x7fffffff; | 1944 | result = POS (result) ? 0x80000000 : 0x7fffffff; |
| 1945 | } | 1945 | } |
| 1946 | 1946 | ||
| @@ -2053,13 +2053,13 @@ mainswitch: | |||
| 2053 | ARMword result; | 2053 | ARMword result; |
| 2054 | 2054 | ||
| 2055 | if (AddOverflow(op2, op2, op2d)) { | 2055 | if (AddOverflow(op2, op2, op2d)) { |
| 2056 | SETS; | 2056 | SETQ; |
| 2057 | op2d = POS (op2d) ? 0x80000000 : 0x7fffffff; | 2057 | op2d = POS (op2d) ? 0x80000000 : 0x7fffffff; |
| 2058 | } | 2058 | } |
| 2059 | 2059 | ||
| 2060 | result = op1 - op2d; | 2060 | result = op1 - op2d; |
| 2061 | if (SubOverflow(op1, op2d, result)) { | 2061 | if (SubOverflow(op1, op2d, result)) { |
| 2062 | SETS; | 2062 | SETQ; |
| 2063 | result = POS (result) ? 0x80000000 : 0x7fffffff; | 2063 | result = POS (result) ? 0x80000000 : 0x7fffffff; |
| 2064 | } | 2064 | } |
| 2065 | 2065 | ||
| @@ -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 | } |
| @@ -6116,7 +6153,7 @@ L_stm_s_takeabort: | |||
| 6116 | u32 rm = (instr >> 0) & 0xF; | 6153 | u32 rm = (instr >> 0) & 0xF; |
| 6117 | u32 from = state->Reg[rn]; | 6154 | u32 from = state->Reg[rn]; |
| 6118 | u32 to = state->Reg[rm]; | 6155 | u32 to = state->Reg[rm]; |
| 6119 | u32 cpsr = state->Cpsr; | 6156 | u32 cpsr = ARMul_GetCPSR(state); |
| 6120 | if ((instr & 0xFF0) == 0xFB0) { // SEL | 6157 | if ((instr & 0xFF0) == 0xFB0) { // SEL |
| 6121 | u32 result; | 6158 | u32 result; |
| 6122 | if (cpsr & (1 << 16)) | 6159 | if (cpsr & (1 << 16)) |
| @@ -6172,16 +6209,23 @@ L_stm_s_takeabort: | |||
| 6172 | s16 rn_lo = (state->Reg[rn_idx]); | 6209 | s16 rn_lo = (state->Reg[rn_idx]); |
| 6173 | s16 rn_hi = (state->Reg[rn_idx] >> 16); | 6210 | s16 rn_hi = (state->Reg[rn_idx] >> 16); |
| 6174 | 6211 | ||
| 6175 | if (rn_lo > max) | 6212 | if (rn_lo > max) { |
| 6176 | rn_lo = max; | 6213 | rn_lo = max; |
| 6177 | else if (rn_lo < min) | 6214 | state->Cpsr |= (1 << 27); |
| 6215 | } else if (rn_lo < min) { | ||
| 6178 | rn_lo = min; | 6216 | rn_lo = min; |
| 6217 | state->Cpsr |= (1 << 27); | ||
| 6218 | } | ||
| 6179 | 6219 | ||
| 6180 | if (rn_hi > max) | 6220 | if (rn_hi > max) { |
| 6181 | rn_hi = max; | 6221 | rn_hi = max; |
| 6182 | else if (rn_hi < min) | 6222 | state->Cpsr |= (1 << 27); |
| 6223 | } else if (rn_hi < min) { | ||
| 6183 | rn_hi = min; | 6224 | rn_hi = min; |
| 6225 | state->Cpsr |= (1 << 27); | ||
| 6226 | } | ||
| 6184 | 6227 | ||
| 6228 | ARMul_CPSRAltered(state); | ||
| 6185 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi & 0xFFFF) << 16); | 6229 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi & 0xFFFF) << 16); |
| 6186 | return 1; | 6230 | return 1; |
| 6187 | } | 6231 | } |
| @@ -6313,16 +6357,23 @@ L_stm_s_takeabort: | |||
| 6313 | s16 rn_lo = (state->Reg[rn_idx]); | 6357 | s16 rn_lo = (state->Reg[rn_idx]); |
| 6314 | s16 rn_hi = (state->Reg[rn_idx] >> 16); | 6358 | s16 rn_hi = (state->Reg[rn_idx] >> 16); |
| 6315 | 6359 | ||
| 6316 | if (max < rn_lo) | 6360 | if (max < rn_lo) { |
| 6317 | rn_lo = max; | 6361 | rn_lo = max; |
| 6318 | else if (rn_lo < 0) | 6362 | state->Cpsr |= (1 << 27); |
| 6363 | } else if (rn_lo < 0) { | ||
| 6319 | rn_lo = 0; | 6364 | rn_lo = 0; |
| 6365 | state->Cpsr |= (1 << 27); | ||
| 6366 | } | ||
| 6320 | 6367 | ||
| 6321 | if (max < rn_hi) | 6368 | if (max < rn_hi) { |
| 6322 | rn_hi = max; | 6369 | rn_hi = max; |
| 6323 | else if (rn_hi < 0) | 6370 | state->Cpsr |= (1 << 27); |
| 6371 | } else if (rn_hi < 0) { | ||
| 6324 | rn_hi = 0; | 6372 | rn_hi = 0; |
| 6325 | 6373 | state->Cpsr |= (1 << 27); | |
| 6374 | } | ||
| 6375 | |||
| 6376 | ARMul_CPSRAltered(state); | ||
| 6326 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi << 16) & 0xFFFF); | 6377 | state->Reg[rd_idx] = (rn_lo & 0xFFFF) | ((rn_hi << 16) & 0xFFFF); |
| 6327 | return 1; | 6378 | return 1; |
| 6328 | } | 6379 | } |
| @@ -6427,22 +6478,28 @@ L_stm_s_takeabort: | |||
| 6427 | const s16 rn_lo = (rn_val & 0xFFFF); | 6478 | const s16 rn_lo = (rn_val & 0xFFFF); |
| 6428 | const s16 rn_hi = ((rn_val >> 16) & 0xFFFF); | 6479 | const s16 rn_hi = ((rn_val >> 16) & 0xFFFF); |
| 6429 | 6480 | ||
| 6430 | // SMUAD | 6481 | const u32 product1 = (rn_lo * rm_lo); |
| 6431 | if ((instr & 0xf0d0) == 0xf010) { | 6482 | const u32 product2 = (rn_hi * rm_hi); |
| 6432 | state->Reg[rd_idx] = (rn_lo * rm_lo) + (rn_hi * rm_hi); | 6483 | |
| 6433 | } | 6484 | // SMUAD and SMLAD |
| 6434 | // SMUSD | 6485 | if (BIT(6) == 0) { |
| 6435 | else if ((instr & 0xf0d0) == 0xf050) { | 6486 | state->Reg[rd_idx] = product1 + product2; |
| 6436 | state->Reg[rd_idx] = (rn_lo * rm_lo) - (rn_hi * rm_hi); | 6487 | |
| 6437 | } | 6488 | if (BITS(12, 15) != 15) { |
| 6438 | // SMLAD | 6489 | state->Reg[rd_idx] += state->Reg[ra_idx]; |
| 6439 | else if ((instr & 0xd0) == 0x10) { | 6490 | ARMul_AddOverflowQ(state, product1 + product2, state->Reg[ra_idx]); |
| 6440 | state->Reg[rd_idx] = (rn_lo * rm_lo) + (rn_hi * rm_hi) + (s32)state->Reg[ra_idx]; | 6491 | } |
| 6492 | |||
| 6493 | ARMul_AddOverflowQ(state, product1, product2); | ||
| 6441 | } | 6494 | } |
| 6442 | // SMLSD | 6495 | // SMUSD and SMLSD |
| 6443 | else { | 6496 | else { |
| 6444 | state->Reg[rd_idx] = ((rn_lo * rm_lo) - (rn_hi * rm_hi)) + (s32)state->Reg[ra_idx]; | 6497 | state->Reg[rd_idx] = product1 - product2; |
| 6498 | |||
| 6499 | if (BITS(12, 15) != 15) | ||
| 6500 | state->Reg[rd_idx] += state->Reg[ra_idx]; | ||
| 6445 | } | 6501 | } |
| 6502 | |||
| 6446 | return 1; | 6503 | return 1; |
| 6447 | } | 6504 | } |
| 6448 | break; | 6505 | break; |
diff --git a/src/core/arm/interpreter/armsupp.cpp b/src/core/arm/interpreter/armsupp.cpp index 30519f216..6774f8a74 100644 --- a/src/core/arm/interpreter/armsupp.cpp +++ b/src/core/arm/interpreter/armsupp.cpp | |||
| @@ -227,8 +227,9 @@ ARMul_CPSRAltered (ARMul_State * state) | |||
| 227 | //state->Cpsr &= ~CBIT; | 227 | //state->Cpsr &= ~CBIT; |
| 228 | ASSIGNV ((state->Cpsr & VBIT) != 0); | 228 | ASSIGNV ((state->Cpsr & VBIT) != 0); |
| 229 | //state->Cpsr &= ~VBIT; | 229 | //state->Cpsr &= ~VBIT; |
| 230 | ASSIGNS ((state->Cpsr & SBIT) != 0); | 230 | ASSIGNQ ((state->Cpsr & QBIT) != 0); |
| 231 | //state->Cpsr &= ~SBIT; | 231 | //state->Cpsr &= ~QBIT; |
| 232 | state->GEFlag = (state->Cpsr & 0x000F0000); | ||
| 232 | #ifdef MODET | 233 | #ifdef MODET |
| 233 | ASSIGNT ((state->Cpsr & TBIT) != 0); | 234 | ASSIGNT ((state->Cpsr & TBIT) != 0); |
| 234 | //state->Cpsr &= ~TBIT; | 235 | //state->Cpsr &= ~TBIT; |
| @@ -443,6 +444,14 @@ ARMul_AddOverflow (ARMul_State * state, ARMword a, ARMword b, ARMword result) | |||
| 443 | ASSIGNV (AddOverflow (a, b, result)); | 444 | ASSIGNV (AddOverflow (a, b, result)); |
| 444 | } | 445 | } |
| 445 | 446 | ||
| 447 | /* Assigns the Q flag if the given result is considered an overflow from the addition of a and b */ | ||
| 448 | void ARMul_AddOverflowQ(ARMul_State* state, ARMword a, ARMword b) | ||
| 449 | { | ||
| 450 | u32 result = a + b; | ||
| 451 | if (((result ^ a) & (u32)0x80000000) && ((a ^ b) & (u32)0x80000000) == 0) | ||
| 452 | SETQ; | ||
| 453 | } | ||
| 454 | |||
| 446 | /* Assigns the C flag after an subtraction of a and b to give result. */ | 455 | /* Assigns the C flag after an subtraction of a and b to give result. */ |
| 447 | 456 | ||
| 448 | void | 457 | void |
diff --git a/src/core/arm/skyeye_common/armdefs.h b/src/core/arm/skyeye_common/armdefs.h index 28a4a0db4..34eb5aaf7 100644 --- a/src/core/arm/skyeye_common/armdefs.h +++ b/src/core/arm/skyeye_common/armdefs.h | |||
| @@ -198,7 +198,7 @@ struct ARMul_State | |||
| 198 | //ARMword translate_pc; | 198 | //ARMword translate_pc; |
| 199 | 199 | ||
| 200 | /* add armv6 flags dyf:2010-08-09 */ | 200 | /* add armv6 flags dyf:2010-08-09 */ |
| 201 | ARMword GEFlag, EFlag, AFlag, QFlags; | 201 | ARMword GEFlag, EFlag, AFlag, QFlag; |
| 202 | //chy:2003-08-19, used in arm v5e|xscale | 202 | //chy:2003-08-19, used in arm v5e|xscale |
| 203 | ARMword SFlag; | 203 | ARMword SFlag; |
| 204 | #ifdef MODET | 204 | #ifdef MODET |
diff --git a/src/core/arm/skyeye_common/armemu.h b/src/core/arm/skyeye_common/armemu.h index 7f7c0e682..3ea14b5a3 100644 --- a/src/core/arm/skyeye_common/armemu.h +++ b/src/core/arm/skyeye_common/armemu.h | |||
| @@ -34,7 +34,7 @@ | |||
| 34 | #define ZBIT (1L << 30) | 34 | #define ZBIT (1L << 30) |
| 35 | #define CBIT (1L << 29) | 35 | #define CBIT (1L << 29) |
| 36 | #define VBIT (1L << 28) | 36 | #define VBIT (1L << 28) |
| 37 | #define SBIT (1L << 27) | 37 | #define QBIT (1L << 27) |
| 38 | #define IBIT (1L << 7) | 38 | #define IBIT (1L << 7) |
| 39 | #define FBIT (1L << 6) | 39 | #define FBIT (1L << 6) |
| 40 | #define IFBITS (3L << 6) | 40 | #define IFBITS (3L << 6) |
| @@ -156,13 +156,14 @@ | |||
| 156 | #define R15PCMODE (state->Reg[15] & (R15PCBITS | R15MODEBITS)) | 156 | #define R15PCMODE (state->Reg[15] & (R15PCBITS | R15MODEBITS)) |
| 157 | #define R15MODE (state->Reg[15] & R15MODEBITS) | 157 | #define R15MODE (state->Reg[15] & R15MODEBITS) |
| 158 | 158 | ||
| 159 | #define ECC ((NFLAG << 31) | (ZFLAG << 30) | (CFLAG << 29) | (VFLAG << 28) | (SFLAG << 27)) | 159 | #define ECC ((NFLAG << 31) | (ZFLAG << 30) | (CFLAG << 29) | (VFLAG << 28) | (QFLAG << 27)) |
| 160 | #define EINT (IFFLAGS << 6) | 160 | #define EINT (IFFLAGS << 6) |
| 161 | #define ER15INT (IFFLAGS << 26) | 161 | #define ER15INT (IFFLAGS << 26) |
| 162 | #define EMODE (state->Mode) | 162 | #define EMODE (state->Mode) |
| 163 | #define EGEBITS (state->GEFlag & 0x000F0000) | ||
| 163 | 164 | ||
| 164 | #ifdef MODET | 165 | #ifdef MODET |
| 165 | #define CPSR (ECC | EINT | EMODE | (TFLAG << 5)) | 166 | #define CPSR (ECC | EGEBITS | (EFLAG << 9) | (AFLAG << 8) | EINT | (TFLAG << 5) | EMODE) |
| 166 | #else | 167 | #else |
| 167 | #define CPSR (ECC | EINT | EMODE) | 168 | #define CPSR (ECC | EINT | EMODE) |
| 168 | #endif | 169 | #endif |
| @@ -601,6 +602,7 @@ extern ARMword ARMul_SwitchMode (ARMul_State *, ARMword, ARMword); | |||
| 601 | extern void ARMul_MSRCpsr (ARMul_State *, ARMword, ARMword); | 602 | extern void ARMul_MSRCpsr (ARMul_State *, ARMword, ARMword); |
| 602 | extern void ARMul_SubOverflow (ARMul_State *, ARMword, ARMword, ARMword); | 603 | extern void ARMul_SubOverflow (ARMul_State *, ARMword, ARMword, ARMword); |
| 603 | extern void ARMul_AddOverflow (ARMul_State *, ARMword, ARMword, ARMword); | 604 | extern void ARMul_AddOverflow (ARMul_State *, ARMword, ARMword, ARMword); |
| 605 | extern void ARMul_AddOverflowQ(ARMul_State*, ARMword, ARMword); | ||
| 604 | extern void ARMul_SubCarry (ARMul_State *, ARMword, ARMword, ARMword); | 606 | extern void ARMul_SubCarry (ARMul_State *, ARMword, ARMword, ARMword); |
| 605 | extern void ARMul_AddCarry (ARMul_State *, ARMword, ARMword, ARMword); | 607 | extern void ARMul_AddCarry (ARMul_State *, ARMword, ARMword, ARMword); |
| 606 | extern tdstate ARMul_ThumbDecode (ARMul_State *, ARMword, ARMword, ARMword *); | 608 | extern tdstate ARMul_ThumbDecode (ARMul_State *, ARMword, ARMword, ARMword *); |