• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_COMPILER_OPTIMIZING_NODES_X86_H_
18 #define ART_COMPILER_OPTIMIZING_NODES_X86_H_
19 
20 namespace art {
21 
22 // Compute the address of the method for X86 Constant area support.
23 class HX86ComputeBaseMethodAddress FINAL : public HExpression<0> {
24  public:
25   // Treat the value as an int32_t, but it is really a 32 bit native pointer.
HX86ComputeBaseMethodAddress()26   HX86ComputeBaseMethodAddress()
27       : HExpression(kX86ComputeBaseMethodAddress,
28                     DataType::Type::kInt32,
29                     SideEffects::None(),
30                     kNoDexPc) {
31   }
32 
CanBeMoved()33   bool CanBeMoved() const OVERRIDE { return true; }
34 
35   DECLARE_INSTRUCTION(X86ComputeBaseMethodAddress);
36 
37  protected:
38   DEFAULT_COPY_CONSTRUCTOR(X86ComputeBaseMethodAddress);
39 };
40 
41 // Load a constant value from the constant table.
42 class HX86LoadFromConstantTable FINAL : public HExpression<2> {
43  public:
HX86LoadFromConstantTable(HX86ComputeBaseMethodAddress * method_base,HConstant * constant)44   HX86LoadFromConstantTable(HX86ComputeBaseMethodAddress* method_base,
45                             HConstant* constant)
46       : HExpression(kX86LoadFromConstantTable,
47                     constant->GetType(),
48                     SideEffects::None(),
49                     kNoDexPc) {
50     SetRawInputAt(0, method_base);
51     SetRawInputAt(1, constant);
52   }
53 
GetBaseMethodAddress()54   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
55     return InputAt(0)->AsX86ComputeBaseMethodAddress();
56   }
57 
GetConstant()58   HConstant* GetConstant() const {
59     return InputAt(1)->AsConstant();
60   }
61 
62   DECLARE_INSTRUCTION(X86LoadFromConstantTable);
63 
64  protected:
65   DEFAULT_COPY_CONSTRUCTOR(X86LoadFromConstantTable);
66 };
67 
68 // Version of HNeg with access to the constant table for FP types.
69 class HX86FPNeg FINAL : public HExpression<2> {
70  public:
HX86FPNeg(DataType::Type result_type,HInstruction * input,HX86ComputeBaseMethodAddress * method_base,uint32_t dex_pc)71   HX86FPNeg(DataType::Type result_type,
72             HInstruction* input,
73             HX86ComputeBaseMethodAddress* method_base,
74             uint32_t dex_pc)
75       : HExpression(kX86FPNeg, result_type, SideEffects::None(), dex_pc) {
76     DCHECK(DataType::IsFloatingPointType(result_type));
77     SetRawInputAt(0, input);
78     SetRawInputAt(1, method_base);
79   }
80 
GetBaseMethodAddress()81   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
82     return InputAt(1)->AsX86ComputeBaseMethodAddress();
83   }
84 
85   DECLARE_INSTRUCTION(X86FPNeg);
86 
87  protected:
88   DEFAULT_COPY_CONSTRUCTOR(X86FPNeg);
89 };
90 
91 // X86 version of HPackedSwitch that holds a pointer to the base method address.
92 class HX86PackedSwitch FINAL : public HTemplateInstruction<2> {
93  public:
HX86PackedSwitch(int32_t start_value,int32_t num_entries,HInstruction * input,HX86ComputeBaseMethodAddress * method_base,uint32_t dex_pc)94   HX86PackedSwitch(int32_t start_value,
95                    int32_t num_entries,
96                    HInstruction* input,
97                    HX86ComputeBaseMethodAddress* method_base,
98                    uint32_t dex_pc)
99     : HTemplateInstruction(kX86PackedSwitch, SideEffects::None(), dex_pc),
100       start_value_(start_value),
101       num_entries_(num_entries) {
102     SetRawInputAt(0, input);
103     SetRawInputAt(1, method_base);
104   }
105 
IsControlFlow()106   bool IsControlFlow() const OVERRIDE { return true; }
107 
GetStartValue()108   int32_t GetStartValue() const { return start_value_; }
109 
GetNumEntries()110   int32_t GetNumEntries() const { return num_entries_; }
111 
GetBaseMethodAddress()112   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
113     return InputAt(1)->AsX86ComputeBaseMethodAddress();
114   }
115 
GetDefaultBlock()116   HBasicBlock* GetDefaultBlock() const {
117     // Last entry is the default block.
118     return GetBlock()->GetSuccessors()[num_entries_];
119   }
120 
121   DECLARE_INSTRUCTION(X86PackedSwitch);
122 
123  protected:
124   DEFAULT_COPY_CONSTRUCTOR(X86PackedSwitch);
125 
126  private:
127   const int32_t start_value_;
128   const int32_t num_entries_;
129 };
130 
131 }  // namespace art
132 
133 #endif  // ART_COMPILER_OPTIMIZING_NODES_X86_H_
134