Merge pull request #1830 from erozenfeld/RotateBits
[platform/upstream/coreclr.git] / src / jit / lowerarm.cpp
1 //
2 // Copyright (c) Microsoft. All rights reserved.
3 // Licensed under the MIT license. See LICENSE file in the project root for full license information.
4 //
5
6 /*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
8 XX                                                                           XX
9 XX                           Lowering for ARM                                XX
10 XX                                                                           XX
11 XX  This encapsulates all the logic for lowering trees for the ARM           XX
12 XX  architecture.  For a more detailed view of what is lowering, please      XX
13 XX  take a look at Lower.cpp                                                 XX
14 XX                                                                           XX
15 XX                                                                           XX
16 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
17 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
18 */
19
20 #include "jitpch.h"
21 #ifdef _MSC_VER
22 #pragma hdrstop
23 #endif
24
25 #ifndef LEGACY_BACKEND // This file is ONLY used for the RyuJIT backend that uses the linear scan register allocator
26
27 // The ARM backend is not yet implemented, so the methods here are all NYI.
28 // TODO-ARM-NYI: Lowering for ARM.
29 #ifdef _TARGET_ARM_
30
31 #include "jit.h"
32 #include "lower.h"
33 #include "lsra.h"
34
35 /* Lowering of GT_CAST nodes */
36 void Lowering::LowerCast(GenTreePtr *ppTree) { }
37
38
39 void Lowering::LowerCntBlockOp(GenTreePtr *ppTree)
40 {
41     NYI_ARM("ARM Lowering for BlockOp");
42 }
43
44 void Lowering::LowerRotate(GenTreePtr tree)
45 {
46     NYI_ARM("ARM Lowering for ROL and ROR");
47 }
48
49 void Lowering::TreeNodeInfoInitCall(GenTree *tree, TreeNodeInfo &info, 
50                                     int &srcCount, // out 
51                                     int &dstCount  // out
52     )
53 {
54     NYI_ARM("ARM TreeNodeInfoInit for Call");
55 }
56
57 Compiler::fgWalkResult Lowering::TreeInfoInitHelper(GenTreePtr* pTree, Compiler::fgWalkData* data)
58 {
59     Lowering* lower = (Lowering*)data->pCallbackData;
60     lower->TreeNodeInfoInit(pTree, data->parent);
61     return Compiler::WALK_CONTINUE;
62 }
63
64 void Lowering::TreeNodeInfoInit(GenTree* stmt)
65 {
66     comp->fgWalkTreePost(&stmt->gtStmt.gtStmtExpr, &Lowering::TreeInfoInitHelper, this);
67 }
68
69 void Lowering::TreeNodeInfoInit(GenTreePtr *pTree, GenTree* parent)
70 {
71     NYI("ARM TreeNodInfoInit");
72 }
73
74 // returns true if the tree can use the read-modify-write memory instruction form
75 bool Lowering::isRMWRegOper(GenTreePtr tree)
76 {
77     return false;
78 }
79
80 bool Lowering::IsCallTargetInRange(void *addr)
81 {
82     return comp->codeGen->validImmForBL ((ssize_t)addr);
83 }
84
85 // return true if the immediate can be folded into an instruction, for example small enough and non-relocatable
86 bool Lowering:: IsContainableImmed(GenTree* parentNode, GenTree* childNode)
87 {
88     NYI_ARM("ARM IsContainableImmed");
89     return false;
90 }
91
92 #endif // _TARGET_ARM_
93
94 #endif // !LEGACY_BACKEND