diff options
author | gdkchan <gab.dark.100@gmail.com> | 2019-01-24 23:59:53 -0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-24 23:59:53 -0200 |
commit | 36b9ab0e48b6893c057a954e1ef3181b452add1c (patch) | |
tree | 16a4ae56019b55d0cb61f1aa105481933ada733e /ChocolArm64/Decoders/BitUtils.cs | |
parent | 72157e03eb09d4fb5d6d004efc2d13d3194e8c90 (diff) |
Add ARM32 support on the translator (#561)
* Remove ARM32 interpreter and add ARM32 support on the translator
* Nits.
* Rename Cond -> Condition
* Align code again
* Rename Data to Alu
* Enable ARM32 support and handle undefined instructions
* Use the IsThumb method to check if its a thumb opcode
* Remove another 32-bits check
Diffstat (limited to 'ChocolArm64/Decoders/BitUtils.cs')
-rw-r--r-- | ChocolArm64/Decoders/BitUtils.cs | 59 |
1 files changed, 59 insertions, 0 deletions
diff --git a/ChocolArm64/Decoders/BitUtils.cs b/ChocolArm64/Decoders/BitUtils.cs new file mode 100644 index 00000000..8b9fb5e3 --- /dev/null +++ b/ChocolArm64/Decoders/BitUtils.cs @@ -0,0 +1,59 @@ +namespace ChocolArm64.Decoders +{ + static class BitUtils + { + public static int HighestBitSet32(int value) + { + for (int bit = 31; bit >= 0; bit--) + { + if (((value >> bit) & 1) != 0) + { + return bit; + } + } + + return -1; + } + + private static readonly sbyte[] HbsNibbleTbl = { -1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3 }; + + public static int HighestBitSetNibble(int value) => HbsNibbleTbl[value & 0b1111]; + + public static long Replicate(long bits, int size) + { + long output = 0; + + for (int bit = 0; bit < 64; bit += size) + { + output |= bits << bit; + } + + return output; + } + + public static long FillWithOnes(int bits) + { + return bits == 64 ? -1L : (1L << bits) - 1; + } + + public static int RotateRight(int bits, int shift, int size) + { + return (int)RotateRight((uint)bits, shift, size); + } + + public static uint RotateRight(uint bits, int shift, int size) + { + return (bits >> shift) | (bits << (size - shift)); + } + + public static long RotateRight(long bits, int shift, int size) + { + return (long)RotateRight((ulong)bits, shift, size); + } + + public static ulong RotateRight(ulong bits, int shift, int size) + { + return (bits >> shift) | (bits << (size - shift)); + } + } +} |