1*0b57cec5SDimitry Andric//===-- ARMScheduleV6.td - ARM v6 Scheduling Definitions ---*- tablegen -*-===// 2*0b57cec5SDimitry Andric// 3*0b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4*0b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 5*0b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6*0b57cec5SDimitry Andric// 7*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8*0b57cec5SDimitry Andric// 9*0b57cec5SDimitry Andric// This file defines the itinerary class data for the ARM v6 processors. 10*0b57cec5SDimitry Andric// 11*0b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12*0b57cec5SDimitry Andric 13*0b57cec5SDimitry Andric// Model based on ARM1176 14*0b57cec5SDimitry Andric// 15*0b57cec5SDimitry Andric// Functional Units 16*0b57cec5SDimitry Andricdef V6_Pipe : FuncUnit; // pipeline 17*0b57cec5SDimitry Andric 18*0b57cec5SDimitry Andric// Scheduling information derived from "ARM1176JZF-S Technical Reference Manual" 19*0b57cec5SDimitry Andric// 20*0b57cec5SDimitry Andricdef ARMV6Itineraries : ProcessorItineraries< 21*0b57cec5SDimitry Andric [V6_Pipe], [], [ 22*0b57cec5SDimitry Andric // 23*0b57cec5SDimitry Andric // No operand cycles 24*0b57cec5SDimitry Andric InstrItinData<IIC_iALUx , [InstrStage<1, [V6_Pipe]>]>, 25*0b57cec5SDimitry Andric // 26*0b57cec5SDimitry Andric // Binary Instructions that produce a result 27*0b57cec5SDimitry Andric InstrItinData<IIC_iALUi , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 28*0b57cec5SDimitry Andric InstrItinData<IIC_iALUr , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>, 29*0b57cec5SDimitry Andric InstrItinData<IIC_iALUsi , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>, 30*0b57cec5SDimitry Andric InstrItinData<IIC_iALUsr , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>, 31*0b57cec5SDimitry Andric // 32*0b57cec5SDimitry Andric // Bitwise Instructions that produce a result 33*0b57cec5SDimitry Andric InstrItinData<IIC_iBITi , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 34*0b57cec5SDimitry Andric InstrItinData<IIC_iBITr , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>, 35*0b57cec5SDimitry Andric InstrItinData<IIC_iBITsi , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>, 36*0b57cec5SDimitry Andric InstrItinData<IIC_iBITsr , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>, 37*0b57cec5SDimitry Andric // 38*0b57cec5SDimitry Andric // Unary Instructions that produce a result 39*0b57cec5SDimitry Andric InstrItinData<IIC_iUNAr , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 40*0b57cec5SDimitry Andric InstrItinData<IIC_iUNAsi , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 41*0b57cec5SDimitry Andric // 42*0b57cec5SDimitry Andric // Zero and sign extension instructions 43*0b57cec5SDimitry Andric InstrItinData<IIC_iEXTr , [InstrStage<1, [V6_Pipe]>], [1, 1]>, 44*0b57cec5SDimitry Andric InstrItinData<IIC_iEXTAr , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>, 45*0b57cec5SDimitry Andric InstrItinData<IIC_iEXTAsr , [InstrStage<2, [V6_Pipe]>], [3, 3, 2, 1]>, 46*0b57cec5SDimitry Andric // 47*0b57cec5SDimitry Andric // Compare instructions 48*0b57cec5SDimitry Andric InstrItinData<IIC_iCMPi , [InstrStage<1, [V6_Pipe]>], [2]>, 49*0b57cec5SDimitry Andric InstrItinData<IIC_iCMPr , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 50*0b57cec5SDimitry Andric InstrItinData<IIC_iCMPsi , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 51*0b57cec5SDimitry Andric InstrItinData<IIC_iCMPsr , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>, 52*0b57cec5SDimitry Andric // 53*0b57cec5SDimitry Andric // Test instructions 54*0b57cec5SDimitry Andric InstrItinData<IIC_iTSTi , [InstrStage<1, [V6_Pipe]>], [2]>, 55*0b57cec5SDimitry Andric InstrItinData<IIC_iTSTr , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 56*0b57cec5SDimitry Andric InstrItinData<IIC_iTSTsi , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 57*0b57cec5SDimitry Andric InstrItinData<IIC_iTSTsr , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>, 58*0b57cec5SDimitry Andric // 59*0b57cec5SDimitry Andric // Move instructions, unconditional 60*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVi , [InstrStage<1, [V6_Pipe]>], [2]>, 61*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVr , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 62*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVsi , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 63*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVsr , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>, 64*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVix2 , [InstrStage<1, [V6_Pipe]>, 65*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [2]>, 66*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVix2addpc,[InstrStage<1, [V6_Pipe]>, 67*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>, 68*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [3]>, 69*0b57cec5SDimitry Andric InstrItinData<IIC_iMOVix2ld , [InstrStage<1, [V6_Pipe]>, 70*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>, 71*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [5]>, 72*0b57cec5SDimitry Andric // 73*0b57cec5SDimitry Andric // Move instructions, conditional 74*0b57cec5SDimitry Andric InstrItinData<IIC_iCMOVi , [InstrStage<1, [V6_Pipe]>], [3]>, 75*0b57cec5SDimitry Andric InstrItinData<IIC_iCMOVr , [InstrStage<1, [V6_Pipe]>], [3, 2]>, 76*0b57cec5SDimitry Andric InstrItinData<IIC_iCMOVsi , [InstrStage<1, [V6_Pipe]>], [3, 1]>, 77*0b57cec5SDimitry Andric InstrItinData<IIC_iCMOVsr , [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>, 78*0b57cec5SDimitry Andric InstrItinData<IIC_iCMOVix2 , [InstrStage<1, [V6_Pipe]>, 79*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [4]>, 80*0b57cec5SDimitry Andric // 81*0b57cec5SDimitry Andric // MVN instructions 82*0b57cec5SDimitry Andric InstrItinData<IIC_iMVNi , [InstrStage<1, [V6_Pipe]>], [2]>, 83*0b57cec5SDimitry Andric InstrItinData<IIC_iMVNr , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 84*0b57cec5SDimitry Andric InstrItinData<IIC_iMVNsi , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 85*0b57cec5SDimitry Andric InstrItinData<IIC_iMVNsr , [InstrStage<2, [V6_Pipe]>], [3, 2, 1]>, 86*0b57cec5SDimitry Andric 87*0b57cec5SDimitry Andric // Integer multiply pipeline 88*0b57cec5SDimitry Andric // 89*0b57cec5SDimitry Andric InstrItinData<IIC_iMUL16 , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>, 90*0b57cec5SDimitry Andric InstrItinData<IIC_iMAC16 , [InstrStage<1, [V6_Pipe]>], [4, 1, 1, 2]>, 91*0b57cec5SDimitry Andric InstrItinData<IIC_iMUL32 , [InstrStage<2, [V6_Pipe]>], [5, 1, 1]>, 92*0b57cec5SDimitry Andric InstrItinData<IIC_iMAC32 , [InstrStage<2, [V6_Pipe]>], [5, 1, 1, 2]>, 93*0b57cec5SDimitry Andric InstrItinData<IIC_iMUL64 , [InstrStage<3, [V6_Pipe]>], [6, 1, 1]>, 94*0b57cec5SDimitry Andric InstrItinData<IIC_iMAC64 , [InstrStage<3, [V6_Pipe]>], [6, 1, 1, 2]>, 95*0b57cec5SDimitry Andric 96*0b57cec5SDimitry Andric // Integer load pipeline 97*0b57cec5SDimitry Andric // 98*0b57cec5SDimitry Andric // Immediate offset 99*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_i , [InstrStage<1, [V6_Pipe]>], [4, 1]>, 100*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_i, [InstrStage<1, [V6_Pipe]>], [4, 1]>, 101*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_d_i , [InstrStage<1, [V6_Pipe]>], [4, 1]>, 102*0b57cec5SDimitry Andric // 103*0b57cec5SDimitry Andric // Register offset 104*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_r , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>, 105*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_r, [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>, 106*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_d_r , [InstrStage<1, [V6_Pipe]>], [4, 1, 1]>, 107*0b57cec5SDimitry Andric // 108*0b57cec5SDimitry Andric // Scaled register offset, issues over 2 cycles 109*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_si , [InstrStage<2, [V6_Pipe]>], [5, 2, 1]>, 110*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_si, [InstrStage<2, [V6_Pipe]>], [5, 2, 1]>, 111*0b57cec5SDimitry Andric // 112*0b57cec5SDimitry Andric // Immediate offset with update 113*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_iu , [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>, 114*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_iu, [InstrStage<1, [V6_Pipe]>], [4, 2, 1]>, 115*0b57cec5SDimitry Andric // 116*0b57cec5SDimitry Andric // Register offset with update 117*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_ru , [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>, 118*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_ru, [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>, 119*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_d_ru , [InstrStage<1, [V6_Pipe]>], [4, 2, 1, 1]>, 120*0b57cec5SDimitry Andric // 121*0b57cec5SDimitry Andric // Scaled register offset with update, issues over 2 cycles 122*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_siu, [InstrStage<2, [V6_Pipe]>], [5, 2, 2, 1]>, 123*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_bh_siu,[InstrStage<2, [V6_Pipe]>], [5, 2, 2, 1]>, 124*0b57cec5SDimitry Andric 125*0b57cec5SDimitry Andric // 126*0b57cec5SDimitry Andric // Load multiple, def is the 5th operand. 127*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_m , [InstrStage<3, [V6_Pipe]>], [1, 1, 1, 1, 4]>, 128*0b57cec5SDimitry Andric // 129*0b57cec5SDimitry Andric // Load multiple + update, defs are the 1st and 5th operands. 130*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_mu , [InstrStage<3, [V6_Pipe]>], [2, 1, 1, 1, 4]>, 131*0b57cec5SDimitry Andric // 132*0b57cec5SDimitry Andric // Load multiple plus branch 133*0b57cec5SDimitry Andric InstrItinData<IIC_iLoad_mBr, [InstrStage<3, [V6_Pipe]>, 134*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [1, 2, 1, 1, 4]>, 135*0b57cec5SDimitry Andric 136*0b57cec5SDimitry Andric // 137*0b57cec5SDimitry Andric // iLoadi + iALUr for t2LDRpci_pic. 138*0b57cec5SDimitry Andric InstrItinData<IIC_iLoadiALU, [InstrStage<1, [V6_Pipe]>, 139*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [3, 1]>, 140*0b57cec5SDimitry Andric 141*0b57cec5SDimitry Andric // 142*0b57cec5SDimitry Andric // Pop, def is the 3rd operand. 143*0b57cec5SDimitry Andric InstrItinData<IIC_iPop , [InstrStage<3, [V6_Pipe]>], [1, 1, 4]>, 144*0b57cec5SDimitry Andric // 145*0b57cec5SDimitry Andric // Pop + branch, def is the 3rd operand. 146*0b57cec5SDimitry Andric InstrItinData<IIC_iPop_Br, [InstrStage<3, [V6_Pipe]>, 147*0b57cec5SDimitry Andric InstrStage<1, [V6_Pipe]>], [1, 2, 4]>, 148*0b57cec5SDimitry Andric 149*0b57cec5SDimitry Andric // Integer store pipeline 150*0b57cec5SDimitry Andric // 151*0b57cec5SDimitry Andric // Immediate offset 152*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_i , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 153*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_i, [InstrStage<1, [V6_Pipe]>], [2, 1]>, 154*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_d_i , [InstrStage<1, [V6_Pipe]>], [2, 1]>, 155*0b57cec5SDimitry Andric // 156*0b57cec5SDimitry Andric // Register offset 157*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_r , [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>, 158*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_r, [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>, 159*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_d_r , [InstrStage<1, [V6_Pipe]>], [2, 1, 1]>, 160*0b57cec5SDimitry Andric // 161*0b57cec5SDimitry Andric // Scaled register offset, issues over 2 cycles 162*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_si , [InstrStage<2, [V6_Pipe]>], [2, 2, 1]>, 163*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_si, [InstrStage<2, [V6_Pipe]>], [2, 2, 1]>, 164*0b57cec5SDimitry Andric // 165*0b57cec5SDimitry Andric // Immediate offset with update 166*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_iu , [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>, 167*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_iu, [InstrStage<1, [V6_Pipe]>], [2, 2, 1]>, 168*0b57cec5SDimitry Andric // 169*0b57cec5SDimitry Andric // Register offset with update 170*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_ru, [InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>, 171*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_ru,[InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>, 172*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_d_ru, [InstrStage<1, [V6_Pipe]>], [2, 2, 1, 1]>, 173*0b57cec5SDimitry Andric // 174*0b57cec5SDimitry Andric // Scaled register offset with update, issues over 2 cycles 175*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_siu, [InstrStage<2, [V6_Pipe]>], [2, 2, 2, 1]>, 176*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_bh_siu,[InstrStage<2, [V6_Pipe]>], [2, 2, 2, 1]>, 177*0b57cec5SDimitry Andric // 178*0b57cec5SDimitry Andric // Store multiple 179*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_m , [InstrStage<3, [V6_Pipe]>]>, 180*0b57cec5SDimitry Andric // 181*0b57cec5SDimitry Andric // Store multiple + update 182*0b57cec5SDimitry Andric InstrItinData<IIC_iStore_mu , [InstrStage<3, [V6_Pipe]>], [2]>, 183*0b57cec5SDimitry Andric 184*0b57cec5SDimitry Andric // Branch 185*0b57cec5SDimitry Andric // 186*0b57cec5SDimitry Andric // no delay slots, so the latency of a branch is unimportant 187*0b57cec5SDimitry Andric InstrItinData<IIC_Br , [InstrStage<1, [V6_Pipe]>]>, 188*0b57cec5SDimitry Andric 189*0b57cec5SDimitry Andric // VFP 190*0b57cec5SDimitry Andric // Issue through integer pipeline, and execute in NEON unit. We assume 191*0b57cec5SDimitry Andric // RunFast mode so that NFP pipeline is used for single-precision when 192*0b57cec5SDimitry Andric // possible. 193*0b57cec5SDimitry Andric // 194*0b57cec5SDimitry Andric // FP Special Register to Integer Register File Move 195*0b57cec5SDimitry Andric InstrItinData<IIC_fpSTAT , [InstrStage<1, [V6_Pipe]>], [3]>, 196*0b57cec5SDimitry Andric // 197*0b57cec5SDimitry Andric // Single-precision FP Unary 198*0b57cec5SDimitry Andric InstrItinData<IIC_fpUNA32 , [InstrStage<1, [V6_Pipe]>], [5, 2]>, 199*0b57cec5SDimitry Andric // 200*0b57cec5SDimitry Andric // Double-precision FP Unary 201*0b57cec5SDimitry Andric InstrItinData<IIC_fpUNA64 , [InstrStage<1, [V6_Pipe]>], [5, 2]>, 202*0b57cec5SDimitry Andric // 203*0b57cec5SDimitry Andric // Single-precision FP Compare 204*0b57cec5SDimitry Andric InstrItinData<IIC_fpCMP32 , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 205*0b57cec5SDimitry Andric // 206*0b57cec5SDimitry Andric // Double-precision FP Compare 207*0b57cec5SDimitry Andric InstrItinData<IIC_fpCMP64 , [InstrStage<1, [V6_Pipe]>], [2, 2]>, 208*0b57cec5SDimitry Andric // 209*0b57cec5SDimitry Andric // Single to Double FP Convert 210*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTSD , [InstrStage<1, [V6_Pipe]>], [5, 2]>, 211*0b57cec5SDimitry Andric // 212*0b57cec5SDimitry Andric // Double to Single FP Convert 213*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTDS , [InstrStage<1, [V6_Pipe]>], [5, 2]>, 214*0b57cec5SDimitry Andric // 215*0b57cec5SDimitry Andric // Single-Precision FP to Integer Convert 216*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTSI , [InstrStage<1, [V6_Pipe]>], [9, 2]>, 217*0b57cec5SDimitry Andric // 218*0b57cec5SDimitry Andric // Double-Precision FP to Integer Convert 219*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTDI , [InstrStage<1, [V6_Pipe]>], [9, 2]>, 220*0b57cec5SDimitry Andric // 221*0b57cec5SDimitry Andric // Integer to Single-Precision FP Convert 222*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTIS , [InstrStage<1, [V6_Pipe]>], [9, 2]>, 223*0b57cec5SDimitry Andric // 224*0b57cec5SDimitry Andric // Integer to Double-Precision FP Convert 225*0b57cec5SDimitry Andric InstrItinData<IIC_fpCVTID , [InstrStage<1, [V6_Pipe]>], [9, 2]>, 226*0b57cec5SDimitry Andric // 227*0b57cec5SDimitry Andric // Single-precision FP ALU 228*0b57cec5SDimitry Andric InstrItinData<IIC_fpALU32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>, 229*0b57cec5SDimitry Andric // 230*0b57cec5SDimitry Andric // Double-precision FP ALU 231*0b57cec5SDimitry Andric InstrItinData<IIC_fpALU64 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>, 232*0b57cec5SDimitry Andric // 233*0b57cec5SDimitry Andric // Single-precision FP Multiply 234*0b57cec5SDimitry Andric InstrItinData<IIC_fpMUL32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2]>, 235*0b57cec5SDimitry Andric // 236*0b57cec5SDimitry Andric // Double-precision FP Multiply 237*0b57cec5SDimitry Andric InstrItinData<IIC_fpMUL64 , [InstrStage<2, [V6_Pipe]>], [9, 2, 2]>, 238*0b57cec5SDimitry Andric // 239*0b57cec5SDimitry Andric // Single-precision FP MAC 240*0b57cec5SDimitry Andric InstrItinData<IIC_fpMAC32 , [InstrStage<1, [V6_Pipe]>], [9, 2, 2, 2]>, 241*0b57cec5SDimitry Andric // 242*0b57cec5SDimitry Andric // Double-precision FP MAC 243*0b57cec5SDimitry Andric InstrItinData<IIC_fpMAC64 , [InstrStage<2, [V6_Pipe]>], [9, 2, 2, 2]>, 244*0b57cec5SDimitry Andric // 245*0b57cec5SDimitry Andric // Single-precision Fused FP MAC 246*0b57cec5SDimitry Andric InstrItinData<IIC_fpFMAC32, [InstrStage<1, [V6_Pipe]>], [9, 2, 2, 2]>, 247*0b57cec5SDimitry Andric // 248*0b57cec5SDimitry Andric // Double-precision Fused FP MAC 249*0b57cec5SDimitry Andric InstrItinData<IIC_fpFMAC64, [InstrStage<2, [V6_Pipe]>], [9, 2, 2, 2]>, 250*0b57cec5SDimitry Andric // 251*0b57cec5SDimitry Andric // Single-precision FP DIV 252*0b57cec5SDimitry Andric InstrItinData<IIC_fpDIV32 , [InstrStage<15, [V6_Pipe]>], [20, 2, 2]>, 253*0b57cec5SDimitry Andric // 254*0b57cec5SDimitry Andric // Double-precision FP DIV 255*0b57cec5SDimitry Andric InstrItinData<IIC_fpDIV64 , [InstrStage<29, [V6_Pipe]>], [34, 2, 2]>, 256*0b57cec5SDimitry Andric // 257*0b57cec5SDimitry Andric // Single-precision FP SQRT 258*0b57cec5SDimitry Andric InstrItinData<IIC_fpSQRT32 , [InstrStage<15, [V6_Pipe]>], [20, 2, 2]>, 259*0b57cec5SDimitry Andric // 260*0b57cec5SDimitry Andric // Double-precision FP SQRT 261*0b57cec5SDimitry Andric InstrItinData<IIC_fpSQRT64 , [InstrStage<29, [V6_Pipe]>], [34, 2, 2]>, 262*0b57cec5SDimitry Andric // 263*0b57cec5SDimitry Andric // Integer to Single-precision Move 264*0b57cec5SDimitry Andric InstrItinData<IIC_fpMOVIS, [InstrStage<1, [V6_Pipe]>], [10, 1]>, 265*0b57cec5SDimitry Andric // 266*0b57cec5SDimitry Andric // Integer to Double-precision Move 267*0b57cec5SDimitry Andric InstrItinData<IIC_fpMOVID, [InstrStage<1, [V6_Pipe]>], [10, 1, 1]>, 268*0b57cec5SDimitry Andric // 269*0b57cec5SDimitry Andric // Single-precision to Integer Move 270*0b57cec5SDimitry Andric InstrItinData<IIC_fpMOVSI, [InstrStage<1, [V6_Pipe]>], [10, 1]>, 271*0b57cec5SDimitry Andric // 272*0b57cec5SDimitry Andric // Double-precision to Integer Move 273*0b57cec5SDimitry Andric InstrItinData<IIC_fpMOVDI, [InstrStage<1, [V6_Pipe]>], [10, 10, 1]>, 274*0b57cec5SDimitry Andric // 275*0b57cec5SDimitry Andric // Single-precision FP Load 276*0b57cec5SDimitry Andric InstrItinData<IIC_fpLoad32 , [InstrStage<1, [V6_Pipe]>], [5, 2, 2]>, 277*0b57cec5SDimitry Andric // 278*0b57cec5SDimitry Andric // Double-precision FP Load 279*0b57cec5SDimitry Andric InstrItinData<IIC_fpLoad64 , [InstrStage<1, [V6_Pipe]>], [5, 2, 2]>, 280*0b57cec5SDimitry Andric // 281*0b57cec5SDimitry Andric // FP Load Multiple 282*0b57cec5SDimitry Andric InstrItinData<IIC_fpLoad_m , [InstrStage<3, [V6_Pipe]>], [2, 1, 1, 5]>, 283*0b57cec5SDimitry Andric // 284*0b57cec5SDimitry Andric // FP Load Multiple + update 285*0b57cec5SDimitry Andric InstrItinData<IIC_fpLoad_mu, [InstrStage<3, [V6_Pipe]>], [3, 2, 1, 1, 5]>, 286*0b57cec5SDimitry Andric // 287*0b57cec5SDimitry Andric // Single-precision FP Store 288*0b57cec5SDimitry Andric InstrItinData<IIC_fpStore32 , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>, 289*0b57cec5SDimitry Andric // 290*0b57cec5SDimitry Andric // Double-precision FP Store 291*0b57cec5SDimitry Andric // use FU_Issue to enforce the 1 load/store per cycle limit 292*0b57cec5SDimitry Andric InstrItinData<IIC_fpStore64 , [InstrStage<1, [V6_Pipe]>], [2, 2, 2]>, 293*0b57cec5SDimitry Andric // 294*0b57cec5SDimitry Andric // FP Store Multiple 295*0b57cec5SDimitry Andric InstrItinData<IIC_fpStore_m, [InstrStage<3, [V6_Pipe]>], [2, 2, 2, 2]>, 296*0b57cec5SDimitry Andric // 297*0b57cec5SDimitry Andric // FP Store Multiple + update 298*0b57cec5SDimitry Andric InstrItinData<IIC_fpStore_mu,[InstrStage<3, [V6_Pipe]>], [3, 2, 2, 2, 2]> 299*0b57cec5SDimitry Andric]>; 300