1*9880d681SAndroid Build Coastguard Worker//=- AArch64SchedVulcan.td - Vulcan Scheduling Defs ----------*- tablegen -*-=// 2*9880d681SAndroid Build Coastguard Worker// 3*9880d681SAndroid Build Coastguard Worker// The LLVM Compiler Infrastructure 4*9880d681SAndroid Build Coastguard Worker// 5*9880d681SAndroid Build Coastguard Worker// This file is distributed under the University of Illinois Open Source 6*9880d681SAndroid Build Coastguard Worker// License. See LICENSE.TXT for details. 7*9880d681SAndroid Build Coastguard Worker// 8*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 9*9880d681SAndroid Build Coastguard Worker// 1. Introduction 10*9880d681SAndroid Build Coastguard Worker// 11*9880d681SAndroid Build Coastguard Worker// This file defines the machine model for Broadcom Vulcan to support 12*9880d681SAndroid Build Coastguard Worker// instruction scheduling and other instruction cost heuristics. 13*9880d681SAndroid Build Coastguard Worker// 14*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 15*9880d681SAndroid Build Coastguard Worker 16*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 17*9880d681SAndroid Build Coastguard Worker// 2. Pipeline Description. 18*9880d681SAndroid Build Coastguard Worker 19*9880d681SAndroid Build Coastguard Workerdef VulcanModel : SchedMachineModel { 20*9880d681SAndroid Build Coastguard Worker let IssueWidth = 4; // 4 micro-ops dispatched at a time. 21*9880d681SAndroid Build Coastguard Worker let MicroOpBufferSize = 180; // 180 entries in micro-op re-order buffer. 22*9880d681SAndroid Build Coastguard Worker let LoadLatency = 4; // Optimistic load latency. 23*9880d681SAndroid Build Coastguard Worker let MispredictPenalty = 12; // Extra cycles for mispredicted branch. 24*9880d681SAndroid Build Coastguard Worker // Determined via a mix of micro-arch details and experimentation. 25*9880d681SAndroid Build Coastguard Worker let LoopMicroOpBufferSize = 32; 26*9880d681SAndroid Build Coastguard Worker let PostRAScheduler = 1; // Using PostRA sched. 27*9880d681SAndroid Build Coastguard Worker let CompleteModel = 1; 28*9880d681SAndroid Build Coastguard Worker} 29*9880d681SAndroid Build Coastguard Worker 30*9880d681SAndroid Build Coastguard Worker// Define the issue ports. 31*9880d681SAndroid Build Coastguard Worker 32*9880d681SAndroid Build Coastguard Worker// Port 0: ALU, FP/SIMD. 33*9880d681SAndroid Build Coastguard Workerdef VulcanP0 : ProcResource<1>; 34*9880d681SAndroid Build Coastguard Worker 35*9880d681SAndroid Build Coastguard Worker// Port 1: ALU, FP/SIMD, integer mul/div. 36*9880d681SAndroid Build Coastguard Workerdef VulcanP1 : ProcResource<1>; 37*9880d681SAndroid Build Coastguard Worker 38*9880d681SAndroid Build Coastguard Worker// Port 2: ALU, Branch. 39*9880d681SAndroid Build Coastguard Workerdef VulcanP2 : ProcResource<1>; 40*9880d681SAndroid Build Coastguard Worker 41*9880d681SAndroid Build Coastguard Worker// Port 3: Store data. 42*9880d681SAndroid Build Coastguard Workerdef VulcanP3 : ProcResource<1>; 43*9880d681SAndroid Build Coastguard Worker 44*9880d681SAndroid Build Coastguard Worker// Port 4: Load/store. 45*9880d681SAndroid Build Coastguard Workerdef VulcanP4 : ProcResource<1>; 46*9880d681SAndroid Build Coastguard Worker 47*9880d681SAndroid Build Coastguard Worker// Port 5: Load/store. 48*9880d681SAndroid Build Coastguard Workerdef VulcanP5 : ProcResource<1>; 49*9880d681SAndroid Build Coastguard Worker 50*9880d681SAndroid Build Coastguard Workerlet SchedModel = VulcanModel in { 51*9880d681SAndroid Build Coastguard Worker 52*9880d681SAndroid Build Coastguard Worker// Define groups for the functional units on each 53*9880d681SAndroid Build Coastguard Worker// issue port. Each group created will be used 54*9880d681SAndroid Build Coastguard Worker// by a WriteRes later on. 55*9880d681SAndroid Build Coastguard Worker// 56*9880d681SAndroid Build Coastguard Worker// NOTE: Some groups only contain one member. This 57*9880d681SAndroid Build Coastguard Worker// is a way to create names for the various functional 58*9880d681SAndroid Build Coastguard Worker// units that share a single issue port. For example, 59*9880d681SAndroid Build Coastguard Worker// "VulcanI1" for ALU ops on port 1 and "VulcanF1" for 60*9880d681SAndroid Build Coastguard Worker// FP ops on port 1. 61*9880d681SAndroid Build Coastguard Worker 62*9880d681SAndroid Build Coastguard Worker// Integer divide and multiply micro-ops only on port 1. 63*9880d681SAndroid Build Coastguard Workerdef VulcanI1 : ProcResGroup<[VulcanP1]>; 64*9880d681SAndroid Build Coastguard Worker 65*9880d681SAndroid Build Coastguard Worker// Branch micro-ops only on port 2. 66*9880d681SAndroid Build Coastguard Workerdef VulcanI2 : ProcResGroup<[VulcanP2]>; 67*9880d681SAndroid Build Coastguard Worker 68*9880d681SAndroid Build Coastguard Worker// ALU micro-ops on ports 0, 1, and 2. 69*9880d681SAndroid Build Coastguard Workerdef VulcanI012 : ProcResGroup<[VulcanP0, VulcanP1, VulcanP2]>; 70*9880d681SAndroid Build Coastguard Worker 71*9880d681SAndroid Build Coastguard Worker// Crypto FP/SIMD micro-ops only on port 1. 72*9880d681SAndroid Build Coastguard Workerdef VulcanF1 : ProcResGroup<[VulcanP1]>; 73*9880d681SAndroid Build Coastguard Worker 74*9880d681SAndroid Build Coastguard Worker// FP/SIMD micro-ops on ports 0 and 1. 75*9880d681SAndroid Build Coastguard Workerdef VulcanF01 : ProcResGroup<[VulcanP0, VulcanP1]>; 76*9880d681SAndroid Build Coastguard Worker 77*9880d681SAndroid Build Coastguard Worker// Store data micro-ops only on port 3. 78*9880d681SAndroid Build Coastguard Workerdef VulcanSD : ProcResGroup<[VulcanP3]>; 79*9880d681SAndroid Build Coastguard Worker 80*9880d681SAndroid Build Coastguard Worker// Load/store micro-ops on ports 4 and 5. 81*9880d681SAndroid Build Coastguard Workerdef VulcanLS01 : ProcResGroup<[VulcanP4, VulcanP5]>; 82*9880d681SAndroid Build Coastguard Worker 83*9880d681SAndroid Build Coastguard Worker// 60 entry unified scheduler. 84*9880d681SAndroid Build Coastguard Workerdef VulcanAny : ProcResGroup<[VulcanP0, VulcanP1, VulcanP2, 85*9880d681SAndroid Build Coastguard Worker VulcanP3, VulcanP4, VulcanP5]> { 86*9880d681SAndroid Build Coastguard Worker let BufferSize=60; 87*9880d681SAndroid Build Coastguard Worker} 88*9880d681SAndroid Build Coastguard Worker 89*9880d681SAndroid Build Coastguard Worker// Define commonly used write types for InstRW specializations. 90*9880d681SAndroid Build Coastguard Worker// All definitions follow the format: VulcanWrite_<NumCycles>Cyc_<Resources>. 91*9880d681SAndroid Build Coastguard Worker 92*9880d681SAndroid Build Coastguard Worker// 3 cycles on I1. 93*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_3Cyc_I1 : SchedWriteRes<[VulcanI1]> { let Latency = 3; } 94*9880d681SAndroid Build Coastguard Worker 95*9880d681SAndroid Build Coastguard Worker// 4 cycles on I1. 96*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_I1 : SchedWriteRes<[VulcanI1]> { let Latency = 4; } 97*9880d681SAndroid Build Coastguard Worker 98*9880d681SAndroid Build Coastguard Worker// 1 cycle on I0, I1, or I2. 99*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_I012 : SchedWriteRes<[VulcanI012]> { let Latency = 1; } 100*9880d681SAndroid Build Coastguard Worker 101*9880d681SAndroid Build Coastguard Worker// 5 cycles on F1. 102*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_F1 : SchedWriteRes<[VulcanF1]> { let Latency = 5; } 103*9880d681SAndroid Build Coastguard Worker 104*9880d681SAndroid Build Coastguard Worker// 7 cycles on F1. 105*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_F1 : SchedWriteRes<[VulcanF1]> { let Latency = 7; } 106*9880d681SAndroid Build Coastguard Worker 107*9880d681SAndroid Build Coastguard Worker// 4 cycles on F0 or F1. 108*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 4; } 109*9880d681SAndroid Build Coastguard Worker 110*9880d681SAndroid Build Coastguard Worker// 5 cycles on F0 or F1. 111*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 5; } 112*9880d681SAndroid Build Coastguard Worker 113*9880d681SAndroid Build Coastguard Worker// 6 cycles on F0 or F1. 114*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 6; } 115*9880d681SAndroid Build Coastguard Worker 116*9880d681SAndroid Build Coastguard Worker// 7 cycles on F0 or F1. 117*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 7; } 118*9880d681SAndroid Build Coastguard Worker 119*9880d681SAndroid Build Coastguard Worker// 8 cycles on F0 or F1. 120*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_8Cyc_F01 : SchedWriteRes<[VulcanF01]> { let Latency = 8; } 121*9880d681SAndroid Build Coastguard Worker 122*9880d681SAndroid Build Coastguard Worker// 16 cycles on F0 or F1. 123*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_16Cyc_F01 : SchedWriteRes<[VulcanF01]> { 124*9880d681SAndroid Build Coastguard Worker let Latency = 16; 125*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [8]; 126*9880d681SAndroid Build Coastguard Worker} 127*9880d681SAndroid Build Coastguard Worker 128*9880d681SAndroid Build Coastguard Worker// 23 cycles on F0 or F1. 129*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_23Cyc_F01 : SchedWriteRes<[VulcanF01]> { 130*9880d681SAndroid Build Coastguard Worker let Latency = 23; 131*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [11]; 132*9880d681SAndroid Build Coastguard Worker} 133*9880d681SAndroid Build Coastguard Worker 134*9880d681SAndroid Build Coastguard Worker// 1 cycles on LS0 or LS1. 135*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 1; } 136*9880d681SAndroid Build Coastguard Worker 137*9880d681SAndroid Build Coastguard Worker// 4 cycles on LS0 or LS1. 138*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_4Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 4; } 139*9880d681SAndroid Build Coastguard Worker 140*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1. 141*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 5; } 142*9880d681SAndroid Build Coastguard Worker 143*9880d681SAndroid Build Coastguard Worker// 6 cycles on LS0 or LS1. 144*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01 : SchedWriteRes<[VulcanLS01]> { let Latency = 6; } 145*9880d681SAndroid Build Coastguard Worker 146*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and I0, I1, or I2. 147*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01_I012 : SchedWriteRes<[VulcanLS01, VulcanI012]> { 148*9880d681SAndroid Build Coastguard Worker let Latency = 5; 149*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 150*9880d681SAndroid Build Coastguard Worker} 151*9880d681SAndroid Build Coastguard Worker 152*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and 2 of I0, I1, or I2. 153*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01_I012_I012 : 154*9880d681SAndroid Build Coastguard Worker SchedWriteRes<[VulcanLS01, VulcanI012, VulcanI012]> { 155*9880d681SAndroid Build Coastguard Worker let Latency = 6; 156*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 157*9880d681SAndroid Build Coastguard Worker} 158*9880d681SAndroid Build Coastguard Worker 159*9880d681SAndroid Build Coastguard Worker// 1 cycles on LS0 or LS1 and F0 or F1. 160*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_1Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> { 161*9880d681SAndroid Build Coastguard Worker let Latency = 1; 162*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 163*9880d681SAndroid Build Coastguard Worker} 164*9880d681SAndroid Build Coastguard Worker 165*9880d681SAndroid Build Coastguard Worker// 5 cycles on LS0 or LS1 and F0 or F1. 166*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_5Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> { 167*9880d681SAndroid Build Coastguard Worker let Latency = 5; 168*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 169*9880d681SAndroid Build Coastguard Worker} 170*9880d681SAndroid Build Coastguard Worker 171*9880d681SAndroid Build Coastguard Worker// 6 cycles on LS0 or LS1 and F0 or F1. 172*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_6Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> { 173*9880d681SAndroid Build Coastguard Worker let Latency = 6; 174*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 175*9880d681SAndroid Build Coastguard Worker} 176*9880d681SAndroid Build Coastguard Worker 177*9880d681SAndroid Build Coastguard Worker// 7 cycles on LS0 or LS1 and F0 or F1. 178*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_7Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> { 179*9880d681SAndroid Build Coastguard Worker let Latency = 7; 180*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 181*9880d681SAndroid Build Coastguard Worker} 182*9880d681SAndroid Build Coastguard Worker 183*9880d681SAndroid Build Coastguard Worker// 8 cycles on LS0 or LS1 and F0 or F1. 184*9880d681SAndroid Build Coastguard Workerdef VulcanWrite_8Cyc_LS01_F01 : SchedWriteRes<[VulcanLS01, VulcanF01]> { 185*9880d681SAndroid Build Coastguard Worker let Latency = 8; 186*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 187*9880d681SAndroid Build Coastguard Worker} 188*9880d681SAndroid Build Coastguard Worker 189*9880d681SAndroid Build Coastguard Worker// Define commonly used read types. 190*9880d681SAndroid Build Coastguard Worker 191*9880d681SAndroid Build Coastguard Worker// No forwarding is provided for these types. 192*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadI, 0>; 193*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadISReg, 0>; 194*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIEReg, 0>; 195*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIM, 0>; 196*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadIMA, 0>; 197*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadID, 0>; 198*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadExtrHi, 0>; 199*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadAdrBase, 0>; 200*9880d681SAndroid Build Coastguard Workerdef : ReadAdvance<ReadVLD, 0>; 201*9880d681SAndroid Build Coastguard Worker 202*9880d681SAndroid Build Coastguard Worker} 203*9880d681SAndroid Build Coastguard Worker 204*9880d681SAndroid Build Coastguard Worker 205*9880d681SAndroid Build Coastguard Worker//===----------------------------------------------------------------------===// 206*9880d681SAndroid Build Coastguard Worker// 3. Instruction Tables. 207*9880d681SAndroid Build Coastguard Worker 208*9880d681SAndroid Build Coastguard Workerlet SchedModel = VulcanModel in { 209*9880d681SAndroid Build Coastguard Worker 210*9880d681SAndroid Build Coastguard Worker//--- 211*9880d681SAndroid Build Coastguard Worker// 3.1 Branch Instructions 212*9880d681SAndroid Build Coastguard Worker//--- 213*9880d681SAndroid Build Coastguard Worker 214*9880d681SAndroid Build Coastguard Worker// Branch, immed 215*9880d681SAndroid Build Coastguard Worker// Branch and link, immed 216*9880d681SAndroid Build Coastguard Worker// Compare and branch 217*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBr, [VulcanI2]> { let Latency = 1; } 218*9880d681SAndroid Build Coastguard Worker 219*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSys, []> { let Latency = 1; } 220*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 221*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteHint, []> { let Latency = 1; } 222*9880d681SAndroid Build Coastguard Worker 223*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAtomic, []> { let Unsupported = 1; } 224*9880d681SAndroid Build Coastguard Worker 225*9880d681SAndroid Build Coastguard Worker// Branch, register 226*9880d681SAndroid Build Coastguard Worker// Branch and link, register != LR 227*9880d681SAndroid Build Coastguard Worker// Branch and link, register = LR 228*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteBrReg, [VulcanI2]> { let Latency = 1; } 229*9880d681SAndroid Build Coastguard Worker 230*9880d681SAndroid Build Coastguard Worker//--- 231*9880d681SAndroid Build Coastguard Worker// 3.2 Arithmetic and Logical Instructions 232*9880d681SAndroid Build Coastguard Worker// 3.3 Move and Shift Instructions 233*9880d681SAndroid Build Coastguard Worker//--- 234*9880d681SAndroid Build Coastguard Worker 235*9880d681SAndroid Build Coastguard Worker// ALU, basic 236*9880d681SAndroid Build Coastguard Worker// Conditional compare 237*9880d681SAndroid Build Coastguard Worker// Conditional select 238*9880d681SAndroid Build Coastguard Worker// Address generation 239*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteI, [VulcanI012]> { let Latency = 1; } 240*9880d681SAndroid Build Coastguard Workerdef : InstRW<[WriteI], (instrs COPY)>; 241*9880d681SAndroid Build Coastguard Worker 242*9880d681SAndroid Build Coastguard Worker// ALU, extend and/or shift 243*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteISReg, [VulcanI012]> { 244*9880d681SAndroid Build Coastguard Worker let Latency = 2; 245*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 246*9880d681SAndroid Build Coastguard Worker} 247*9880d681SAndroid Build Coastguard Worker 248*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIEReg, [VulcanI012]> { 249*9880d681SAndroid Build Coastguard Worker let Latency = 2; 250*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [2]; 251*9880d681SAndroid Build Coastguard Worker} 252*9880d681SAndroid Build Coastguard Worker 253*9880d681SAndroid Build Coastguard Worker// Move immed 254*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteImm, [VulcanI012]> { let Latency = 1; } 255*9880d681SAndroid Build Coastguard Worker 256*9880d681SAndroid Build Coastguard Worker// Variable shift 257*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIS, [VulcanI012]> { let Latency = 1; } 258*9880d681SAndroid Build Coastguard Worker 259*9880d681SAndroid Build Coastguard Worker//--- 260*9880d681SAndroid Build Coastguard Worker// 3.4 Divide and Multiply Instructions 261*9880d681SAndroid Build Coastguard Worker//--- 262*9880d681SAndroid Build Coastguard Worker 263*9880d681SAndroid Build Coastguard Worker// Divide, W-form 264*9880d681SAndroid Build Coastguard Worker// Latency range of 13-23. Take the average. 265*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID32, [VulcanI1]> { 266*9880d681SAndroid Build Coastguard Worker let Latency = 18; 267*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [18]; 268*9880d681SAndroid Build Coastguard Worker} 269*9880d681SAndroid Build Coastguard Worker 270*9880d681SAndroid Build Coastguard Worker// Divide, X-form 271*9880d681SAndroid Build Coastguard Worker// Latency range of 13-39. Take the average. 272*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteID64, [VulcanI1]> { 273*9880d681SAndroid Build Coastguard Worker let Latency = 26; 274*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [26]; 275*9880d681SAndroid Build Coastguard Worker} 276*9880d681SAndroid Build Coastguard Worker 277*9880d681SAndroid Build Coastguard Worker// Multiply accumulate, W-form 278*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM32, [VulcanI012]> { let Latency = 5; } 279*9880d681SAndroid Build Coastguard Worker 280*9880d681SAndroid Build Coastguard Worker// Multiply accumulate, X-form 281*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteIM64, [VulcanI012]> { let Latency = 5; } 282*9880d681SAndroid Build Coastguard Worker 283*9880d681SAndroid Build Coastguard Worker// Bitfield extract, two reg 284*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteExtr, [VulcanI012]> { let Latency = 1; } 285*9880d681SAndroid Build Coastguard Worker 286*9880d681SAndroid Build Coastguard Worker// Bitfield move, basic 287*9880d681SAndroid Build Coastguard Worker// Bitfield move, insert 288*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteIS. 289*9880d681SAndroid Build Coastguard Worker 290*9880d681SAndroid Build Coastguard Worker// Count leading 291*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_3Cyc_I1], (instregex "^CLS(W|X)r$", 292*9880d681SAndroid Build Coastguard Worker "^CLZ(W|X)r$")>; 293*9880d681SAndroid Build Coastguard Worker 294*9880d681SAndroid Build Coastguard Worker// Reverse bits/bytes 295*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteI. 296*9880d681SAndroid Build Coastguard Worker 297*9880d681SAndroid Build Coastguard Worker//--- 298*9880d681SAndroid Build Coastguard Worker// 3.6 Load Instructions 299*9880d681SAndroid Build Coastguard Worker// 3.10 FP Load Instructions 300*9880d681SAndroid Build Coastguard Worker//--- 301*9880d681SAndroid Build Coastguard Worker 302*9880d681SAndroid Build Coastguard Worker// Load register, literal 303*9880d681SAndroid Build Coastguard Worker// Load register, unscaled immed 304*9880d681SAndroid Build Coastguard Worker// Load register, immed unprivileged 305*9880d681SAndroid Build Coastguard Worker// Load register, unsigned immed 306*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLD, [VulcanLS01]> { let Latency = 4; } 307*9880d681SAndroid Build Coastguard Worker 308*9880d681SAndroid Build Coastguard Worker// Load register, immed post-index 309*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteI. 310*9880d681SAndroid Build Coastguard Worker// Load register, immed pre-index 311*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteAdr. 312*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteAdr, [VulcanI012]> { let Latency = 1; } 313*9880d681SAndroid Build Coastguard Worker 314*9880d681SAndroid Build Coastguard Worker// Load register offset, basic 315*9880d681SAndroid Build Coastguard Worker// Load register, register offset, scale by 4/8 316*9880d681SAndroid Build Coastguard Worker// Load register, register offset, scale by 2 317*9880d681SAndroid Build Coastguard Worker// Load register offset, extend 318*9880d681SAndroid Build Coastguard Worker// Load register, register offset, extend, scale by 4/8 319*9880d681SAndroid Build Coastguard Worker// Load register, register offset, extend, scale by 2 320*9880d681SAndroid Build Coastguard Workerdef VulcanWriteLDIdx : SchedWriteVariant<[ 321*9880d681SAndroid Build Coastguard Worker SchedVar<ScaledIdxPred, [VulcanWrite_6Cyc_LS01_I012_I012]>, 322*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [VulcanWrite_5Cyc_LS01_I012]>]>; 323*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<WriteLDIdx, VulcanWriteLDIdx>; 324*9880d681SAndroid Build Coastguard Worker 325*9880d681SAndroid Build Coastguard Workerdef VulcanReadAdrBase : SchedReadVariant<[ 326*9880d681SAndroid Build Coastguard Worker SchedVar<ScaledIdxPred, [ReadDefault]>, 327*9880d681SAndroid Build Coastguard Worker SchedVar<NoSchedPred, [ReadDefault]>]>; 328*9880d681SAndroid Build Coastguard Workerdef : SchedAlias<ReadAdrBase, VulcanReadAdrBase>; 329*9880d681SAndroid Build Coastguard Worker 330*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset, normal 331*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset, signed words, base != SP 332*9880d681SAndroid Build Coastguard Worker// Load pair, immed offset signed words, base = SP 333*9880d681SAndroid Build Coastguard Worker// LDP only breaks into *one* LS micro-op. Thus 334*9880d681SAndroid Build Coastguard Worker// the resources are handling by WriteLD. 335*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteLDHi, []> { 336*9880d681SAndroid Build Coastguard Worker let Latency = 5; 337*9880d681SAndroid Build Coastguard Worker} 338*9880d681SAndroid Build Coastguard Worker 339*9880d681SAndroid Build Coastguard Worker// Load pair, immed pre-index, normal 340*9880d681SAndroid Build Coastguard Worker// Load pair, immed pre-index, signed words 341*9880d681SAndroid Build Coastguard Worker// Load pair, immed post-index, normal 342*9880d681SAndroid Build Coastguard Worker// Load pair, immed post-index, signed words 343*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr. 344*9880d681SAndroid Build Coastguard Worker 345*9880d681SAndroid Build Coastguard Worker//-- 346*9880d681SAndroid Build Coastguard Worker// 3.7 Store Instructions 347*9880d681SAndroid Build Coastguard Worker// 3.11 FP Store Instructions 348*9880d681SAndroid Build Coastguard Worker//-- 349*9880d681SAndroid Build Coastguard Worker 350*9880d681SAndroid Build Coastguard Worker// Store register, unscaled immed 351*9880d681SAndroid Build Coastguard Worker// Store register, immed unprivileged 352*9880d681SAndroid Build Coastguard Worker// Store register, unsigned immed 353*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteST, [VulcanLS01, VulcanSD]> { 354*9880d681SAndroid Build Coastguard Worker let Latency = 1; 355*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 356*9880d681SAndroid Build Coastguard Worker} 357*9880d681SAndroid Build Coastguard Worker 358*9880d681SAndroid Build Coastguard Worker// Store register, immed post-index 359*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteST, ReadAdrBase 360*9880d681SAndroid Build Coastguard Worker 361*9880d681SAndroid Build Coastguard Worker// Store register, immed pre-index 362*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteST 363*9880d681SAndroid Build Coastguard Worker 364*9880d681SAndroid Build Coastguard Worker// Store register, register offset, basic 365*9880d681SAndroid Build Coastguard Worker// Store register, register offset, scaled by 4/8 366*9880d681SAndroid Build Coastguard Worker// Store register, register offset, scaled by 2 367*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend 368*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend, scale by 4/8 369*9880d681SAndroid Build Coastguard Worker// Store register, register offset, extend, scale by 1 370*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTIdx, [VulcanLS01, VulcanSD, VulcanI012]> { 371*9880d681SAndroid Build Coastguard Worker let Latency = 1; 372*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 3; 373*9880d681SAndroid Build Coastguard Worker} 374*9880d681SAndroid Build Coastguard Worker 375*9880d681SAndroid Build Coastguard Worker// Store pair, immed offset, W-form 376*9880d681SAndroid Build Coastguard Worker// Store pair, immed offset, X-form 377*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteSTP, [VulcanLS01, VulcanSD]> { 378*9880d681SAndroid Build Coastguard Worker let Latency = 1; 379*9880d681SAndroid Build Coastguard Worker let NumMicroOps = 2; 380*9880d681SAndroid Build Coastguard Worker} 381*9880d681SAndroid Build Coastguard Worker 382*9880d681SAndroid Build Coastguard Worker// Store pair, immed post-index, W-form 383*9880d681SAndroid Build Coastguard Worker// Store pair, immed post-index, X-form 384*9880d681SAndroid Build Coastguard Worker// Store pair, immed pre-index, W-form 385*9880d681SAndroid Build Coastguard Worker// Store pair, immed pre-index, X-form 386*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteAdr, WriteSTP. 387*9880d681SAndroid Build Coastguard Worker 388*9880d681SAndroid Build Coastguard Worker//--- 389*9880d681SAndroid Build Coastguard Worker// 3.8 FP Data Processing Instructions 390*9880d681SAndroid Build Coastguard Worker//--- 391*9880d681SAndroid Build Coastguard Worker 392*9880d681SAndroid Build Coastguard Worker// FP absolute value 393*9880d681SAndroid Build Coastguard Worker// FP min/max 394*9880d681SAndroid Build Coastguard Worker// FP negate 395*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteF, [VulcanF01]> { let Latency = 5; } 396*9880d681SAndroid Build Coastguard Worker 397*9880d681SAndroid Build Coastguard Worker// FP arithmetic 398*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FADD", "^FSUB")>; 399*9880d681SAndroid Build Coastguard Worker 400*9880d681SAndroid Build Coastguard Worker// FP compare 401*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCmp, [VulcanF01]> { let Latency = 5; } 402*9880d681SAndroid Build Coastguard Worker 403*9880d681SAndroid Build Coastguard Worker// FP divide, S-form 404*9880d681SAndroid Build Coastguard Worker// FP square root, S-form 405*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFDiv, [VulcanF01]> { 406*9880d681SAndroid Build Coastguard Worker let Latency = 16; 407*9880d681SAndroid Build Coastguard Worker let ResourceCycles = [8]; 408*9880d681SAndroid Build Coastguard Worker} 409*9880d681SAndroid Build Coastguard Worker 410*9880d681SAndroid Build Coastguard Worker// FP divide, D-form 411*9880d681SAndroid Build Coastguard Worker// FP square root, D-form 412*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_23Cyc_F01], (instrs FDIVDrr, FSQRTDr)>; 413*9880d681SAndroid Build Coastguard Worker 414*9880d681SAndroid Build Coastguard Worker// FP multiply 415*9880d681SAndroid Build Coastguard Worker// FP multiply accumulate 416*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFMul, [VulcanF01]> { let Latency = 6; } 417*9880d681SAndroid Build Coastguard Worker 418*9880d681SAndroid Build Coastguard Worker// FP round to integral 419*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_F01], 420*9880d681SAndroid Build Coastguard Worker (instregex "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>; 421*9880d681SAndroid Build Coastguard Worker 422*9880d681SAndroid Build Coastguard Worker// FP select 423*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_F01], (instregex "^FCSEL")>; 424*9880d681SAndroid Build Coastguard Worker 425*9880d681SAndroid Build Coastguard Worker//--- 426*9880d681SAndroid Build Coastguard Worker// 3.9 FP Miscellaneous Instructions 427*9880d681SAndroid Build Coastguard Worker//--- 428*9880d681SAndroid Build Coastguard Worker 429*9880d681SAndroid Build Coastguard Worker// FP convert, from vec to vec reg 430*9880d681SAndroid Build Coastguard Worker// FP convert, from gen to vec reg 431*9880d681SAndroid Build Coastguard Worker// FP convert, from vec to gen reg 432*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCvt, [VulcanF01]> { let Latency = 7; } 433*9880d681SAndroid Build Coastguard Worker 434*9880d681SAndroid Build Coastguard Worker// FP move, immed 435*9880d681SAndroid Build Coastguard Worker// FP move, register 436*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFImm, [VulcanF01]> { let Latency = 4; } 437*9880d681SAndroid Build Coastguard Worker 438*9880d681SAndroid Build Coastguard Worker// FP transfer, from gen to vec reg 439*9880d681SAndroid Build Coastguard Worker// FP transfer, from vec to gen reg 440*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteFCopy, [VulcanF01]> { let Latency = 4; } 441*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instrs FMOVXDHighr, FMOVDXHighr)>; 442*9880d681SAndroid Build Coastguard Worker 443*9880d681SAndroid Build Coastguard Worker//--- 444*9880d681SAndroid Build Coastguard Worker// 3.12 ASIMD Integer Instructions 445*9880d681SAndroid Build Coastguard Worker//--- 446*9880d681SAndroid Build Coastguard Worker 447*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff, D-form 448*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff, Q-form 449*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum, D-form 450*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum, Q-form 451*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff accum long 452*9880d681SAndroid Build Coastguard Worker// ASIMD absolute diff long 453*9880d681SAndroid Build Coastguard Worker// ASIMD arith, basic 454*9880d681SAndroid Build Coastguard Worker// ASIMD arith, complex 455*9880d681SAndroid Build Coastguard Worker// ASIMD compare 456*9880d681SAndroid Build Coastguard Worker// ASIMD logical (AND, BIC, EOR) 457*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, basic 458*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 4H/4S 459*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 8B/8H 460*9880d681SAndroid Build Coastguard Worker// ASIMD max/min, reduce, 16B 461*9880d681SAndroid Build Coastguard Worker// ASIMD multiply, D-form 462*9880d681SAndroid Build Coastguard Worker// ASIMD multiply, Q-form 463*9880d681SAndroid Build Coastguard Worker// ASIMD multiply accumulate long 464*9880d681SAndroid Build Coastguard Worker// ASIMD multiply accumulate saturating long 465*9880d681SAndroid Build Coastguard Worker// ASIMD multiply long 466*9880d681SAndroid Build Coastguard Worker// ASIMD pairwise add and accumulate 467*9880d681SAndroid Build Coastguard Worker// ASIMD shift accumulate 468*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed, basic 469*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed and insert, basic, D-form 470*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed and insert, basic, Q-form 471*9880d681SAndroid Build Coastguard Worker// ASIMD shift by immed, complex 472*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, basic, D-form 473*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, basic, Q-form 474*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, complex, D-form 475*9880d681SAndroid Build Coastguard Worker// ASIMD shift by register, complex, Q-form 476*9880d681SAndroid Build Coastguard Workerdef : WriteRes<WriteV, [VulcanF01]> { let Latency = 7; } 477*9880d681SAndroid Build Coastguard Worker 478*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 4H/4S 479*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 8B/8H 480*9880d681SAndroid Build Coastguard Worker// ASIMD arith, reduce, 16B 481*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], 482*9880d681SAndroid Build Coastguard Worker (instregex "^ADDVv", "^SADDLVv", "^UADDLVv")>; 483*9880d681SAndroid Build Coastguard Worker 484*9880d681SAndroid Build Coastguard Worker// ASIMD logical (MOV, MVN, ORN, ORR) 485*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^ORRv", "^ORNv", "^NOTv")>; 486*9880d681SAndroid Build Coastguard Worker 487*9880d681SAndroid Build Coastguard Worker// ASIMD polynomial (8x8) multiply long 488*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instrs PMULLv8i8, PMULLv16i8)>; 489*9880d681SAndroid Build Coastguard Worker 490*9880d681SAndroid Build Coastguard Worker//--- 491*9880d681SAndroid Build Coastguard Worker// 3.13 ASIMD Floating-point Instructions 492*9880d681SAndroid Build Coastguard Worker//--- 493*9880d681SAndroid Build Coastguard Worker 494*9880d681SAndroid Build Coastguard Worker// ASIMD FP absolute value 495*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FABSv")>; 496*9880d681SAndroid Build Coastguard Worker 497*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, normal, D-form 498*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, normal, Q-form 499*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FABDv", "^FADDv", "^FSUBv")>; 500*9880d681SAndroid Build Coastguard Worker 501*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith,pairwise, D-form 502*9880d681SAndroid Build Coastguard Worker// ASIMD FP arith, pairwise, Q-form 503*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FADDPv")>; 504*9880d681SAndroid Build Coastguard Worker 505*9880d681SAndroid Build Coastguard Worker// ASIMD FP compare, D-form 506*9880d681SAndroid Build Coastguard Worker// ASIMD FP compare, Q-form 507*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FACGEv", "^FACGTv")>; 508*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FCMEQv", "^FCMGEv", 509*9880d681SAndroid Build Coastguard Worker "^FCMGTv", "^FCMLEv", 510*9880d681SAndroid Build Coastguard Worker "^FCMLTv")>; 511*9880d681SAndroid Build Coastguard Worker 512*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, long 513*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, narrow 514*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, other, D-form 515*9880d681SAndroid Build Coastguard Worker// ASIMD FP convert, other, Q-form 516*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV. 517*9880d681SAndroid Build Coastguard Worker 518*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, D-form, F32 519*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_16Cyc_F01], (instrs FDIVv2f32)>; 520*9880d681SAndroid Build Coastguard Worker 521*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, Q-form, F32 522*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_16Cyc_F01], (instrs FDIVv4f32)>; 523*9880d681SAndroid Build Coastguard Worker 524*9880d681SAndroid Build Coastguard Worker// ASIMD FP divide, Q-form, F64 525*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_23Cyc_F01], (instrs FDIVv2f64)>; 526*9880d681SAndroid Build Coastguard Worker 527*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, normal, D-form 528*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, normal, Q-form 529*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXv", "^FMAXNMv", 530*9880d681SAndroid Build Coastguard Worker "^FMINv", "^FMINNMv")>; 531*9880d681SAndroid Build Coastguard Worker 532*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, pairwise, D-form 533*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, pairwise, Q-form 534*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXPv", "^FMAXNMPv", 535*9880d681SAndroid Build Coastguard Worker "^FMINPv", "^FMINNMPv")>; 536*9880d681SAndroid Build Coastguard Worker 537*9880d681SAndroid Build Coastguard Worker// ASIMD FP max/min, reduce 538*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMAXVv", "^FMAXNMVv", 539*9880d681SAndroid Build Coastguard Worker "^FMINVv", "^FMINNMVv")>; 540*9880d681SAndroid Build Coastguard Worker 541*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, D-form, FZ 542*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, D-form, no FZ 543*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, Q-form, FZ 544*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply, Q-form, no FZ 545*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FMULv", "^FMULXv")>; 546*9880d681SAndroid Build Coastguard Worker 547*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Dform, FZ 548*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Dform, no FZ 549*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Qform, FZ 550*9880d681SAndroid Build Coastguard Worker// ASIMD FP multiply accumulate, Qform, no FZ 551*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FMLAv", "^FMLSv")>; 552*9880d681SAndroid Build Coastguard Worker 553*9880d681SAndroid Build Coastguard Worker// ASIMD FP negate 554*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FNEGv")>; 555*9880d681SAndroid Build Coastguard Worker 556*9880d681SAndroid Build Coastguard Worker// ASIMD FP round, D-form 557*9880d681SAndroid Build Coastguard Worker// ASIMD FP round, Q-form 558*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV. 559*9880d681SAndroid Build Coastguard Worker 560*9880d681SAndroid Build Coastguard Worker//-- 561*9880d681SAndroid Build Coastguard Worker// 3.14 ASIMD Miscellaneous Instructions 562*9880d681SAndroid Build Coastguard Worker//-- 563*9880d681SAndroid Build Coastguard Worker 564*9880d681SAndroid Build Coastguard Worker// ASIMD bit reverse 565*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^RBITv")>; 566*9880d681SAndroid Build Coastguard Worker 567*9880d681SAndroid Build Coastguard Worker// ASIMD bitwise insert, D-form 568*9880d681SAndroid Build Coastguard Worker// ASIMD bitwise insert, Q-form 569*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^BIFv", "^BITv", "^BSLv")>; 570*9880d681SAndroid Build Coastguard Worker 571*9880d681SAndroid Build Coastguard Worker// ASIMD count, D-form 572*9880d681SAndroid Build Coastguard Worker// ASIMD count, Q-form 573*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^CLSv", "^CLZv", "^CNTv")>; 574*9880d681SAndroid Build Coastguard Worker 575*9880d681SAndroid Build Coastguard Worker// ASIMD duplicate, gen reg 576*9880d681SAndroid Build Coastguard Worker// ASIMD duplicate, element 577*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^DUPv")>; 578*9880d681SAndroid Build Coastguard Worker 579*9880d681SAndroid Build Coastguard Worker// ASIMD extract 580*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^EXTv")>; 581*9880d681SAndroid Build Coastguard Worker 582*9880d681SAndroid Build Coastguard Worker// ASIMD extract narrow 583*9880d681SAndroid Build Coastguard Worker// ASIMD extract narrow, saturating 584*9880d681SAndroid Build Coastguard Worker// NOTE: Handled by WriteV. 585*9880d681SAndroid Build Coastguard Worker 586*9880d681SAndroid Build Coastguard Worker// ASIMD insert, element to element 587*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^INSv")>; 588*9880d681SAndroid Build Coastguard Worker 589*9880d681SAndroid Build Coastguard Worker// ASIMD move, integer immed 590*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^MOVIv", "^MOVIDv")>; 591*9880d681SAndroid Build Coastguard Worker 592*9880d681SAndroid Build Coastguard Worker// ASIMD move, FP immed 593*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^FMOVv")>; 594*9880d681SAndroid Build Coastguard Worker 595*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal estimate, D-form 596*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal estimate, Q-form 597*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], 598*9880d681SAndroid Build Coastguard Worker (instregex "^FRECPEv", "^FRECPXv", "^URECPEv", 599*9880d681SAndroid Build Coastguard Worker "^FRSQRTEv", "^URSQRTEv")>; 600*9880d681SAndroid Build Coastguard Worker 601*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, D-form, FZ 602*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, D-form, no FZ 603*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, Q-form, FZ 604*9880d681SAndroid Build Coastguard Worker// ASIMD reciprocal step, Q-form, no FZ 605*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^FRECPSv", "^FRSQRTSv")>; 606*9880d681SAndroid Build Coastguard Worker 607*9880d681SAndroid Build Coastguard Worker// ASIMD reverse 608*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], 609*9880d681SAndroid Build Coastguard Worker (instregex "^REV16v", "^REV32v", "^REV64v")>; 610*9880d681SAndroid Build Coastguard Worker 611*9880d681SAndroid Build Coastguard Worker// ASIMD table lookup, D-form 612*9880d681SAndroid Build Coastguard Worker// ASIMD table lookup, Q-form 613*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_F01], (instregex "^TBLv", "^TBXv")>; 614*9880d681SAndroid Build Coastguard Worker 615*9880d681SAndroid Build Coastguard Worker// ASIMD transfer, element to word or word 616*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^UMOVv")>; 617*9880d681SAndroid Build Coastguard Worker 618*9880d681SAndroid Build Coastguard Worker// ASIMD transfer, element to gen reg 619*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_F01], (instregex "^SMOVv", "^UMOVv")>; 620*9880d681SAndroid Build Coastguard Worker 621*9880d681SAndroid Build Coastguard Worker// ASIMD transfer gen reg to element 622*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^INSv")>; 623*9880d681SAndroid Build Coastguard Worker 624*9880d681SAndroid Build Coastguard Worker// ASIMD transpose 625*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^TRN1v", "^TRN2v", 626*9880d681SAndroid Build Coastguard Worker "^UZP1v", "^UZP2v")>; 627*9880d681SAndroid Build Coastguard Worker 628*9880d681SAndroid Build Coastguard Worker// ASIMD unzip/zip 629*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F01], (instregex "^ZIP1v", "^ZIP2v")>; 630*9880d681SAndroid Build Coastguard Worker 631*9880d681SAndroid Build Coastguard Worker//-- 632*9880d681SAndroid Build Coastguard Worker// 3.15 ASIMD Load Instructions 633*9880d681SAndroid Build Coastguard Worker//-- 634*9880d681SAndroid Build Coastguard Worker 635*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 1 reg, D-form 636*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 1 reg, Q-form 637*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01], 638*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 639*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01, WriteAdr], 640*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 641*9880d681SAndroid Build Coastguard Worker 642*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 2 reg, D-form 643*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 2 reg, Q-form 644*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01], 645*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 646*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_LS01, WriteAdr], 647*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 648*9880d681SAndroid Build Coastguard Worker 649*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 3 reg, D-form 650*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 3 reg, Q-form 651*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01], 652*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 653*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01, WriteAdr], 654*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 655*9880d681SAndroid Build Coastguard Worker 656*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 4 reg, D-form 657*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, multiple, 4 reg, Q-form 658*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01], 659*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 660*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01, WriteAdr], 661*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 662*9880d681SAndroid Build Coastguard Worker 663*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, one lane, B/H/S 664*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, one lane, D 665*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], (instregex "^LD1i(8|16|32|64)$")>; 666*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr], 667*9880d681SAndroid Build Coastguard Worker (instregex "^LD1i(8|16|32|64)_POST$")>; 668*9880d681SAndroid Build Coastguard Worker 669*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, D-form, B/H/S 670*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, D-form, D 671*9880d681SAndroid Build Coastguard Worker// ASIMD load, 1 element, all lanes, Q-form 672*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], 673*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 674*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr], 675*9880d681SAndroid Build Coastguard Worker (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 676*9880d681SAndroid Build Coastguard Worker 677*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, multiple, D-form, B/H/S 678*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, multiple, Q-form, D 679*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], 680*9880d681SAndroid Build Coastguard Worker (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 681*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr], 682*9880d681SAndroid Build Coastguard Worker (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 683*9880d681SAndroid Build Coastguard Worker 684*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, B/H 685*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, S 686*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, one lane, D 687*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], (instregex "^LD2i(8|16|32|64)$")>; 688*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr], 689*9880d681SAndroid Build Coastguard Worker (instregex "^LD2i(8|16|32|64)_POST$")>; 690*9880d681SAndroid Build Coastguard Worker 691*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, D-form, B/H/S 692*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, D-form, D 693*9880d681SAndroid Build Coastguard Worker// ASIMD load, 2 element, all lanes, Q-form 694*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01], 695*9880d681SAndroid Build Coastguard Worker (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 696*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_LS01_F01, WriteAdr], 697*9880d681SAndroid Build Coastguard Worker (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 698*9880d681SAndroid Build Coastguard Worker 699*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, D-form, B/H/S 700*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, Q-form, B/H/S 701*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, multiple, Q-form, D 702*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01], 703*9880d681SAndroid Build Coastguard Worker (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 704*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01, WriteAdr], 705*9880d681SAndroid Build Coastguard Worker (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 706*9880d681SAndroid Build Coastguard Worker 707*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lone, B/H 708*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lane, S 709*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, one lane, D 710*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01], (instregex "^LD3i(8|16|32|64)$")>; 711*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01, WriteAdr], 712*9880d681SAndroid Build Coastguard Worker (instregex "^LD3i(8|16|32|64)_POST$")>; 713*9880d681SAndroid Build Coastguard Worker 714*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, D-form, B/H/S 715*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, D-form, D 716*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, Q-form, B/H/S 717*9880d681SAndroid Build Coastguard Worker// ASIMD load, 3 element, all lanes, Q-form, D 718*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01], 719*9880d681SAndroid Build Coastguard Worker (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 720*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_LS01_F01, WriteAdr], 721*9880d681SAndroid Build Coastguard Worker (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 722*9880d681SAndroid Build Coastguard Worker 723*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, D-form, B/H/S 724*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, Q-form, B/H/S 725*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, multiple, Q-form, D 726*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01], 727*9880d681SAndroid Build Coastguard Worker (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 728*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_8Cyc_LS01_F01, WriteAdr], 729*9880d681SAndroid Build Coastguard Worker (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 730*9880d681SAndroid Build Coastguard Worker 731*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, B/H 732*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, S 733*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, one lane, D 734*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01], (instregex "^LD4i(8|16|32|64)$")>; 735*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01, WriteAdr], 736*9880d681SAndroid Build Coastguard Worker (instregex "^LD4i(8|16|32|64)_POST$")>; 737*9880d681SAndroid Build Coastguard Worker 738*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, D-form, B/H/S 739*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, D-form, D 740*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, Q-form, B/H/S 741*9880d681SAndroid Build Coastguard Worker// ASIMD load, 4 element, all lanes, Q-form, D 742*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01], 743*9880d681SAndroid Build Coastguard Worker (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 744*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_6Cyc_LS01_F01, WriteAdr], 745*9880d681SAndroid Build Coastguard Worker (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 746*9880d681SAndroid Build Coastguard Worker 747*9880d681SAndroid Build Coastguard Worker//-- 748*9880d681SAndroid Build Coastguard Worker// 3.16 ASIMD Store Instructions 749*9880d681SAndroid Build Coastguard Worker//-- 750*9880d681SAndroid Build Coastguard Worker 751*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 1 reg, D-form 752*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 1 reg, Q-form 753*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01], 754*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 755*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr], 756*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 757*9880d681SAndroid Build Coastguard Worker 758*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 2 reg, D-form 759*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 2 reg, Q-form 760*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01], 761*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 762*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr], 763*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 764*9880d681SAndroid Build Coastguard Worker 765*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 3 reg, D-form 766*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 3 reg, Q-form 767*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01], 768*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 769*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr], 770*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 771*9880d681SAndroid Build Coastguard Worker 772*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 4 reg, D-form 773*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, multiple, 4 reg, Q-form 774*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01], 775*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 776*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01, WriteAdr], 777*9880d681SAndroid Build Coastguard Worker (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 778*9880d681SAndroid Build Coastguard Worker 779*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, one lane, B/H/S 780*9880d681SAndroid Build Coastguard Worker// ASIMD store, 1 element, one lane, D 781*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], 782*9880d681SAndroid Build Coastguard Worker (instregex "^ST1i(8|16|32|64)$")>; 783*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 784*9880d681SAndroid Build Coastguard Worker (instregex "^ST1i(8|16|32|64)_POST$")>; 785*9880d681SAndroid Build Coastguard Worker 786*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, D-form, B/H/S 787*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, Q-form, B/H/S 788*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, multiple, Q-form, D 789*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], 790*9880d681SAndroid Build Coastguard Worker (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 791*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 792*9880d681SAndroid Build Coastguard Worker (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 793*9880d681SAndroid Build Coastguard Worker 794*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, one lane, B/H/S 795*9880d681SAndroid Build Coastguard Worker// ASIMD store, 2 element, one lane, D 796*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], 797*9880d681SAndroid Build Coastguard Worker (instregex "^ST2i(8|16|32|64)$")>; 798*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 799*9880d681SAndroid Build Coastguard Worker (instregex "^ST2i(8|16|32|64)_POST$")>; 800*9880d681SAndroid Build Coastguard Worker 801*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, D-form, B/H/S 802*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, Q-form, B/H/S 803*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, multiple, Q-form, D 804*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], 805*9880d681SAndroid Build Coastguard Worker (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 806*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 807*9880d681SAndroid Build Coastguard Worker (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 808*9880d681SAndroid Build Coastguard Worker 809*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, B/H 810*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, S 811*9880d681SAndroid Build Coastguard Worker// ASIMD store, 3 element, one lane, D 812*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], (instregex "^ST3i(8|16|32|64)$")>; 813*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 814*9880d681SAndroid Build Coastguard Worker (instregex "^ST3i(8|16|32|64)_POST$")>; 815*9880d681SAndroid Build Coastguard Worker 816*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, D-form, B/H/S 817*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, Q-form, B/H/S 818*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, multiple, Q-form, D 819*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], 820*9880d681SAndroid Build Coastguard Worker (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 821*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 822*9880d681SAndroid Build Coastguard Worker (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 823*9880d681SAndroid Build Coastguard Worker 824*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, B/H 825*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, S 826*9880d681SAndroid Build Coastguard Worker// ASIMD store, 4 element, one lane, D 827*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01], (instregex "^ST4i(8|16|32|64)$")>; 828*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_1Cyc_LS01_F01, WriteAdr], 829*9880d681SAndroid Build Coastguard Worker (instregex "^ST4i(8|16|32|64)_POST$")>; 830*9880d681SAndroid Build Coastguard Worker 831*9880d681SAndroid Build Coastguard Worker//-- 832*9880d681SAndroid Build Coastguard Worker// 3.17 Cryptography Extensions 833*9880d681SAndroid Build Coastguard Worker//-- 834*9880d681SAndroid Build Coastguard Worker 835*9880d681SAndroid Build Coastguard Worker// Crypto AES ops 836*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F1], (instregex "^AES")>; 837*9880d681SAndroid Build Coastguard Worker 838*9880d681SAndroid Build Coastguard Worker// Crypto polynomial (64x64) multiply long 839*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_5Cyc_F1], (instrs PMULLv1i64, PMULLv2i64)>; 840*9880d681SAndroid Build Coastguard Worker 841*9880d681SAndroid Build Coastguard Worker// Crypto SHA1 xor ops 842*9880d681SAndroid Build Coastguard Worker// Crypto SHA1 schedule acceleration ops 843*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 schedule acceleration op (1 u-op) 844*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 schedule acceleration op (2 u-ops) 845*9880d681SAndroid Build Coastguard Worker// Crypto SHA256 hash acceleration ops 846*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_7Cyc_F1], (instregex "^SHA")>; 847*9880d681SAndroid Build Coastguard Worker 848*9880d681SAndroid Build Coastguard Worker//-- 849*9880d681SAndroid Build Coastguard Worker// 3.18 CRC 850*9880d681SAndroid Build Coastguard Worker//-- 851*9880d681SAndroid Build Coastguard Worker 852*9880d681SAndroid Build Coastguard Worker// CRC checksum ops 853*9880d681SAndroid Build Coastguard Workerdef : InstRW<[VulcanWrite_4Cyc_I1], (instregex "^CRC32")>; 854*9880d681SAndroid Build Coastguard Worker 855*9880d681SAndroid Build Coastguard Worker} // SchedModel = VulcanModel 856