diff options
| author | 2015-01-01 09:44:32 -0500 | |
|---|---|---|
| committer | 2015-01-01 09:44:32 -0500 | |
| commit | 481a6c96524623d8459777ea8d1c09befdb5896c (patch) | |
| tree | 243ecc3f689d11202f757eaca773e95b86658404 /src | |
| parent | dyncom: Implement SADD8/SSUB8 (diff) | |
| download | yuzu-481a6c96524623d8459777ea8d1c09befdb5896c.tar.gz yuzu-481a6c96524623d8459777ea8d1c09befdb5896c.tar.xz yuzu-481a6c96524623d8459777ea8d1c09befdb5896c.zip | |
Fix SADD8/SSUB8 in the armemu
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/arm/interpreter/armemu.cpp | 78 |
1 files changed, 28 insertions, 50 deletions
diff --git a/src/core/arm/interpreter/armemu.cpp b/src/core/arm/interpreter/armemu.cpp index b9c2aa6c2..43b1ba40e 100644 --- a/src/core/arm/interpreter/armemu.cpp +++ b/src/core/arm/interpreter/armemu.cpp | |||
| @@ -5881,67 +5881,45 @@ L_stm_s_takeabort: | |||
| 5881 | const u32 rm_val = state->Reg[rm_idx]; | 5881 | const u32 rm_val = state->Reg[rm_idx]; |
| 5882 | const u32 rn_val = state->Reg[rn_idx]; | 5882 | const u32 rn_val = state->Reg[rn_idx]; |
| 5883 | 5883 | ||
| 5884 | u8 lo_val1; | 5884 | s32 lo_val1, lo_val2; |
| 5885 | u8 lo_val2; | 5885 | s32 hi_val1, hi_val2; |
| 5886 | u8 hi_val1; | ||
| 5887 | u8 hi_val2; | ||
| 5888 | 5886 | ||
| 5889 | // SADD8 | 5887 | // SADD8 |
| 5890 | if ((instr & 0xFF0) == 0xf90) { | 5888 | if ((instr & 0xFF0) == 0xf90) { |
| 5891 | lo_val1 = (u8)((rn_val & 0xFF) + (rm_val & 0xFF)); | 5889 | lo_val1 = (s32)(s8)(rn_val & 0xFF) + (s32)(s8)(rm_val & 0xFF); |
| 5892 | lo_val2 = (u8)(((rn_val >> 8) & 0xFF) + ((rm_val >> 8) & 0xFF)); | 5890 | lo_val2 = (s32)(s8)((rn_val >> 8) & 0xFF) + (s32)(s8)((rm_val >> 8) & 0xFF); |
| 5893 | hi_val1 = (u8)(((rn_val >> 16) & 0xFF) + ((rm_val >> 16) & 0xFF)); | 5891 | hi_val1 = (s32)(s8)((rn_val >> 16) & 0xFF) + (s32)(s8)((rm_val >> 16) & 0xFF); |
| 5894 | hi_val2 = (u8)(((rn_val >> 24) & 0xFF) + ((rm_val >> 24) & 0xFF)); | 5892 | hi_val2 = (s32)(s8)((rn_val >> 24) & 0xFF) + (s32)(s8)((rm_val >> 24) & 0xFF); |
| 5895 | |||
| 5896 | if (lo_val1 & 0x80) | ||
| 5897 | state->GEFlag |= (1 << 16); | ||
| 5898 | else | ||
| 5899 | state->GEFlag &= ~(1 << 16); | ||
| 5900 | |||
| 5901 | if (lo_val2 & 0x80) | ||
| 5902 | state->GEFlag |= (1 << 17); | ||
| 5903 | else | ||
| 5904 | state->GEFlag &= ~(1 << 17); | ||
| 5905 | |||
| 5906 | if (hi_val1 & 0x80) | ||
| 5907 | state->GEFlag |= (1 << 18); | ||
| 5908 | else | ||
| 5909 | state->GEFlag &= ~(1 << 18); | ||
| 5910 | |||
| 5911 | if (hi_val2 & 0x80) | ||
| 5912 | state->GEFlag |= (1 << 19); | ||
| 5913 | else | ||
| 5914 | state->GEFlag &= ~(1 << 19); | ||
| 5915 | } | 5893 | } |
| 5916 | // SSUB8 | 5894 | // SSUB8 |
| 5917 | else { | 5895 | else { |
| 5918 | lo_val1 = (u8)((rn_val & 0xFF) - (rm_val & 0xFF)); | 5896 | lo_val1 = (s32)(s8)(rn_val & 0xFF) - (s32)(s8)(rm_val & 0xFF); |
| 5919 | lo_val2 = (u8)(((rn_val >> 8) & 0xFF) - ((rm_val >> 8) & 0xFF)); | 5897 | lo_val2 = (s32)(s8)((rn_val >> 8) & 0xFF) - (s32)(s8)((rm_val >> 8) & 0xFF); |
| 5920 | hi_val1 = (u8)(((rn_val >> 16) & 0xFF) - ((rm_val >> 16) & 0xFF)); | 5898 | hi_val1 = (s32)(s8)((rn_val >> 16) & 0xFF) - (s32)(s8)((rm_val >> 16) & 0xFF); |
| 5921 | hi_val2 = (u8)(((rn_val >> 24) & 0xFF) - ((rm_val >> 24) & 0xFF)); | 5899 | hi_val2 = (s32)(s8)((rn_val >> 24) & 0xFF) - (s32)(s8)((rm_val >> 24) & 0xFF); |
| 5900 | } | ||
| 5922 | 5901 | ||
| 5923 | if (!(lo_val1 & 0x80)) | 5902 | if (lo_val1 >= 0) |
| 5924 | state->GEFlag |= (1 << 16); | 5903 | state->GEFlag |= (1 << 16); |
| 5925 | else | 5904 | else |
| 5926 | state->GEFlag &= ~(1 << 16); | 5905 | state->GEFlag &= ~(1 << 16); |
| 5927 | 5906 | ||
| 5928 | if (!(lo_val2 & 0x80)) | 5907 | if (lo_val2 >= 0) |
| 5929 | state->GEFlag |= (1 << 17); | 5908 | state->GEFlag |= (1 << 17); |
| 5930 | else | 5909 | else |
| 5931 | state->GEFlag &= ~(1 << 17); | 5910 | state->GEFlag &= ~(1 << 17); |
| 5932 | 5911 | ||
| 5933 | if (!(hi_val1 & 0x80)) | 5912 | if (hi_val1 >= 0) |
| 5934 | state->GEFlag |= (1 << 18); | 5913 | state->GEFlag |= (1 << 18); |
| 5935 | else | 5914 | else |
| 5936 | state->GEFlag &= ~(1 << 18); | 5915 | state->GEFlag &= ~(1 << 18); |
| 5937 | 5916 | ||
| 5938 | if (!(hi_val2 & 0x80)) | 5917 | if (hi_val2 >= 0) |
| 5939 | state->GEFlag |= (1 << 19); | 5918 | state->GEFlag |= (1 << 19); |
| 5940 | else | 5919 | else |
| 5941 | state->GEFlag &= ~(1 << 19); | 5920 | state->GEFlag &= ~(1 << 19); |
| 5942 | } | ||
| 5943 | 5921 | ||
| 5944 | state->Reg[rd_idx] = (lo_val1 | lo_val2 << 8 | hi_val1 << 16 | hi_val2 << 24); | 5922 | state->Reg[rd_idx] = ((lo_val1 & 0xFF) | ((lo_val2 & 0xFF) << 8) | ((hi_val1 & 0xFF) << 16) | ((hi_val2 & 0xFF) << 24)); |
| 5945 | return 1; | 5923 | return 1; |
| 5946 | } | 5924 | } |
| 5947 | else { | 5925 | else { |