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