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