10616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell/*
20616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * Copyright (C) 2015 The Android Open Source Project
30616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell *
40616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * Licensed under the Apache License, Version 2.0 (the "License");
50616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * you may not use this file except in compliance with the License.
60616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * You may obtain a copy of the License at
70616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell *
80616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell *      http://www.apache.org/licenses/LICENSE-2.0
90616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell *
100616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * Unless required by applicable law or agreed to in writing, software
110616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * distributed under the License is distributed on an "AS IS" BASIS,
120616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
130616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * See the License for the specific language governing permissions and
140616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell * limitations under the License.
150616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell */
160616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
170616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell#ifndef ART_COMPILER_OPTIMIZING_NODES_X86_H_
180616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell#define ART_COMPILER_OPTIMIZING_NODES_X86_H_
190616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
200616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellnamespace art {
210616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
220616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell// Compute the address of the method for X86 Constant area support.
230616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellclass HX86ComputeBaseMethodAddress : public HExpression<0> {
240616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell public:
250616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  // Treat the value as an int32_t, but it is really a 32 bit native pointer.
26154746b84b407cfd166b45e039b62e6a06dc3f39Calin Juravle  HX86ComputeBaseMethodAddress()
27154746b84b407cfd166b45e039b62e6a06dc3f39Calin Juravle      : HExpression(Primitive::kPrimInt, SideEffects::None(), kNoDexPc) {}
280616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
290616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  DECLARE_INSTRUCTION(X86ComputeBaseMethodAddress);
300616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
310616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell private:
320616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  DISALLOW_COPY_AND_ASSIGN(HX86ComputeBaseMethodAddress);
330616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell};
340616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
350616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell// Load a constant value from the constant table.
360616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendellclass HX86LoadFromConstantTable : public HExpression<2> {
370616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell public:
380616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  HX86LoadFromConstantTable(HX86ComputeBaseMethodAddress* method_base,
39b3e773eea39a156b3eacf915ba84e3af1a5c14faDavid Brazdil                            HConstant* constant)
40b3e773eea39a156b3eacf915ba84e3af1a5c14faDavid Brazdil      : HExpression(constant->GetType(), SideEffects::None(), kNoDexPc) {
410616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    SetRawInputAt(0, method_base);
420616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    SetRawInputAt(1, constant);
430616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
440616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
450616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
460616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    return InputAt(0)->AsX86ComputeBaseMethodAddress();
470616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
480616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
490616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  HConstant* GetConstant() const {
500616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell    return InputAt(1)->AsConstant();
510616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  }
520616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
530616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  DECLARE_INSTRUCTION(X86LoadFromConstantTable);
540616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
550616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell private:
560616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell  DISALLOW_COPY_AND_ASSIGN(HX86LoadFromConstantTable);
570616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell};
580616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
592f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell// Version of HNeg with access to the constant table for FP types.
602f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendellclass HX86FPNeg : public HExpression<2> {
612f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell public:
622f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell  HX86FPNeg(Primitive::Type result_type,
632f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell            HInstruction* input,
642f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell            HX86ComputeBaseMethodAddress* method_base,
652f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell            uint32_t dex_pc)
662f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell      : HExpression(result_type, SideEffects::None(), dex_pc) {
672f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell    DCHECK(Primitive::IsFloatingPointType(result_type));
682f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell    SetRawInputAt(0, input);
692f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell    SetRawInputAt(1, method_base);
702f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell  }
712f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell
722f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell  DECLARE_INSTRUCTION(X86FPNeg);
732f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell
742f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell private:
752f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell  DISALLOW_COPY_AND_ASSIGN(HX86FPNeg);
762f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell};
772f10a5fb8c236a6786928f0323bd312c3ee9a4ccMark P Mendell
78805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell// X86 version of HPackedSwitch that holds a pointer to the base method address.
79805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendellclass HX86PackedSwitch : public HTemplateInstruction<2> {
80805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell public:
81805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  HX86PackedSwitch(int32_t start_value,
82805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell                   int32_t num_entries,
83805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell                   HInstruction* input,
84805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell                   HX86ComputeBaseMethodAddress* method_base,
85805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell                   uint32_t dex_pc)
86805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    : HTemplateInstruction(SideEffects::None(), dex_pc),
87805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell      start_value_(start_value),
88805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell      num_entries_(num_entries) {
89805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    SetRawInputAt(0, input);
90805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    SetRawInputAt(1, method_base);
91805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  }
92805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
93805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  bool IsControlFlow() const OVERRIDE { return true; }
94805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
95805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  int32_t GetStartValue() const { return start_value_; }
96805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
97805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  int32_t GetNumEntries() const { return num_entries_; }
98805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
99805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  HX86ComputeBaseMethodAddress* GetBaseMethodAddress() const {
100805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    return InputAt(1)->AsX86ComputeBaseMethodAddress();
101805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  }
102805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
103805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  HBasicBlock* GetDefaultBlock() const {
104805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    // Last entry is the default block.
105805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell    return GetBlock()->GetSuccessors()[num_entries_];
106805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  }
107805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
108805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  DECLARE_INSTRUCTION(X86PackedSwitch);
109805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
110805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell private:
111805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  const int32_t start_value_;
112805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  const int32_t num_entries_;
113805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
114805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell  DISALLOW_COPY_AND_ASSIGN(HX86PackedSwitch);
115805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell};
116805b3b56c6eb542298db33e0181f135dc9fed3d9Mark Mendell
1170616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell}  // namespace art
1180616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell
1190616ae081e648f4b9b64b33e2624a943c5fce977Mark Mendell#endif  // ART_COMPILER_OPTIMIZING_NODES_X86_H_
120