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(Primitive::kPrimInt, SideEffects::None(), kNoDexPc) {}
28 
CanBeMoved()29   bool CanBeMoved() const OVERRIDE { return true; }
30 
31   DECLARE_INSTRUCTION(X86ComputeBaseMethodAddress);
32 
33  private:
34   DISALLOW_COPY_AND_ASSIGN(HX86ComputeBaseMethodAddress);
35 };
36 
37 // Load a constant value from the constant table.
38 class HX86LoadFromConstantTable FINAL : public HExpression<2> {
39  public:
HX86LoadFromConstantTable(HX86ComputeBaseMethodAddress * method_base,HConstant * constant)40   HX86LoadFromConstantTable(HX86ComputeBaseMethodAddress* method_base,
41                             HConstant* constant)
42       : HExpression(constant->GetType(), SideEffects::None(), kNoDexPc) {
43     SetRawInputAt(0, method_base);
44     SetRawInputAt(1, constant);
45   }
46 
GetBaseMethodAddress()47   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
48     return InputAt(0)->AsX86ComputeBaseMethodAddress();
49   }
50 
GetConstant()51   HConstant* GetConstant() const {
52     return InputAt(1)->AsConstant();
53   }
54 
55   DECLARE_INSTRUCTION(X86LoadFromConstantTable);
56 
57  private:
58   DISALLOW_COPY_AND_ASSIGN(HX86LoadFromConstantTable);
59 };
60 
61 // Version of HNeg with access to the constant table for FP types.
62 class HX86FPNeg FINAL : public HExpression<2> {
63  public:
HX86FPNeg(Primitive::Type result_type,HInstruction * input,HX86ComputeBaseMethodAddress * method_base,uint32_t dex_pc)64   HX86FPNeg(Primitive::Type result_type,
65             HInstruction* input,
66             HX86ComputeBaseMethodAddress* method_base,
67             uint32_t dex_pc)
68       : HExpression(result_type, SideEffects::None(), dex_pc) {
69     DCHECK(Primitive::IsFloatingPointType(result_type));
70     SetRawInputAt(0, input);
71     SetRawInputAt(1, method_base);
72   }
73 
GetBaseMethodAddress()74   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
75     return InputAt(1)->AsX86ComputeBaseMethodAddress();
76   }
77 
78   DECLARE_INSTRUCTION(X86FPNeg);
79 
80  private:
81   DISALLOW_COPY_AND_ASSIGN(HX86FPNeg);
82 };
83 
84 // X86 version of HPackedSwitch that holds a pointer to the base method address.
85 class HX86PackedSwitch FINAL : public HTemplateInstruction<2> {
86  public:
HX86PackedSwitch(int32_t start_value,int32_t num_entries,HInstruction * input,HX86ComputeBaseMethodAddress * method_base,uint32_t dex_pc)87   HX86PackedSwitch(int32_t start_value,
88                    int32_t num_entries,
89                    HInstruction* input,
90                    HX86ComputeBaseMethodAddress* method_base,
91                    uint32_t dex_pc)
92     : HTemplateInstruction(SideEffects::None(), dex_pc),
93       start_value_(start_value),
94       num_entries_(num_entries) {
95     SetRawInputAt(0, input);
96     SetRawInputAt(1, method_base);
97   }
98 
IsControlFlow()99   bool IsControlFlow() const OVERRIDE { return true; }
100 
GetStartValue()101   int32_t GetStartValue() const { return start_value_; }
102 
GetNumEntries()103   int32_t GetNumEntries() const { return num_entries_; }
104 
GetBaseMethodAddress()105   HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
106     return InputAt(1)->AsX86ComputeBaseMethodAddress();
107   }
108 
GetDefaultBlock()109   HBasicBlock* GetDefaultBlock() const {
110     // Last entry is the default block.
111     return GetBlock()->GetSuccessors()[num_entries_];
112   }
113 
114   DECLARE_INSTRUCTION(X86PackedSwitch);
115 
116  private:
117   const int32_t start_value_;
118   const int32_t num_entries_;
119 
120   DISALLOW_COPY_AND_ASSIGN(HX86PackedSwitch);
121 };
122 
123 }  // namespace art
124 
125 #endif  // ART_COMPILER_OPTIMIZING_NODES_X86_H_
126