diff options
| author | 2014-12-17 20:58:00 -0500 | |
|---|---|---|
| committer | 2014-12-17 20:58:00 -0500 | |
| commit | 075126247f4dc4230835215f8c86a7de8e8e1b98 (patch) | |
| tree | 934fb07613b95af79541c7e10e89a846a860634a | |
| parent | Merge pull request #297 from lioncash/ssub16 (diff) | |
| parent | armemu: Fix PKHTB (diff) | |
| download | yuzu-075126247f4dc4230835215f8c86a7de8e8e1b98.tar.gz yuzu-075126247f4dc4230835215f8c86a7de8e8e1b98.tar.xz yuzu-075126247f4dc4230835215f8c86a7de8e8e1b98.zip | |
Merge pull request #292 from lioncash/backports
Backport more skyeye fixes from 3dmoo
Diffstat (limited to '')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 49 |
1 files changed, 30 insertions, 19 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index 2b5d8c68e..14330156b 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -3103,12 +3103,18 @@ mainswitch: | |||
| 3103 | state->Reg[idest] = (state->Reg[rfis] & 0xFFFF) | ((state->Reg[rlast] << ishi) & 0xFFFF0000); | 3103 | state->Reg[idest] = (state->Reg[rfis] & 0xFFFF) | ((state->Reg[rlast] << ishi) & 0xFFFF0000); |
| 3104 | break; | 3104 | break; |
| 3105 | } else if ((instr & 0x70) == 0x50) { //pkhtb | 3105 | } else if ((instr & 0x70) == 0x50) { //pkhtb |
| 3106 | u8 idest = BITS(12, 15); | 3106 | const u8 rd_idx = BITS(12, 15); |
| 3107 | u8 rfis = BITS(16, 19); | 3107 | const u8 rn_idx = BITS(16, 19); |
| 3108 | u8 rlast = BITS(0, 3); | 3108 | const u8 rm_idx = BITS(0, 3); |
| 3109 | u8 ishi = BITS(7, 11); | 3109 | const u8 imm5 = BITS(7, 11); |
| 3110 | if (ishi == 0)ishi = 0x20; | 3110 | |
| 3111 | state->Reg[idest] = (((int)(state->Reg[rlast]) >> (int)(ishi))& 0xFFFF) | ((state->Reg[rfis]) & 0xFFFF0000); | 3111 | ARMword val; |
| 3112 | if (imm5 >= 32) | ||
| 3113 | val = (state->Reg[rm_idx] >> 31); | ||
| 3114 | else | ||
| 3115 | val = (state->Reg[rm_idx] >> imm5); | ||
| 3116 | |||
| 3117 | state->Reg[rd_idx] = (val & 0xFFFF) | ((state->Reg[rn_idx]) & 0xFFFF0000); | ||
| 3112 | break; | 3118 | break; |
| 3113 | } else if (BIT (4)) { | 3119 | } else if (BIT (4)) { |
| 3114 | #ifdef MODE32 | 3120 | #ifdef MODE32 |
| @@ -6049,7 +6055,7 @@ L_stm_s_takeabort: | |||
| 6049 | break; | 6055 | break; |
| 6050 | } | 6056 | } |
| 6051 | 6057 | ||
| 6052 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFF); | 6058 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFF) | ((state->Reg[BITS(0, 3)] << (32 - ror)) & 0xFF) & 0xFF; |
| 6053 | if (Rm & 0x80) | 6059 | if (Rm & 0x80) |
| 6054 | Rm |= 0xffffff00; | 6060 | Rm |= 0xffffff00; |
| 6055 | 6061 | ||
| @@ -6058,11 +6064,12 @@ L_stm_s_takeabort: | |||
| 6058 | state->Reg[BITS(12, 15)] = Rm; | 6064 | state->Reg[BITS(12, 15)] = Rm; |
| 6059 | else | 6065 | else |
| 6060 | /* SXTAB */ | 6066 | /* SXTAB */ |
| 6061 | state->Reg[BITS(12, 15)] += Rm; | 6067 | state->Reg[BITS(12, 15)] = state->Reg[BITS(16, 19)] + Rm; |
| 6062 | 6068 | ||
| 6063 | return 1; | 6069 | return 1; |
| 6064 | } | 6070 | } |
| 6065 | case 0x6b: { | 6071 | case 0x6b: |
| 6072 | { | ||
| 6066 | ARMword Rm; | 6073 | ARMword Rm; |
| 6067 | int ror = -1; | 6074 | int ror = -1; |
| 6068 | 6075 | ||
| @@ -6080,10 +6087,10 @@ L_stm_s_takeabort: | |||
| 6080 | ror = 24; | 6087 | ror = 24; |
| 6081 | break; | 6088 | break; |
| 6082 | 6089 | ||
| 6083 | case 0xf3: | 6090 | case 0xf3: // REV |
| 6084 | DEST = ((RHS & 0xFF) << 24) | ((RHS & 0xFF00)) << 8 | ((RHS & 0xFF0000) >> 8) | ((RHS & 0xFF000000) >> 24); | 6091 | DEST = ((RHS & 0xFF) << 24) | ((RHS & 0xFF00)) << 8 | ((RHS & 0xFF0000) >> 8) | ((RHS & 0xFF000000) >> 24); |
| 6085 | return 1; | 6092 | return 1; |
| 6086 | case 0xfb: | 6093 | case 0xfb: // REV16 |
| 6087 | DEST = ((RHS & 0xFF) << 8) | ((RHS & 0xFF00)) >> 8 | ((RHS & 0xFF0000) << 8) | ((RHS & 0xFF000000) >> 8); | 6094 | DEST = ((RHS & 0xFF) << 8) | ((RHS & 0xFF00)) >> 8 | ((RHS & 0xFF0000) << 8) | ((RHS & 0xFF000000) >> 8); |
| 6088 | return 1; | 6095 | return 1; |
| 6089 | default: | 6096 | default: |
| @@ -6093,7 +6100,7 @@ L_stm_s_takeabort: | |||
| 6093 | if (ror == -1) | 6100 | if (ror == -1) |
| 6094 | break; | 6101 | break; |
| 6095 | 6102 | ||
| 6096 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFFFF); | 6103 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFFFF) | ((state->Reg[BITS(0, 3)] << (32 - ror)) & 0xFFFF) & 0xFFFF; |
| 6097 | if (Rm & 0x8000) | 6104 | if (Rm & 0x8000) |
| 6098 | Rm |= 0xffff0000; | 6105 | Rm |= 0xffff0000; |
| 6099 | 6106 | ||
| @@ -6180,7 +6187,7 @@ L_stm_s_takeabort: | |||
| 6180 | break; | 6187 | break; |
| 6181 | } | 6188 | } |
| 6182 | 6189 | ||
| 6183 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFF); | 6190 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFF) | ((state->Reg[BITS(0, 3)] << (32 - ror)) & 0xFF) & 0xFF; |
| 6184 | 6191 | ||
| 6185 | if (BITS(16, 19) == 0xf) | 6192 | if (BITS(16, 19) == 0xf) |
| 6186 | /* UXTB */ | 6193 | /* UXTB */ |
| @@ -6210,9 +6217,13 @@ L_stm_s_takeabort: | |||
| 6210 | ror = 24; | 6217 | ror = 24; |
| 6211 | break; | 6218 | break; |
| 6212 | 6219 | ||
| 6213 | case 0xfb: | 6220 | case 0xfb: // REVSH |
| 6214 | printf("Unhandled v6 insn: revsh\n"); | 6221 | { |
| 6215 | return 0; | 6222 | DEST = ((RHS & 0xFF) << 8) | ((RHS & 0xFF00) >> 8); |
| 6223 | if (DEST & 0x8000) | ||
| 6224 | DEST |= 0xffff0000; | ||
| 6225 | return 1; | ||
| 6226 | } | ||
| 6216 | default: | 6227 | default: |
| 6217 | break; | 6228 | break; |
| 6218 | } | 6229 | } |
| @@ -6220,13 +6231,13 @@ L_stm_s_takeabort: | |||
| 6220 | if (ror == -1) | 6231 | if (ror == -1) |
| 6221 | break; | 6232 | break; |
| 6222 | 6233 | ||
| 6223 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFFFF); | 6234 | Rm = ((state->Reg[BITS(0, 3)] >> ror) & 0xFFFF) | ((state->Reg[BITS(0, 3)] << (32 - ror)) & 0xFFFF) & 0xFFFF; |
| 6224 | 6235 | ||
| 6225 | /* UXT */ | 6236 | /* UXT */ |
| 6226 | /* state->Reg[BITS (12, 15)] = Rm; */ | 6237 | /* state->Reg[BITS (12, 15)] = Rm; */ |
| 6227 | /* dyf add */ | 6238 | /* dyf add */ |
| 6228 | if (BITS(16, 19) == 0xf) { | 6239 | if (BITS(16, 19) == 0xf) { |
| 6229 | state->Reg[BITS(12, 15)] = (Rm >> (8 * BITS(10, 11))) & 0x0000FFFF; | 6240 | state->Reg[BITS(12, 15)] = Rm; |
| 6230 | } | 6241 | } |
| 6231 | else { | 6242 | else { |
| 6232 | /* UXTAH */ | 6243 | /* UXTAH */ |
| @@ -6234,7 +6245,7 @@ L_stm_s_takeabort: | |||
| 6234 | // printf("rd is %x rn is %x rm is %x rotate is %x\n", state->Reg[BITS (12, 15)], state->Reg[BITS (16, 19)] | 6245 | // printf("rd is %x rn is %x rm is %x rotate is %x\n", state->Reg[BITS (12, 15)], state->Reg[BITS (16, 19)] |
| 6235 | // , Rm, BITS(10, 11)); | 6246 | // , Rm, BITS(10, 11)); |
| 6236 | // printf("icounter is %lld\n", state->NumInstrs); | 6247 | // printf("icounter is %lld\n", state->NumInstrs); |
| 6237 | state->Reg[BITS(12, 15)] = (state->Reg[BITS(16, 19)] >> (8 * (BITS(10, 11)))) + Rm; | 6248 | state->Reg[BITS(12, 15)] = state->Reg[BITS(16, 19)] + Rm; |
| 6238 | // printf("rd is %x\n", state->Reg[BITS (12, 15)]); | 6249 | // printf("rd is %x\n", state->Reg[BITS (12, 15)]); |
| 6239 | // exit(-1); | 6250 | // exit(-1); |
| 6240 | } | 6251 | } |