| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 1 | //===-- X86TargetMachine.cpp - Define TargetMachine for the X86 -----------===// | 
 | 2 | //  | 
| John Criswell | b576c94 | 2003-10-20 19:43:21 +0000 | [diff] [blame] | 3 | //                     The LLVM Compiler Infrastructure | 
 | 4 | // | 
 | 5 | // This file was developed by the LLVM research group and is distributed under | 
 | 6 | // the University of Illinois Open Source License. See LICENSE.TXT for details. | 
 | 7 | //  | 
 | 8 | //===----------------------------------------------------------------------===// | 
 | 9 | //  | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 10 | // This file defines the X86 specific subclass of TargetMachine. | 
 | 11 | // | 
 | 12 | //===----------------------------------------------------------------------===// | 
 | 13 |  | 
 | 14 | #include "X86TargetMachine.h" | 
| Chris Lattner | 5bcd95c | 2002-12-24 00:04:01 +0000 | [diff] [blame] | 15 | #include "X86.h" | 
| Chris Lattner | bb144a8 | 2003-08-24 19:49:48 +0000 | [diff] [blame] | 16 | #include "llvm/Module.h" | 
| Chris Lattner | 155e68f | 2003-04-23 16:24:55 +0000 | [diff] [blame] | 17 | #include "llvm/PassManager.h" | 
| Chris Lattner | 3048373 | 2004-06-20 07:49:54 +0000 | [diff] [blame] | 18 | #include "llvm/CodeGen/IntrinsicLowering.h" | 
| Chris Lattner | 3dffa79 | 2002-10-30 00:47:49 +0000 | [diff] [blame] | 19 | #include "llvm/CodeGen/MachineFunction.h" | 
| Chris Lattner | d91d86f | 2003-01-13 00:51:23 +0000 | [diff] [blame] | 20 | #include "llvm/CodeGen/Passes.h" | 
| Chris Lattner | 0cf0c37 | 2004-07-11 04:17:10 +0000 | [diff] [blame] | 21 | #include "llvm/Target/TargetOptions.h" | 
| Chris Lattner | d36c970 | 2004-07-11 02:48:49 +0000 | [diff] [blame] | 22 | #include "llvm/Target/TargetMachineRegistry.h" | 
| Chris Lattner | 155e68f | 2003-04-23 16:24:55 +0000 | [diff] [blame] | 23 | #include "llvm/Transforms/Scalar.h" | 
| Chris Lattner | 439a27a | 2002-12-16 16:15:51 +0000 | [diff] [blame] | 24 | #include "Support/CommandLine.h" | 
 | 25 | #include "Support/Statistic.h" | 
| Chris Lattner | 1e60a91 | 2003-12-20 01:22:19 +0000 | [diff] [blame] | 26 | using namespace llvm; | 
| Brian Gaeke | d0fde30 | 2003-11-11 22:41:34 +0000 | [diff] [blame] | 27 |  | 
| Chris Lattner | 439a27a | 2002-12-16 16:15:51 +0000 | [diff] [blame] | 28 | namespace { | 
| Chris Lattner | 9b52770 | 2003-12-01 05:18:30 +0000 | [diff] [blame] | 29 |   cl::opt<bool> NoSSAPeephole("disable-ssa-peephole", cl::init(true), | 
| Chris Lattner | 4482715 | 2003-12-28 09:47:19 +0000 | [diff] [blame] | 30 |                         cl::desc("Disable the ssa-based peephole optimizer " | 
 | 31 |                                  "(defaults to disabled)")); | 
| Chris Lattner | f6f263c | 2004-02-09 01:47:10 +0000 | [diff] [blame] | 32 |   cl::opt<bool> DisableOutput("disable-x86-llc-output", cl::Hidden, | 
 | 33 |                               cl::desc("Disable the X86 asm printer, for use " | 
 | 34 |                                        "when profiling the code generator.")); | 
| Chris Lattner | d36c970 | 2004-07-11 02:48:49 +0000 | [diff] [blame] | 35 |  | 
 | 36 |   // Register the target. | 
| Chris Lattner | 71d24aa | 2004-07-11 03:27:42 +0000 | [diff] [blame] | 37 |   RegisterTarget<X86TargetMachine> X("x86", "  IA-32 (Pentium and above)"); | 
| Chris Lattner | 439a27a | 2002-12-16 16:15:51 +0000 | [diff] [blame] | 38 | } | 
 | 39 |  | 
| Chris Lattner | d36c970 | 2004-07-11 02:48:49 +0000 | [diff] [blame] | 40 | unsigned X86TargetMachine::getJITMatchQuality() { | 
 | 41 | #if defined(i386) || defined(__i386__) || defined(__x86__) | 
 | 42 |   return 10; | 
 | 43 | #else | 
 | 44 |   return 0; | 
 | 45 | #endif | 
 | 46 | } | 
 | 47 |  | 
 | 48 | unsigned X86TargetMachine::getModuleMatchQuality(const Module &M) { | 
 | 49 |   if (M.getEndianness()  == Module::LittleEndian && | 
 | 50 |       M.getPointerSize() == Module::Pointer32) | 
 | 51 |     return 10;                                   // Direct match | 
 | 52 |   else if (M.getEndianness() != Module::AnyEndianness || | 
 | 53 |            M.getPointerSize() != Module::AnyPointerSize) | 
 | 54 |     return 0;                                    // Match for some other target | 
 | 55 |  | 
 | 56 |   return getJITMatchQuality()/2; | 
 | 57 | } | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 58 |  | 
 | 59 | /// X86TargetMachine ctor - Create an ILP32 architecture model | 
 | 60 | /// | 
| Chris Lattner | f70e0c2 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 61 | X86TargetMachine::X86TargetMachine(const Module &M, IntrinsicLowering *IL) | 
 | 62 |   : TargetMachine("X86", IL, true, 4, 4, 4, 4, 4), | 
| Chris Lattner | 32305f7 | 2004-06-10 06:19:25 +0000 | [diff] [blame] | 63 |     FrameInfo(TargetFrameInfo::StackGrowsDown, 8/*16 for SSE*/, -4), | 
| Chris Lattner | f70e0c2 | 2003-12-28 21:23:38 +0000 | [diff] [blame] | 64 |     JITInfo(*this) { | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 65 | } | 
 | 66 |  | 
| Chris Lattner | c9bbfbc | 2003-08-05 16:34:44 +0000 | [diff] [blame] | 67 |  | 
 | 68 | // addPassesToEmitAssembly - We currently use all of the same passes as the JIT | 
 | 69 | // does to emit statically compiled machine code. | 
| Brian Gaeke | de3aa4f | 2003-06-18 21:43:21 +0000 | [diff] [blame] | 70 | bool X86TargetMachine::addPassesToEmitAssembly(PassManager &PM, | 
 | 71 | 					       std::ostream &Out) { | 
| Chris Lattner | 99c59e8 | 2004-05-23 21:23:35 +0000 | [diff] [blame] | 72 |   // FIXME: Implement efficient support for garbage collection intrinsics. | 
 | 73 |   PM.add(createLowerGCPass()); | 
 | 74 |  | 
| Chris Lattner | c58c169 | 2003-10-05 19:15:47 +0000 | [diff] [blame] | 75 |   // FIXME: Implement the invoke/unwind instructions! | 
 | 76 |   PM.add(createLowerInvokePass()); | 
 | 77 |  | 
| Chris Lattner | 8712442 | 2004-02-25 19:30:19 +0000 | [diff] [blame] | 78 |   // FIXME: Implement the switch instruction in the instruction selector! | 
 | 79 |   PM.add(createLowerSwitchPass()); | 
 | 80 |  | 
| Chris Lattner | 9a9ca0f | 2004-07-02 05:46:41 +0000 | [diff] [blame] | 81 |   // Make sure that no unreachable blocks are instruction selected. | 
 | 82 |   PM.add(createUnreachableBlockEliminationPass()); | 
 | 83 |  | 
| Chris Lattner | f60b91c | 2004-08-15 23:02:17 +0000 | [diff] [blame^] | 84 |   PM.add(createX86SimpleInstructionSelector(*this)); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 85 |  | 
| Chris Lattner | 9b52770 | 2003-12-01 05:18:30 +0000 | [diff] [blame] | 86 |   // Run optional SSA-based machine code optimizations next... | 
 | 87 |   if (!NoSSAPeephole) | 
 | 88 |     PM.add(createX86SSAPeepholeOptimizerPass()); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 89 |  | 
 | 90 |   // Print the instruction selected machine code... | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 91 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 92 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 93 |  | 
 | 94 |   // Perform register allocation to convert to a concrete x86 representation | 
| Alkis Evlogimenos | 7237ece | 2003-10-02 16:57:49 +0000 | [diff] [blame] | 95 |   PM.add(createRegisterAllocator()); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 96 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 97 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 98 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 99 |  | 
 | 100 |   PM.add(createX86FloatingPointStackifierPass()); | 
 | 101 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 102 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 103 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 104 |  | 
 | 105 |   // Insert prolog/epilog code.  Eliminate abstract frame index references... | 
 | 106 |   PM.add(createPrologEpilogCodeInserter()); | 
 | 107 |  | 
 | 108 |   PM.add(createX86PeepholeOptimizerPass()); | 
 | 109 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 110 |   if (PrintMachineCode)  // Print the register-allocated code | 
| Brian Gaeke | b428654 | 2003-08-13 18:15:52 +0000 | [diff] [blame] | 111 |     PM.add(createX86CodePrinterPass(std::cerr, *this)); | 
 | 112 |  | 
| Chris Lattner | f6f263c | 2004-02-09 01:47:10 +0000 | [diff] [blame] | 113 |   if (!DisableOutput) | 
 | 114 |     PM.add(createX86CodePrinterPass(Out, *this)); | 
| Chris Lattner | 655239c | 2003-12-20 10:20:19 +0000 | [diff] [blame] | 115 |  | 
| Alkis Evlogimenos | c81efdc | 2004-02-15 00:03:15 +0000 | [diff] [blame] | 116 |   // Delete machine code for this function | 
 | 117 |   PM.add(createMachineCodeDeleter()); | 
 | 118 |  | 
| Brian Gaeke | de3aa4f | 2003-06-18 21:43:21 +0000 | [diff] [blame] | 119 |   return false; // success! | 
 | 120 | } | 
 | 121 |  | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 122 | /// addPassesToJITCompile - Add passes to the specified pass manager to | 
 | 123 | /// implement a fast dynamic compiler for this target.  Return true if this is | 
 | 124 | /// not supported for this target. | 
 | 125 | /// | 
| Chris Lattner | 1e60a91 | 2003-12-20 01:22:19 +0000 | [diff] [blame] | 126 | void X86JITInfo::addPassesToJITCompile(FunctionPassManager &PM) { | 
| Chris Lattner | 99c59e8 | 2004-05-23 21:23:35 +0000 | [diff] [blame] | 127 |   // FIXME: Implement efficient support for garbage collection intrinsics. | 
 | 128 |   PM.add(createLowerGCPass()); | 
| Chris Lattner | 155e68f | 2003-04-23 16:24:55 +0000 | [diff] [blame] | 129 |  | 
| Chris Lattner | c58c169 | 2003-10-05 19:15:47 +0000 | [diff] [blame] | 130 |   // FIXME: Implement the invoke/unwind instructions! | 
 | 131 |   PM.add(createLowerInvokePass()); | 
 | 132 |  | 
| Chris Lattner | 8712442 | 2004-02-25 19:30:19 +0000 | [diff] [blame] | 133 |   // FIXME: Implement the switch instruction in the instruction selector! | 
 | 134 |   PM.add(createLowerSwitchPass()); | 
 | 135 |  | 
| Chris Lattner | 9a9ca0f | 2004-07-02 05:46:41 +0000 | [diff] [blame] | 136 |   // Make sure that no unreachable blocks are instruction selected. | 
 | 137 |   PM.add(createUnreachableBlockEliminationPass()); | 
 | 138 |  | 
| Chris Lattner | f60b91c | 2004-08-15 23:02:17 +0000 | [diff] [blame^] | 139 |   PM.add(createX86SimpleInstructionSelector(TM)); | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 140 |  | 
| Chris Lattner | 9b52770 | 2003-12-01 05:18:30 +0000 | [diff] [blame] | 141 |   // Run optional SSA-based machine code optimizations next... | 
 | 142 |   if (!NoSSAPeephole) | 
 | 143 |     PM.add(createX86SSAPeepholeOptimizerPass()); | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 144 |  | 
| Chris Lattner | d91d86f | 2003-01-13 00:51:23 +0000 | [diff] [blame] | 145 |   // FIXME: Add SSA based peephole optimizer here. | 
 | 146 |  | 
| Chris Lattner | 3dffa79 | 2002-10-30 00:47:49 +0000 | [diff] [blame] | 147 |   // Print the instruction selected machine code... | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 148 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 149 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Chris Lattner | 3dffa79 | 2002-10-30 00:47:49 +0000 | [diff] [blame] | 150 |  | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 151 |   // Perform register allocation to convert to a concrete x86 representation | 
| Alkis Evlogimenos | 7237ece | 2003-10-02 16:57:49 +0000 | [diff] [blame] | 152 |   PM.add(createRegisterAllocator()); | 
| Chris Lattner | d282cfe | 2002-12-28 20:33:32 +0000 | [diff] [blame] | 153 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 154 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 155 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Chris Lattner | d282cfe | 2002-12-28 20:33:32 +0000 | [diff] [blame] | 156 |  | 
| Chris Lattner | d91d86f | 2003-01-13 00:51:23 +0000 | [diff] [blame] | 157 |   PM.add(createX86FloatingPointStackifierPass()); | 
 | 158 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 159 |   if (PrintMachineCode) | 
| Brian Gaeke | 74ceb29 | 2004-02-04 21:41:01 +0000 | [diff] [blame] | 160 |     PM.add(createMachineFunctionPrinterPass(&std::cerr)); | 
| Chris Lattner | d91d86f | 2003-01-13 00:51:23 +0000 | [diff] [blame] | 161 |  | 
| Chris Lattner | d282cfe | 2002-12-28 20:33:32 +0000 | [diff] [blame] | 162 |   // Insert prolog/epilog code.  Eliminate abstract frame index references... | 
 | 163 |   PM.add(createPrologEpilogCodeInserter()); | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 164 |  | 
| Chris Lattner | d91d86f | 2003-01-13 00:51:23 +0000 | [diff] [blame] | 165 |   PM.add(createX86PeepholeOptimizerPass()); | 
 | 166 |  | 
| Brian Gaeke | 323819e | 2004-03-04 19:16:23 +0000 | [diff] [blame] | 167 |   if (PrintMachineCode)  // Print the register-allocated code | 
| Chris Lattner | 1e60a91 | 2003-12-20 01:22:19 +0000 | [diff] [blame] | 168 |     PM.add(createX86CodePrinterPass(std::cerr, TM)); | 
| Chris Lattner | b4f68ed | 2002-10-29 22:37:54 +0000 | [diff] [blame] | 169 | } | 
 | 170 |  |