Advertisement
fastman92

ARM immediate value encoding

Feb 16th, 2014
175
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.84 KB | None | 0 0
  1. // Android Immediate Number Representation.cpp : Defines the entry point for the console application.
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <iostream>
  6.  
  7. inline unsigned long RotateLeft(unsigned long n, unsigned long i)
  8. {
  9.   return (n << i) | (n >> (32 - i));
  10. }
  11.  
  12. inline unsigned int RotateRight32Bit(unsigned int Data, unsigned int Bits) {
  13.     return (Data >> Bits) | (Data << (32-Bits));
  14. }
  15.  
  16. inline bool IsBlockSet(__int32 num, __int32 blockNum)
  17. {
  18.     blockNum *= 2;
  19.  
  20.     return ((1 << blockNum | 1 << (blockNum + 1)) & num) != 0;
  21. }
  22.  
  23. int FindBlockOfFirstBit(__int32 num)
  24. {
  25.     for(int i = 0; i < 16; i++)
  26.     {
  27.         if(IsBlockSet(num, i))
  28.             return i;
  29.     }
  30.  
  31.     return 0;
  32. }
  33.  
  34. inline int GetRemainder(int a, int b)
  35. {
  36.     return ((a % b) + b) % b;
  37. }
  38.  
  39. inline unsigned int blockModulo(int blockNum)
  40. {
  41.     return GetRemainder(blockNum, 16);
  42. }
  43.  
  44. int FindBlockOfLastBit(__int32 num)
  45. {
  46.     for(int i = 30; i >= 0; i -= 2)
  47.     {
  48.         if((1 << i | 1 << (i + 1)) & num)
  49.             return i / 2;
  50.     }
  51.  
  52.     return 0;
  53. }
  54.  
  55. int GoForwardAndGetActiveBlock(__int32 num, int startBlock)
  56. {
  57.     for(int i = 3; i >= 1; i--)
  58.     {
  59.         int blockNum = startBlock + i;
  60.  
  61.         if(IsBlockSet(num, blockNum))
  62.             return blockNum;
  63.     }
  64.  
  65.     return startBlock;
  66. }
  67.  
  68. int GoBackwardAndGetActiveBlock(__int32 num, int startBlock)
  69. {
  70.     for(int i = 3; i >= 1; i--)
  71.     {
  72.         int blockNum = startBlock - i;
  73.  
  74.         if(IsBlockSet(num, blockNum))
  75.             return blockNum;
  76.     }
  77.  
  78.     return startBlock;
  79. }
  80.  
  81. bool GetARMImmediateNumberComponents(__int32 num, unsigned char* outNum, unsigned char* outRot)
  82. {
  83.     int start = FindBlockOfFirstBit(num);
  84.  
  85.     int forward = blockModulo(GoForwardAndGetActiveBlock(num, start));
  86.  
  87.     int backward = blockModulo(GoBackwardAndGetActiveBlock(num, forward));
  88.  
  89.     int end = blockModulo(backward + 4);
  90.  
  91.     forward *= 2;
  92.  
  93.     backward *= 2;
  94.  
  95.     end *= 2;
  96.  
  97.     __int32 mask;
  98.  
  99.     if(end < backward)
  100.         mask = ~(((1 << (backward-end)) - 1) << end);
  101.     else
  102.         mask = ((1 << (end-backward)) - 1) << backward;
  103.  
  104.     __int32 leftOver = num  & ~mask;
  105.  
  106.     if(!leftOver)
  107.     {
  108.         *outRot = backward == 0 ? 0 : 32 - backward;
  109.        
  110.         *outNum = (char)RotateLeft(num & mask, *outRot);
  111.         return true;
  112.     }
  113.     else
  114.     {
  115.         *outRot = -1;
  116.         *outNum = -1;
  117.         return false;
  118.     }  
  119. }
  120.  
  121. inline unsigned short int GetARMImmediateNumberRepresentation(unsigned char outNum, unsigned char outRot)
  122. {
  123.     return outNum | ((outRot/2) << 8);
  124. }
  125.  
  126. int main(int argc, char* argv[])
  127. {
  128.     unsigned char outNum;
  129.     unsigned char outRot;
  130.  
  131.     // Please change a number here!
  132.     bool bCanBeRepresentedAsImmediate = GetARMImmediateNumberComponents(0x0003FC00, &outNum, &outRot);
  133.  
  134.     if(bCanBeRepresentedAsImmediate)
  135.     {
  136.         unsigned short int result = GetARMImmediateNumberRepresentation(outNum, outRot);
  137.  
  138.         printf("Equation: 0x%X ROR %d Value: %02X", outNum, outRot, result);
  139.     }
  140.     else
  141.         printf("This value can't be represented as ARM immediate.\n");
  142.  
  143.     getchar();
  144.  
  145.     return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement