Fix reading Time zone rules using Julian days (#17672)
[platform/upstream/coreclr.git] / src / jit / decomposelongs.h
1 // Licensed to the .NET Foundation under one or more agreements.
2 // The .NET Foundation licenses this file to you under the MIT license.
3 // See the LICENSE file in the project root for more information.
4
5 /*XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
6 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
7 XX                                                                           XX
8 XX                               DecomposeLongs                              XX
9 XX                                                                           XX
10 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
11 XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
12 */
13
14 #ifndef _DECOMPOSELONGS_H_
15 #define _DECOMPOSELONGS_H_
16
17 #include "compiler.h"
18
19 class DecomposeLongs
20 {
21 public:
22     DecomposeLongs(Compiler* compiler) : m_compiler(compiler)
23     {
24     }
25
26     void PrepareForDecomposition();
27     void DecomposeBlock(BasicBlock* block);
28
29     static void DecomposeRange(Compiler* compiler, unsigned blockWeight, LIR::Range& range);
30
31 private:
32     inline LIR::Range& Range() const
33     {
34         return *m_range;
35     }
36
37     // Driver functions
38     void     DecomposeRangeHelper();
39     GenTree* DecomposeNode(GenTree* tree);
40
41     // Per-node type decompose cases
42     GenTree* DecomposeLclVar(LIR::Use& use);
43     GenTree* DecomposeLclFld(LIR::Use& use);
44     GenTree* DecomposeStoreLclVar(LIR::Use& use);
45     GenTree* DecomposeStoreLclFld(LIR::Use& use);
46     GenTree* DecomposeCast(LIR::Use& use);
47     GenTree* DecomposeCnsLng(LIR::Use& use);
48     GenTree* DecomposeFieldList(GenTreeFieldList* listNode, GenTreeOp* longNode);
49     GenTree* DecomposeCall(LIR::Use& use);
50     GenTree* DecomposeInd(LIR::Use& use);
51     GenTree* DecomposeStoreInd(LIR::Use& use);
52     GenTree* DecomposeNot(LIR::Use& use);
53     GenTree* DecomposeNeg(LIR::Use& use);
54     GenTree* DecomposeArith(LIR::Use& use);
55     GenTree* DecomposeShift(LIR::Use& use);
56     GenTree* DecomposeRotate(LIR::Use& use);
57     GenTree* DecomposeMul(LIR::Use& use);
58     GenTree* DecomposeUMod(LIR::Use& use);
59     GenTree* DecomposeSimd(LIR::Use& use);
60     GenTree* DecomposeSimdGetItem(LIR::Use& use);
61
62     // Helper functions
63     GenTree* FinalizeDecomposition(LIR::Use& use, GenTree* loResult, GenTree* hiResult, GenTree* insertResultAfter);
64     GenTree* RepresentOpAsLocalVar(GenTree* op, GenTree* user, GenTree** edge);
65     GenTree* EnsureIntSized(GenTree* node, bool signExtend);
66
67     GenTree* StoreNodeToVar(LIR::Use& use);
68     static genTreeOps GetHiOper(genTreeOps oper);
69     static genTreeOps GetLoOper(genTreeOps oper);
70
71     // Data
72     Compiler*   m_compiler;
73     unsigned    m_blockWeight;
74     LIR::Range* m_range;
75 };
76
77 #endif // _DECOMPOSELONGS_H_