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