//===- X86ScheduleAtom.td - X86 Atom Scheduling Definitions -*- tablegen -*-==// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // This file defines the itinerary class data for the Intel Atom // in order (Saltwell-32nm/Bonnell-45nm) processors. // //===----------------------------------------------------------------------===// // // Scheduling information derived from the "Intel 64 and IA32 Architectures // Optimization Reference Manual", Chapter 13, Section 4. // Functional Units // Port 0 def Port0 : FuncUnit; // ALU: ALU0, shift/rotate, load/store // SIMD/FP: SIMD ALU, Shuffle,SIMD/FP multiply, divide def Port1 : FuncUnit; // ALU: ALU1, bit processing, jump, and LEA // SIMD/FP: SIMD ALU, FP Adder def AtomItineraries : ProcessorItineraries< [ Port0, Port1 ], [], [ // P0 only // InstrItinData] >, // P0 or P1 // InstrItinData] >, // P0 and P1 // InstrItinData, InstrStage] >, // // Default is 1 cycle, port0 or port1 InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // mul InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // imul by al, ax, eax, rax InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // imul reg by reg|mem InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // imul reg = reg/mem * imm InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // idiv InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // div InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // neg/not/inc/dec InstrItinData] >, InstrItinData] >, // add/sub/and/or/xor/cmp/test InstrItinData] >, InstrItinData] >, // adc/sbc InstrItinData] >, InstrItinData] >, // shift/rotate InstrItinData] >, // shift double InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // cmov InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // set InstrItinData] >, InstrItinData] >, // jcc InstrItinData] >, // jcxz/jecxz/jrcxz InstrItinData] >, // jmp rel InstrItinData] >, // jmp indirect InstrItinData] >, InstrItinData] >, // jmp far InstrItinData] >, InstrItinData] >, // loop/loope/loopne InstrItinData] >, InstrItinData] >, InstrItinData] >, // call - all but reg/imm InstrItinData, InstrStage<1, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, //ret InstrItinData] >, InstrItinData, InstrStage<1, [Port1]>] >, //sign extension movs InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, //zero extension movs InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // SSE binary operations // arithmetic fp scalar InstrItinData] >, InstrItinData, InstrStage<5, [Port1]>] >, InstrItinData] >, InstrItinData, InstrStage<5, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // arithmetic fp parallel InstrItinData] >, InstrItinData, InstrStage<5, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // bitwise parallel InstrItinData] >, InstrItinData] >, // arithmetic int parallel InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // multiply int parallel InstrItinData] >, InstrItinData] >, // shift parallel InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // conversions // to/from PD ... InstrItinData] >, InstrItinData] >, // to/from PS except to/from PD and PS2PI InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // MMX MOVs InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // other MMX InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // conversions // from/to PD InstrItinData] >, InstrItinData] >, // from/to PI InstrItinData] >, InstrItinData, InstrStage<5, [Port1]>]>, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData, InstrStage<5, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData, InstrStage<1, [Port1]>] >, // System instructions InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // worst case for mov REG_CRx InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // LAR InstrItinData] >, InstrItinData] >, // LSL InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, // push control register, segment registers InstrItinData] >, InstrItinData] >, // pop control register, segment registers InstrItinData] >, InstrItinData] >, // VERR, VERW InstrItinData] >, InstrItinData] >, InstrItinData] >, // WRMSR, RDMSR InstrItinData] >, InstrItinData] >, InstrItinData] >, // SMSW, LMSW InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData, InstrStage<1, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData, InstrStage<1, [Port1]>] >, InstrItinData] >, InstrItinData, InstrStage<1, [Port1]>] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] >, InstrItinData] > ]>; // Atom machine model. def AtomModel : SchedMachineModel { let IssueWidth = 2; // Allows 2 instructions per scheduling group. let MicroOpBufferSize = 0; // In-order execution, always hide latency. let LoadLatency = 3; // Expected cycles, may be overriden by OperandCycles. let HighLatency = 30;// Expected, may be overriden by OperandCycles. // On the Atom, the throughput for taken branches is 2 cycles. For small // simple loops, expand by a small factor to hide the backedge cost. let LoopMicroOpBufferSize = 10; let Itineraries = AtomItineraries; }