109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell/* 209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * Copyright (C) 2015 The Android Open Source Project 309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * 409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * Licensed under the Apache License, Version 2.0 (the "License"); 509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * you may not use this file except in compliance with the License. 609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * You may obtain a copy of the License at 709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * 809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * http://www.apache.org/licenses/LICENSE-2.0 909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * 1009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * Unless required by applicable law or agreed to in writing, software 1109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * distributed under the License is distributed on an "AS IS" BASIS, 1209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * See the License for the specific language governing permissions and 1409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell * limitations under the License. 1509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell */ 1609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 1709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#ifndef ART_COMPILER_OPTIMIZING_INTRINSICS_X86_H_ 1809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#define ART_COMPILER_OPTIMIZING_INTRINSICS_X86_H_ 1909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 2009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#include "intrinsics.h" 2109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 2209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellnamespace art { 2309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 2409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass ArenaAllocator; 2509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass HInvokeStaticOrDirect; 2609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass HInvokeVirtual; 2709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 2809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellnamespace x86 { 2909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 3009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass CodeGeneratorX86; 3109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass X86Assembler; 3209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 3309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass IntrinsicLocationsBuilderX86 FINAL : public IntrinsicVisitor { 3409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell public: 35fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell explicit IntrinsicLocationsBuilderX86(CodeGeneratorX86* codegen); 3609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 3709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell // Define visitor methods. 3809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 395d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \ 4009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void Visit ## Name(HInvoke* invoke) OVERRIDE; 4109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#include "intrinsics_list.h" 4209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark MendellINTRINSICS_LIST(OPTIMIZING_INTRINSICS) 4309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#undef INTRINSICS_LIST 4409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#undef OPTIMIZING_INTRINSICS 4509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 4609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell // Check whether an invoke is an intrinsic, and if so, create a location summary. Returns whether 4709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell // a corresponding LocationSummary with the intrinsified_ flag set was generated and attached to 4809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell // the invoke. 4909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell bool TryDispatch(HInvoke* invoke); 5009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 5109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell private: 5209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell ArenaAllocator* arena_; 53fb8d279bc011b31d0765dc7ca59afea324fd0d0cMark Mendell CodeGeneratorX86* codegen_; 5409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 5509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell DISALLOW_COPY_AND_ASSIGN(IntrinsicLocationsBuilderX86); 5609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}; 5709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 5809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendellclass IntrinsicCodeGeneratorX86 FINAL : public IntrinsicVisitor { 5909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell public: 6009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell explicit IntrinsicCodeGeneratorX86(CodeGeneratorX86* codegen) : codegen_(codegen) {} 6109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 6209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell // Define visitor methods. 6309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 645d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \ 6509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell void Visit ## Name(HInvoke* invoke) OVERRIDE; 6609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#include "intrinsics_list.h" 6709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark MendellINTRINSICS_LIST(OPTIMIZING_INTRINSICS) 6809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#undef INTRINSICS_LIST 6909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#undef OPTIMIZING_INTRINSICS 7009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell private: 7209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell X86Assembler* GetAssembler(); 7309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell ArenaAllocator* GetAllocator(); 7509ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7609ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell CodeGeneratorX86* codegen_; 7709ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 7809ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell DISALLOW_COPY_AND_ASSIGN(IntrinsicCodeGeneratorX86); 7909ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell}; 8009ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8109ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} // namespace x86 8209ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell} // namespace art 8309ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell 8409ed1a3125849ec6ac07cb886e3c502e1dcfada2Mark Mendell#endif // ART_COMPILER_OPTIMIZING_INTRINSICS_X86_H_ 85