1701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen/*
2701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * Copyright (C) 2015 The Android Open Source Project
3701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen *
4701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * Licensed under the Apache License, Version 2.0 (the "License");
5701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * you may not use this file except in compliance with the License.
6701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * You may obtain a copy of the License at
7701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen *
8701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen *      http://www.apache.org/licenses/LICENSE-2.0
9701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen *
10701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * Unless required by applicable law or agreed to in writing, software
11701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * distributed under the License is distributed on an "AS IS" BASIS,
12701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * See the License for the specific language governing permissions and
14701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen * limitations under the License.
15701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen */
16701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
17701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#ifndef ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS_H_
18701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#define ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS_H_
19701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
20701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#include "intrinsics.h"
21701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
22701566aaae098d5aab9d912e2003a18d44fb850dChris Larsennamespace art {
23701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
24701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass ArenaAllocator;
25701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass HInvokeStaticOrDirect;
26701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass HInvokeVirtual;
27701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
28701566aaae098d5aab9d912e2003a18d44fb850dChris Larsennamespace mips {
29701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
30701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass CodeGeneratorMIPS;
31701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass MipsAssembler;
32701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
33701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass IntrinsicLocationsBuilderMIPS FINAL : public IntrinsicVisitor {
34701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen public:
35701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  explicit IntrinsicLocationsBuilderMIPS(CodeGeneratorMIPS* codegen);
36701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
37701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  // Define visitor methods.
38701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
395d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
40701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  void Visit ## Name(HInvoke* invoke) OVERRIDE;
41701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#include "intrinsics_list.h"
42701566aaae098d5aab9d912e2003a18d44fb850dChris LarsenINTRINSICS_LIST(OPTIMIZING_INTRINSICS)
43701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#undef INTRINSICS_LIST
44701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#undef OPTIMIZING_INTRINSICS
45701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
46701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  // Check whether an invoke is an intrinsic, and if so, create a location summary. Returns whether
47701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  // a corresponding LocationSummary with the intrinsified_ flag set was generated and attached to
48701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  // the invoke.
49701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  bool TryDispatch(HInvoke* invoke);
50701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
51701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen private:
52701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  ArenaAllocator* arena_;
53701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
54701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  DISALLOW_COPY_AND_ASSIGN(IntrinsicLocationsBuilderMIPS);
55701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen};
56701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
57701566aaae098d5aab9d912e2003a18d44fb850dChris Larsenclass IntrinsicCodeGeneratorMIPS FINAL : public IntrinsicVisitor {
58701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen public:
59701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  explicit IntrinsicCodeGeneratorMIPS(CodeGeneratorMIPS* codegen) : codegen_(codegen) {}
60701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
61701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  // Define visitor methods.
62701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
635d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
64701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  void Visit ## Name(HInvoke* invoke) OVERRIDE;
65701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#include "intrinsics_list.h"
66701566aaae098d5aab9d912e2003a18d44fb850dChris LarsenINTRINSICS_LIST(OPTIMIZING_INTRINSICS)
67701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#undef INTRINSICS_LIST
68701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#undef OPTIMIZING_INTRINSICS
69701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
70bb9863af3a98622e650de78fb235ab484b50eb1fAlexey Frunze  bool IsR2OrNewer() const;
71bb9863af3a98622e650de78fb235ab484b50eb1fAlexey Frunze  bool IsR6() const;
72bb9863af3a98622e650de78fb235ab484b50eb1fAlexey Frunze  bool Is32BitFPU() const;
73e16ce5a52da4fcbb8c6b5d1ec696863fcf113409Chris Larsen
74701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen private:
75701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  MipsAssembler* GetAssembler();
76701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
77701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  ArenaAllocator* GetAllocator();
78701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
79701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  CodeGeneratorMIPS* codegen_;
80701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
81701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen  DISALLOW_COPY_AND_ASSIGN(IntrinsicCodeGeneratorMIPS);
82701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen};
83701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
84701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen}  // namespace mips
85701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen}  // namespace art
86701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen
87701566aaae098d5aab9d912e2003a18d44fb850dChris Larsen#endif  // ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS_H_
88