1 /*
2  * Copyright (C) 2015 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #ifndef ART_COMPILER_OPTIMIZING_INTRINSICS_ARM_H_
18 #define ART_COMPILER_OPTIMIZING_INTRINSICS_ARM_H_
19 
20 #include "intrinsics.h"
21 
22 namespace art {
23 
24 class ArenaAllocator;
25 class ArmInstructionSetFeatures;
26 class HInvokeStaticOrDirect;
27 class HInvokeVirtual;
28 
29 namespace arm {
30 
31 class ArmAssembler;
32 class CodeGeneratorARM;
33 
34 class IntrinsicLocationsBuilderARM FINAL : public IntrinsicVisitor {
35  public:
IntrinsicLocationsBuilderARM(ArenaAllocator * arena,ArmAssembler * assembler,const ArmInstructionSetFeatures & features)36   IntrinsicLocationsBuilderARM(ArenaAllocator* arena,
37                                ArmAssembler* assembler,
38                                const ArmInstructionSetFeatures& features)
39       : arena_(arena), assembler_(assembler), features_(features) {}
40 
41   // Define visitor methods.
42 
43 #define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
44   void Visit ## Name(HInvoke* invoke) OVERRIDE;
45 #include "intrinsics_list.h"
46 INTRINSICS_LIST(OPTIMIZING_INTRINSICS)
47 #undef INTRINSICS_LIST
48 #undef OPTIMIZING_INTRINSICS
49 
50   // Check whether an invoke is an intrinsic, and if so, create a location summary. Returns whether
51   // a corresponding LocationSummary with the intrinsified_ flag set was generated and attached to
52   // the invoke.
53   bool TryDispatch(HInvoke* invoke);
54 
55  private:
56   ArenaAllocator* arena_;
57   ArmAssembler* assembler_;
58 
59   const ArmInstructionSetFeatures& features_;
60 
61   DISALLOW_COPY_AND_ASSIGN(IntrinsicLocationsBuilderARM);
62 };
63 
64 class IntrinsicCodeGeneratorARM FINAL : public IntrinsicVisitor {
65  public:
IntrinsicCodeGeneratorARM(CodeGeneratorARM * codegen)66   explicit IntrinsicCodeGeneratorARM(CodeGeneratorARM* codegen) : codegen_(codegen) {}
67 
68   // Define visitor methods.
69 
70 #define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
71   void Visit ## Name(HInvoke* invoke) OVERRIDE;
72 #include "intrinsics_list.h"
73 INTRINSICS_LIST(OPTIMIZING_INTRINSICS)
74 #undef INTRINSICS_LIST
75 #undef OPTIMIZING_INTRINSICS
76 
77  private:
78   ArmAssembler* GetAssembler();
79 
80   ArenaAllocator* GetAllocator();
81 
82   CodeGeneratorARM* codegen_;
83 
84   DISALLOW_COPY_AND_ASSIGN(IntrinsicCodeGeneratorARM);
85 };
86 
87 }  // namespace arm
88 }  // namespace art
89 
90 #endif  // ART_COMPILER_OPTIMIZING_INTRINSICS_ARM_H_
91