diff options
author | Lioncash <mathew1800@gmail.com> | 2014-12-29 06:49:10 +0100 |
---|---|---|
committer | Lioncash <mathew1800@gmail.com> | 2014-12-29 06:49:10 +0100 |
commit | 7ad400d5a72d87233cce6d327218fedad44fa6e2 (patch) | |
tree | 1a1bc5afdf53f56f2e5910fb5826fa1fe34467e3 /src/core/arm/interpreter/armsupp.cpp | |
parent | Merge pull request #360 from lioncash/dynuxt (diff) | |
download | yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar.gz yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar.bz2 yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar.lz yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar.xz yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.tar.zst yuzu-7ad400d5a72d87233cce6d327218fedad44fa6e2.zip |
Diffstat (limited to 'src/core/arm/interpreter/armsupp.cpp')
-rw-r--r-- | src/core/arm/interpreter/armsupp.cpp | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/src/core/arm/interpreter/armsupp.cpp b/src/core/arm/interpreter/armsupp.cpp index 8f158e2c8..8b3661c8f 100644 --- a/src/core/arm/interpreter/armsupp.cpp +++ b/src/core/arm/interpreter/armsupp.cpp @@ -478,6 +478,66 @@ ARMul_SubOverflow (ARMul_State * state, ARMword a, ARMword b, ARMword result) ASSIGNV (SubOverflow (a, b, result)); } +/* 8-bit signed saturated addition */ +u8 ARMul_SignedSaturatedAdd8(u8 left, u8 right) +{ + u8 result = left + right; + + if (((result ^ left) & 0x80) && ((left ^ right) & 0x80) == 0) { + if (left & 0x80) + result = 0x80; + else + result = 0x7F; + } + + return result; +} + +/* 8-bit signed saturated subtraction */ +u8 ARMul_SignedSaturatedSub8(u8 left, u8 right) +{ + u8 result = left - right; + + if (((result ^ left) & 0x80) && ((left ^ right) & 0x80) != 0) { + if (left & 0x80) + result = 0x80; + else + result = 0x7F; + } + + return result; +} + +/* 16-bit signed saturated addition */ +u16 ARMul_SignedSaturatedAdd16(u16 left, u16 right) +{ + u16 result = left + right; + + if (((result ^ left) & 0x8000) && ((left ^ right) & 0x8000) == 0) { + if (left & 0x8000) + result = 0x8000; + else + result = 0x7FFF; + } + + return result; +} + +/* 16-bit signed saturated subtraction */ +u16 ARMul_SignedSaturatedSub16(u16 left, u16 right) +{ + u16 result = left - right; + + if (((result ^ left) & 0x8000) && ((left ^ right) & 0x8000) != 0) { + if (left & 0x8000) + result = 0x8000; + else + result = 0x7FFF; + } + + return result; +} + /* 8-bit unsigned saturated addition */ u8 ARMul_UnsignedSaturatedAdd8(u8 left, u8 right) { |