13039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen/*
23039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * Copyright (C) 2015 The Android Open Source Project
33039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen *
43039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * Licensed under the Apache License, Version 2.0 (the "License");
53039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * you may not use this file except in compliance with the License.
63039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * You may obtain a copy of the License at
73039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen *
83039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen *      http://www.apache.org/licenses/LICENSE-2.0
93039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen *
103039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * Unless required by applicable law or agreed to in writing, software
113039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * distributed under the License is distributed on an "AS IS" BASIS,
123039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * See the License for the specific language governing permissions and
143039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen * limitations under the License.
153039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen */
163039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
173039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#ifndef ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS64_H_
183039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#define ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS64_H_
193039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
203039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#include "intrinsics.h"
213039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
223039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsennamespace art {
233039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
243039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass ArenaAllocator;
253039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass HInvokeStaticOrDirect;
263039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass HInvokeVirtual;
273039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
283039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsennamespace mips64 {
293039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
303039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass CodeGeneratorMIPS64;
313039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass Mips64Assembler;
323039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
333039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass IntrinsicLocationsBuilderMIPS64 FINAL : public IntrinsicVisitor {
343039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen public:
353039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  explicit IntrinsicLocationsBuilderMIPS64(CodeGeneratorMIPS64* codegen);
363039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
373039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  // Define visitor methods.
383039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
395d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
403039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  void Visit ## Name(HInvoke* invoke) OVERRIDE;
413039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#include "intrinsics_list.h"
423039e381b79ac1ef01c420511f6629f639d40ab4Chris LarsenINTRINSICS_LIST(OPTIMIZING_INTRINSICS)
433039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#undef INTRINSICS_LIST
443039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#undef OPTIMIZING_INTRINSICS
453039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
463039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  // Check whether an invoke is an intrinsic, and if so, create a location summary. Returns whether
473039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  // a corresponding LocationSummary with the intrinsified_ flag set was generated and attached to
483039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  // the invoke.
493039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  bool TryDispatch(HInvoke* invoke);
503039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
513039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen private:
523039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  ArenaAllocator* arena_;
533039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
543039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  DISALLOW_COPY_AND_ASSIGN(IntrinsicLocationsBuilderMIPS64);
553039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen};
563039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
573039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsenclass IntrinsicCodeGeneratorMIPS64 FINAL : public IntrinsicVisitor {
583039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen public:
593039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  explicit IntrinsicCodeGeneratorMIPS64(CodeGeneratorMIPS64* codegen) : codegen_(codegen) {}
603039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
613039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  // Define visitor methods.
623039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
635d75afe333f57546786686d9bee16b52f1bbe971Aart Bik#define OPTIMIZING_INTRINSICS(Name, IsStatic, NeedsEnvironmentOrCache, SideEffects, Exceptions) \
643039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  void Visit ## Name(HInvoke* invoke) OVERRIDE;
653039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#include "intrinsics_list.h"
663039e381b79ac1ef01c420511f6629f639d40ab4Chris LarsenINTRINSICS_LIST(OPTIMIZING_INTRINSICS)
673039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#undef INTRINSICS_LIST
683039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#undef OPTIMIZING_INTRINSICS
693039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
703039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen private:
713039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  Mips64Assembler* GetAssembler();
723039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
733039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  ArenaAllocator* GetAllocator();
743039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
753039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  CodeGeneratorMIPS64* codegen_;
763039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
773039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen  DISALLOW_COPY_AND_ASSIGN(IntrinsicCodeGeneratorMIPS64);
783039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen};
793039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
803039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen}  // namespace mips64
813039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen}  // namespace art
823039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen
833039e381b79ac1ef01c420511f6629f639d40ab4Chris Larsen#endif  // ART_COMPILER_OPTIMIZING_INTRINSICS_MIPS64_H_
84