code_generator_x86.h revision 3c7bb98698f77af10372cf31824d3bb115d9bf0f
1d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray/*
2d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * Copyright (C) 2014 The Android Open Source Project
3d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray *
4d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * Licensed under the Apache License, Version 2.0 (the "License");
5d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * you may not use this file except in compliance with the License.
6d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * You may obtain a copy of the License at
7d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray *
8d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray *      http://www.apache.org/licenses/LICENSE-2.0
9d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray *
10d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * Unless required by applicable law or agreed to in writing, software
11d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * distributed under the License is distributed on an "AS IS" BASIS,
12d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * See the License for the specific language governing permissions and
14d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray * limitations under the License.
15d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray */
16d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
17d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#ifndef ART_COMPILER_OPTIMIZING_CODE_GENERATOR_X86_H_
18d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#define ART_COMPILER_OPTIMIZING_CODE_GENERATOR_X86_H_
19d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
20d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#include "code_generator.h"
21d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#include "nodes.h"
2286dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray#include "parallel_move_resolver.h"
23787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray#include "utils/x86/assembler_x86.h"
24d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
25d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffraynamespace art {
26d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffraynamespace x86 {
27d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
28707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffraystatic constexpr size_t kX86WordSize = 4;
29707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffray
3001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffrayclass CodeGeneratorX86;
3101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray
32a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffraystatic constexpr Register kParameterCoreRegisters[] = { ECX, EDX, EBX };
33a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffraystatic constexpr RegisterPair kParameterCorePairRegisters[] = { ECX_EDX, EDX_EBX };
34a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffraystatic constexpr size_t kParameterCoreRegistersLength = arraysize(kParameterCoreRegisters);
35a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
36a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffrayclass InvokeDexCallingConvention : public CallingConvention<Register> {
37a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray public:
38a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  InvokeDexCallingConvention()
39a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray      : CallingConvention(kParameterCoreRegisters, kParameterCoreRegistersLength) {}
40a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
41a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  RegisterPair GetRegisterPairAt(size_t argument_index) {
42a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray    DCHECK_LT(argument_index + 1, GetNumberOfRegisters());
43a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray    return kParameterCorePairRegisters[argument_index];
44a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  }
45a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
46a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray private:
47a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConvention);
48a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray};
49a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
50a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffrayclass InvokeDexCallingConventionVisitor {
51a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray public:
52a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  InvokeDexCallingConventionVisitor() : gp_index_(0) {}
53a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
54a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  Location GetNextLocation(Primitive::Type type);
55a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
56a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray private:
57a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  InvokeDexCallingConvention calling_convention;
58a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  uint32_t gp_index_;
59a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
60a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(InvokeDexCallingConventionVisitor);
61a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray};
62a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray
6386dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffrayclass ParallelMoveResolverX86 : public ParallelMoveResolver {
6486dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray public:
6586dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  ParallelMoveResolverX86(ArenaAllocator* allocator, CodeGeneratorX86* codegen)
6686dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray      : ParallelMoveResolver(allocator), codegen_(codegen) {}
6786dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
6886dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  virtual void EmitMove(size_t index) OVERRIDE;
6986dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  virtual void EmitSwap(size_t index) OVERRIDE;
7086dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  virtual void SpillScratch(int reg) OVERRIDE;
7186dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  virtual void RestoreScratch(int reg) OVERRIDE;
7286dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
7386dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  X86Assembler* GetAssembler() const;
7486dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
7586dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray private:
7686dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  void Exchange(Register reg, int mem);
7786dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  void Exchange(int mem1, int mem2);
7886dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  void MoveMemoryToMemory(int dst, int src);
7986dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
8086dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  CodeGeneratorX86* const codegen_;
8186dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
8286dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(ParallelMoveResolverX86);
8386dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray};
8486dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
85bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffrayclass LocationsBuilderX86 : public HGraphVisitor {
86bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray public:
8701bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  LocationsBuilderX86(HGraph* graph, CodeGeneratorX86* codegen)
8801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray      : HGraphVisitor(graph), codegen_(codegen) {}
89bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
90bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray#define DECLARE_VISIT_INSTRUCTION(name)     \
91bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  virtual void Visit##name(H##name* instr);
92bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
9396f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray  FOR_EACH_CONCRETE_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
94bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
95bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray#undef DECLARE_VISIT_INSTRUCTION
96bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
97bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray private:
9801bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  CodeGeneratorX86* const codegen_;
99a747a392fb5f88d2ecc4c6021edf9f1f6615ba16Nicolas Geoffray  InvokeDexCallingConventionVisitor parameter_visitor_;
10001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray
101bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(LocationsBuilderX86);
102bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray};
103bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
104787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffrayclass InstructionCodeGeneratorX86 : public HGraphVisitor {
105d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray public:
1064a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray  InstructionCodeGeneratorX86(HGraph* graph, CodeGeneratorX86* codegen);
107d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
108d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#define DECLARE_VISIT_INSTRUCTION(name)     \
109d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray  virtual void Visit##name(H##name* instr);
110d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
11196f89a290eb67d7bf4b1636798fa28df14309cc7Nicolas Geoffray  FOR_EACH_CONCRETE_INSTRUCTION(DECLARE_VISIT_INSTRUCTION)
112d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
113d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#undef DECLARE_VISIT_INSTRUCTION
114d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
1158ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray  void LoadCurrentMethod(Register reg);
1168ccc3f5d06fd217cdaabd37e743adab2031d3720Nicolas Geoffray
1174a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray  X86Assembler* GetAssembler() const { return assembler_; }
118787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
119787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray private:
1204a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray  X86Assembler* const assembler_;
1214a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray  CodeGeneratorX86* const codegen_;
122787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
123787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(InstructionCodeGeneratorX86);
124787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray};
125787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
126787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffrayclass CodeGeneratorX86 : public CodeGenerator {
127787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray public:
128a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray  explicit CodeGeneratorX86(HGraph* graph);
129f12feb8e0e857f2832545b3f28d31bad5a9d3903Nicolas Geoffray  virtual ~CodeGeneratorX86() {}
130787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
131bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  virtual void GenerateFrameEntry() OVERRIDE;
132bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  virtual void GenerateFrameExit() OVERRIDE;
133bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  virtual void Bind(Label* label) OVERRIDE;
1344a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray  virtual void Move(HInstruction* instruction, Location location, HInstruction* move_for) OVERRIDE;
135bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
136707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffray  virtual size_t GetWordSize() const OVERRIDE {
137707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffray    return kX86WordSize;
138707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffray  }
139707c809f661554713edfacf338365adca8dfd3a3Nicolas Geoffray
140ab032bc1ff57831106fdac6a91a136293609401fNicolas Geoffray  virtual size_t FrameEntrySpillSize() const OVERRIDE;
141ab032bc1ff57831106fdac6a91a136293609401fNicolas Geoffray
142bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  virtual HGraphVisitor* GetLocationBuilder() OVERRIDE {
143bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray    return &location_builder_;
144bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  }
145bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray
146787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  virtual HGraphVisitor* GetInstructionVisitor() OVERRIDE {
147787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray    return &instruction_visitor_;
148787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  }
149787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
150787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  virtual X86Assembler* GetAssembler() OVERRIDE {
151787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray    return &assembler_;
152787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  }
153787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray
154a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray  virtual size_t GetNumberOfRegisters() const OVERRIDE;
155a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray  virtual void SetupBlockedRegisters(bool* blocked_registers) const OVERRIDE;
156a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray  virtual ManagedRegister AllocateFreeRegister(
157a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray      Primitive::Type type, bool* blocked_registers) const OVERRIDE;
158a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray
159a7aca370a7d62ca04a1e24423d90e8020d6f1a58Nicolas Geoffray  virtual Location GetStackLocation(HLoadLocal* load) const OVERRIDE;
1604a34a428c6a2588e0857ef6baf88f1b73ce65958Nicolas Geoffray
161a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  virtual size_t GetNumberOfCoreRegisters() const OVERRIDE {
162a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray    return kNumberOfCpuRegisters;
163a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  }
164a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray
165a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  virtual size_t GetNumberOfFloatingPointRegisters() const OVERRIDE {
166a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray    return kNumberOfXmmRegisters;
167a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  }
168a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray
169a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  virtual void DumpCoreRegister(std::ostream& stream, int reg) const OVERRIDE;
170a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray  virtual void DumpFloatingPointRegister(std::ostream& stream, int reg) const OVERRIDE;
171a7062e05e6048c7f817d784a5b94e3122e25b1ecNicolas Geoffray
17286dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  ParallelMoveResolverX86* GetMoveResolver() {
17386dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray    return &move_resolver_;
17486dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  }
17586dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray
176412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray  virtual InstructionSet GetInstructionSet() const OVERRIDE {
177412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray    return InstructionSet::kX86;
178412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray  }
179412f10cfed002ab617c78f2621d68446ca4dd8bdNicolas Geoffray
18001bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  // Helper method to move a 32bits value between two locations.
18101bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  void Move32(Location destination, Location source);
18201bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  // Helper method to move a 64bits value between two locations.
18301bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray  void Move64(Location destination, Location source);
18401bc96d007b67fdb7fe349232a83e4b354ce3d08Nicolas Geoffray
1853c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray  // Emit a write barrier.
1863c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray  void MarkGCCard(Register temp, Register card, Register object, Register value);
1873c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray
1883c7bb98698f77af10372cf31824d3bb115d9bf0fNicolas Geoffray private:
189bab4ed7057799a4fadc6283108ab56f389d117d4Nicolas Geoffray  LocationsBuilderX86 location_builder_;
190787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  InstructionCodeGeneratorX86 instruction_visitor_;
19186dbb9a12119273039ce272b41c809fa548b37b6Nicolas Geoffray  ParallelMoveResolverX86 move_resolver_;
192787c3076635cf117eb646c5a89a9014b2072fb44Nicolas Geoffray  X86Assembler assembler_;
193d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
194d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray  DISALLOW_COPY_AND_ASSIGN(CodeGeneratorX86);
195d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray};
196d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
197d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray}  // namespace x86
198d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray}  // namespace art
199d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray
200d4dd255db1d110ceb5551f6d95ff31fb57420994Nicolas Geoffray#endif  // ART_COMPILER_OPTIMIZING_CODE_GENERATOR_X86_H_
201