Ryujit/ARM32: Implement Lowering::LowerRotate
authorHyung-Kyu Choi <hk0110.choi@samsung.com>
Mon, 19 Dec 2016 12:17:39 +0000 (21:17 +0900)
committerHyung-Kyu Choi <hk0110.choi@samsung.com>
Mon, 19 Dec 2016 12:17:39 +0000 (21:17 +0900)
Implement Lowering::LowerRotate(GenTreePtr tree) in lowerarm.cpp

Signed-off-by: Hyung-Kyu Choi <hk0110.choi@samsung.com>
src/jit/lowerarm.cpp

index 5bf23c4..e85bfb5 100644 (file)
@@ -106,7 +106,28 @@ void Lowering::LowerCast(GenTree* tree)
 
 void Lowering::LowerRotate(GenTreePtr tree)
 {
-    NYI_ARM("ARM Lowering for ROL and ROR");
+    if (tree->OperGet() == GT_ROL)
+    {
+        // There is no ROL instruction on ARM. Convert ROL into ROR.
+        GenTreePtr rotatedValue        = tree->gtOp.gtOp1;
+        unsigned   rotatedValueBitSize = genTypeSize(rotatedValue->gtType) * 8;
+        GenTreePtr rotateLeftIndexNode = tree->gtOp.gtOp2;
+
+        if (rotateLeftIndexNode->IsCnsIntOrI())
+        {
+            ssize_t rotateLeftIndex                 = rotateLeftIndexNode->gtIntCon.gtIconVal;
+            ssize_t rotateRightIndex                = rotatedValueBitSize - rotateLeftIndex;
+            rotateLeftIndexNode->gtIntCon.gtIconVal = rotateRightIndex;
+        }
+        else
+        {
+            GenTreePtr tmp =
+                comp->gtNewOperNode(GT_NEG, genActualType(rotateLeftIndexNode->gtType), rotateLeftIndexNode);
+            BlockRange().InsertAfter(rotateLeftIndexNode, tmp);
+            tree->gtOp.gtOp2 = tmp;
+        }
+        tree->ChangeOper(GT_ROR);
+    }
 }
 
 void Lowering::TreeNodeInfoInit(GenTree* stmt)