diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2024-08-08 23:05:00 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-08 17:05:00 +0200 |
| commit | 91ed6a83c1760788b7a9114cbf0aaaebc4fe5f5f (patch) | |
| tree | 167b15ba4a448d6849b9af35c332420117a2a523 /src | |
| parent | d8ac8a5f1c3de529a5d147c0d4d6d97c4a96ffa7 (diff) | |
| download | box64-91ed6a83c1760788b7a9114cbf0aaaebc4fe5f5f.tar.gz box64-91ed6a83c1760788b7a9114cbf0aaaebc4fe5f5f.zip | |
[INTERP] Fixed some undefined behaviour (#1717)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64primop.h | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/src/emu/x64primop.h b/src/emu/x64primop.h index 83f8b00b..db1e3dd6 100644 --- a/src/emu/x64primop.h +++ b/src/emu/x64primop.h @@ -311,7 +311,7 @@ static inline uint8_t shl8(x64emu_t *emu, uint8_t d, uint8_t s) emu->df = d_shl8; emu->op1.u8 = d; emu->op2.u8 = s; - emu->res.u8 = d << s; + emu->res.u8 = (s>7) ? 0 : (d<<s); return emu->res.u8; } else @@ -327,7 +327,7 @@ static inline uint16_t shl16(x64emu_t *emu, uint16_t d, uint8_t s) emu->df = d_shl16; emu->op1.u16 = d; emu->op2.u16 = s; - emu->res.u16 = d << s; + emu->res.u16 = (s>15) ? 0 : (d<<s); return emu->res.u16; } else return d; @@ -374,7 +374,7 @@ static inline uint8_t shr8(x64emu_t *emu, uint8_t d, uint8_t s) emu->df = d_shr8; emu->op1.u8 = d; emu->op2.u8 = s; - emu->res.u8 = d >> s; + emu->res.u8 = (s>7) ? 0 : (d>>s); return emu->res.u8; } else @@ -390,7 +390,7 @@ static inline uint16_t shr16(x64emu_t *emu, uint16_t d, uint8_t s) emu->df = d_shr16; emu->op1.u16 = d; emu->op2.u16 = s; - emu->res.u16 = d >> s; + emu->res.u16 = (s>15) ? 0 : (d>>s); return emu->res.u16; } else @@ -438,7 +438,10 @@ static inline uint8_t sar8(x64emu_t *emu, uint8_t d, uint8_t s) emu->df = d_sar8; emu->op1.u8 = d; emu->op2.u8 = s; - emu->res.u8 = (uint8_t)(((int8_t)d)>>s); + if (s > 7) + emu->res.u8 = (d&0x80) ? 0xff : 0; + else + emu->res.u8 = (uint8_t)(((int8_t)d)>>s); return emu->res.u8; } else @@ -454,7 +457,10 @@ static inline uint16_t sar16(x64emu_t *emu, uint16_t d, uint8_t s) emu->df = d_sar16; emu->op1.u16 = d; emu->op2.u16 = s; - emu->res.u16 = (uint16_t)(((int16_t)d)>>s); + if (s > 15) + emu->res.u16 = (d&0x8000) ? 0xffff : 0; + else + emu->res.u16 = (uint16_t)(((int16_t)d)>>s); return emu->res.u16; } else |