10b57cec5SDimitry Andric//=- AArch64SchedThunderX2T99.td - Cavium ThunderX T99 ---*- tablegen -*-=// 20b57cec5SDimitry Andric// 30b57cec5SDimitry Andric// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 40b57cec5SDimitry Andric// See https://llvm.org/LICENSE.txt for license information. 50b57cec5SDimitry Andric// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 60b57cec5SDimitry Andric// 70b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 80b57cec5SDimitry Andric// 90b57cec5SDimitry Andric// This file defines the scheduling model for Cavium ThunderX2T99 100b57cec5SDimitry Andric// processors. 110b57cec5SDimitry Andric// Based on Broadcom Vulcan. 120b57cec5SDimitry Andric// 130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 140b57cec5SDimitry Andric 150b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 160b57cec5SDimitry Andric// 2. Pipeline Description. 170b57cec5SDimitry Andric 180b57cec5SDimitry Andricdef ThunderX2T99Model : SchedMachineModel { 190b57cec5SDimitry Andric let IssueWidth = 4; // 4 micro-ops dispatched at a time. 200b57cec5SDimitry Andric let MicroOpBufferSize = 180; // 180 entries in micro-op re-order buffer. 210b57cec5SDimitry Andric let LoadLatency = 4; // Optimistic load latency. 220b57cec5SDimitry Andric let MispredictPenalty = 12; // Extra cycles for mispredicted branch. 230b57cec5SDimitry Andric // Determined via a mix of micro-arch details and experimentation. 240b57cec5SDimitry Andric let LoopMicroOpBufferSize = 128; 250b57cec5SDimitry Andric let PostRAScheduler = 1; // Using PostRA sched. 260b57cec5SDimitry Andric let CompleteModel = 1; 270b57cec5SDimitry Andric 28e837bb5cSDimitry Andric list<Predicate> UnsupportedFeatures = !listconcat(SVEUnsupported.F, 29fe6060f1SDimitry Andric PAUnsupported.F, 30fe6060f1SDimitry Andric SMEUnsupported.F); 310b57cec5SDimitry Andric // FIXME: Remove when all errors have been fixed. 320b57cec5SDimitry Andric let FullInstRWOverlapCheck = 0; 330b57cec5SDimitry Andric} 340b57cec5SDimitry Andric 350b57cec5SDimitry Andriclet SchedModel = ThunderX2T99Model in { 360b57cec5SDimitry Andric 370b57cec5SDimitry Andric// Define the issue ports. 380b57cec5SDimitry Andric 390b57cec5SDimitry Andric// Port 0: ALU, FP/SIMD. 400b57cec5SDimitry Andricdef THX2T99P0 : ProcResource<1>; 410b57cec5SDimitry Andric 420b57cec5SDimitry Andric// Port 1: ALU, FP/SIMD, integer mul/div. 430b57cec5SDimitry Andricdef THX2T99P1 : ProcResource<1>; 440b57cec5SDimitry Andric 450b57cec5SDimitry Andric// Port 2: ALU, Branch. 460b57cec5SDimitry Andricdef THX2T99P2 : ProcResource<1>; 470b57cec5SDimitry Andric 480b57cec5SDimitry Andric// Port 3: Store data. 490b57cec5SDimitry Andricdef THX2T99P3 : ProcResource<1>; 500b57cec5SDimitry Andric 510b57cec5SDimitry Andric// Port 4: Load/store. 520b57cec5SDimitry Andricdef THX2T99P4 : ProcResource<1>; 530b57cec5SDimitry Andric 540b57cec5SDimitry Andric// Port 5: Load/store. 550b57cec5SDimitry Andricdef THX2T99P5 : ProcResource<1>; 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric// Define groups for the functional units on each issue port. Each group 580b57cec5SDimitry Andric// created will be used by a WriteRes later on. 590b57cec5SDimitry Andric// 600b57cec5SDimitry Andric// NOTE: Some groups only contain one member. This is a way to create names for 610b57cec5SDimitry Andric// the various functional units that share a single issue port. For example, 620b57cec5SDimitry Andric// "THX2T99I1" for ALU ops on port 1 and "THX2T99F1" for FP ops on port 1. 630b57cec5SDimitry Andric 640b57cec5SDimitry Andric// Integer divide and multiply micro-ops only on port 1. 650b57cec5SDimitry Andricdef THX2T99I1 : ProcResGroup<[THX2T99P1]>; 660b57cec5SDimitry Andric 670b57cec5SDimitry Andric// Branch micro-ops only on port 2. 680b57cec5SDimitry Andricdef THX2T99I2 : ProcResGroup<[THX2T99P2]>; 690b57cec5SDimitry Andric 700b57cec5SDimitry Andric// ALU micro-ops on ports 0, 1, and 2. 710b57cec5SDimitry Andricdef THX2T99I012 : ProcResGroup<[THX2T99P0, THX2T99P1, THX2T99P2]>; 720b57cec5SDimitry Andric 730b57cec5SDimitry Andric// Crypto FP/SIMD micro-ops only on port 1. 740b57cec5SDimitry Andricdef THX2T99F1 : ProcResGroup<[THX2T99P1]>; 750b57cec5SDimitry Andric 760b57cec5SDimitry Andric// FP/SIMD micro-ops on ports 0 and 1. 770b57cec5SDimitry Andricdef THX2T99F01 : ProcResGroup<[THX2T99P0, THX2T99P1]>; 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric// Store data micro-ops only on port 3. 800b57cec5SDimitry Andricdef THX2T99SD : ProcResGroup<[THX2T99P3]>; 810b57cec5SDimitry Andric 820b57cec5SDimitry Andric// Load/store micro-ops on ports 4 and 5. 830b57cec5SDimitry Andricdef THX2T99LS01 : ProcResGroup<[THX2T99P4, THX2T99P5]>; 840b57cec5SDimitry Andric 850b57cec5SDimitry Andric// 60 entry unified scheduler. 860b57cec5SDimitry Andricdef THX2T99Any : ProcResGroup<[THX2T99P0, THX2T99P1, THX2T99P2, 870b57cec5SDimitry Andric THX2T99P3, THX2T99P4, THX2T99P5]> { 880b57cec5SDimitry Andric let BufferSize = 60; 890b57cec5SDimitry Andric} 900b57cec5SDimitry Andric 910b57cec5SDimitry Andric// Define commonly used write types for InstRW specializations. 920b57cec5SDimitry Andric// All definitions follow the format: THX2T99Write_<NumCycles>Cyc_<Resources>. 930b57cec5SDimitry Andric 940b57cec5SDimitry Andric// 3 cycles on I1. 950b57cec5SDimitry Andricdef THX2T99Write_3Cyc_I1 : SchedWriteRes<[THX2T99I1]> { 960b57cec5SDimitry Andric let Latency = 3; 970b57cec5SDimitry Andric let NumMicroOps = 2; 980b57cec5SDimitry Andric} 990b57cec5SDimitry Andric 1000b57cec5SDimitry Andric// 1 cycles on I2. 1010b57cec5SDimitry Andricdef THX2T99Write_1Cyc_I2 : SchedWriteRes<[THX2T99I2]> { 1020b57cec5SDimitry Andric let Latency = 1; 1030b57cec5SDimitry Andric let NumMicroOps = 2; 1040b57cec5SDimitry Andric} 1050b57cec5SDimitry Andric 1060b57cec5SDimitry Andric// 4 cycles on I1. 1070b57cec5SDimitry Andricdef THX2T99Write_4Cyc_I1 : SchedWriteRes<[THX2T99I1]> { 1080b57cec5SDimitry Andric let Latency = 4; 1090b57cec5SDimitry Andric let NumMicroOps = 2; 1100b57cec5SDimitry Andric} 1110b57cec5SDimitry Andric 1120b57cec5SDimitry Andric// 23 cycles on I1. 1130b57cec5SDimitry Andricdef THX2T99Write_23Cyc_I1 : SchedWriteRes<[THX2T99I1]> { 1140b57cec5SDimitry Andric let Latency = 23; 1150b57cec5SDimitry Andric let ResourceCycles = [13, 23]; 1160b57cec5SDimitry Andric let NumMicroOps = 4; 1170b57cec5SDimitry Andric} 1180b57cec5SDimitry Andric 1190b57cec5SDimitry Andric// 39 cycles on I1. 1200b57cec5SDimitry Andricdef THX2T99Write_39Cyc_I1 : SchedWriteRes<[THX2T99I1]> { 1210b57cec5SDimitry Andric let Latency = 39; 1220b57cec5SDimitry Andric let ResourceCycles = [13, 39]; 1230b57cec5SDimitry Andric let NumMicroOps = 4; 1240b57cec5SDimitry Andric} 1250b57cec5SDimitry Andric 1260b57cec5SDimitry Andric// 1 cycle on I0, I1, or I2. 1270b57cec5SDimitry Andricdef THX2T99Write_1Cyc_I012 : SchedWriteRes<[THX2T99I012]> { 1280b57cec5SDimitry Andric let Latency = 1; 1290b57cec5SDimitry Andric let NumMicroOps = 2; 1300b57cec5SDimitry Andric} 1310b57cec5SDimitry Andric 1320b57cec5SDimitry Andric// 2 cycles on I0, I1, or I2. 1330b57cec5SDimitry Andricdef THX2T99Write_2Cyc_I012 : SchedWriteRes<[THX2T99I012]> { 1340b57cec5SDimitry Andric let Latency = 2; 1350b57cec5SDimitry Andric let NumMicroOps = 2; 1360b57cec5SDimitry Andric} 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric// 4 cycles on I0, I1, or I2. 1390b57cec5SDimitry Andricdef THX2T99Write_4Cyc_I012 : SchedWriteRes<[THX2T99I012]> { 1400b57cec5SDimitry Andric let Latency = 2; 1410b57cec5SDimitry Andric let NumMicroOps = 3; 1420b57cec5SDimitry Andric} 1430b57cec5SDimitry Andric 1440b57cec5SDimitry Andric// 5 cycles on I0, I1, or I2. 1450b57cec5SDimitry Andricdef THX2T99Write_5Cyc_I012 : SchedWriteRes<[THX2T99I012]> { 1460b57cec5SDimitry Andric let Latency = 2; 1470b57cec5SDimitry Andric let NumMicroOps = 3; 1480b57cec5SDimitry Andric} 1490b57cec5SDimitry Andric 1500b57cec5SDimitry Andric// 5 cycles on F1. 1510b57cec5SDimitry Andricdef THX2T99Write_5Cyc_F1 : SchedWriteRes<[THX2T99F1]> { 1520b57cec5SDimitry Andric let Latency = 5; 1530b57cec5SDimitry Andric let NumMicroOps = 2; 1540b57cec5SDimitry Andric} 1550b57cec5SDimitry Andric 1560b57cec5SDimitry Andric// 7 cycles on F1. 1570b57cec5SDimitry Andricdef THX2T99Write_7Cyc_F1 : SchedWriteRes<[THX2T99F1]> { 1580b57cec5SDimitry Andric let Latency = 7; 1590b57cec5SDimitry Andric let NumMicroOps = 2; 1600b57cec5SDimitry Andric} 1610b57cec5SDimitry Andric 1620b57cec5SDimitry Andric// 4 cycles on F0 or F1. 1630b57cec5SDimitry Andricdef THX2T99Write_4Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1640b57cec5SDimitry Andric let Latency = 4; 1650b57cec5SDimitry Andric let NumMicroOps = 2; 1660b57cec5SDimitry Andric} 1670b57cec5SDimitry Andric 1680b57cec5SDimitry Andric// 5 cycles on F0 or F1. 1690b57cec5SDimitry Andricdef THX2T99Write_5Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1700b57cec5SDimitry Andric let Latency = 5; 1710b57cec5SDimitry Andric let NumMicroOps = 2; 1720b57cec5SDimitry Andric} 1730b57cec5SDimitry Andric 1740b57cec5SDimitry Andric// 6 cycles on F0 or F1. 1750b57cec5SDimitry Andricdef THX2T99Write_6Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1760b57cec5SDimitry Andric let Latency = 6; 1770b57cec5SDimitry Andric let NumMicroOps = 3; 1780b57cec5SDimitry Andric} 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andric// 7 cycles on F0 or F1. 1810b57cec5SDimitry Andricdef THX2T99Write_7Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1820b57cec5SDimitry Andric let Latency = 7; 1830b57cec5SDimitry Andric let NumMicroOps = 3; 1840b57cec5SDimitry Andric} 1850b57cec5SDimitry Andric 1860b57cec5SDimitry Andric// 8 cycles on F0 or F1. 1870b57cec5SDimitry Andricdef THX2T99Write_8Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1880b57cec5SDimitry Andric let Latency = 8; 1890b57cec5SDimitry Andric let NumMicroOps = 3; 1900b57cec5SDimitry Andric} 1910b57cec5SDimitry Andric 1920b57cec5SDimitry Andric// 10 cycles on F0 or F1. 1930b57cec5SDimitry Andricdef THX2T99Write_10Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 1940b57cec5SDimitry Andric let Latency = 10; 1950b57cec5SDimitry Andric let NumMicroOps = 3; 1960b57cec5SDimitry Andric} 1970b57cec5SDimitry Andric 1980b57cec5SDimitry Andric// 16 cycles on F0 or F1. 1990b57cec5SDimitry Andricdef THX2T99Write_16Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 2000b57cec5SDimitry Andric let Latency = 16; 2010b57cec5SDimitry Andric let NumMicroOps = 3; 2020b57cec5SDimitry Andric let ResourceCycles = [8]; 2030b57cec5SDimitry Andric} 2040b57cec5SDimitry Andric 2050b57cec5SDimitry Andric// 23 cycles on F0 or F1. 2060b57cec5SDimitry Andricdef THX2T99Write_23Cyc_F01 : SchedWriteRes<[THX2T99F01]> { 2070b57cec5SDimitry Andric let Latency = 23; 2080b57cec5SDimitry Andric let NumMicroOps = 3; 2090b57cec5SDimitry Andric let ResourceCycles = [11]; 2100b57cec5SDimitry Andric} 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andric// 1 cycles on LS0 or LS1. 2130b57cec5SDimitry Andricdef THX2T99Write_1Cyc_LS01 : SchedWriteRes<[THX2T99LS01]> { 2140b57cec5SDimitry Andric let Latency = 0; 2150b57cec5SDimitry Andric} 2160b57cec5SDimitry Andric 2170b57cec5SDimitry Andric// 1 cycles on LS0 or LS1 and I0, I1, or I2. 2180b57cec5SDimitry Andricdef THX2T99Write_1Cyc_LS01_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 2190b57cec5SDimitry Andric let Latency = 0; 2200b57cec5SDimitry Andric let NumMicroOps = 2; 2210b57cec5SDimitry Andric} 2220b57cec5SDimitry Andric 2230b57cec5SDimitry Andric// 1 cycles on LS0 or LS1 and 2 of I0, I1, or I2. 2240b57cec5SDimitry Andricdef THX2T99Write_1Cyc_LS01_I012_I012 : 2250b57cec5SDimitry Andric SchedWriteRes<[THX2T99LS01, THX2T99I012, THX2T99I012]> { 2260b57cec5SDimitry Andric let Latency = 0; 2270b57cec5SDimitry Andric let NumMicroOps = 3; 2280b57cec5SDimitry Andric} 2290b57cec5SDimitry Andric 2300b57cec5SDimitry Andric// 2 cycles on LS0 or LS1. 2310b57cec5SDimitry Andricdef THX2T99Write_2Cyc_LS01 : SchedWriteRes<[THX2T99LS01]> { 2320b57cec5SDimitry Andric let Latency = 1; 2330b57cec5SDimitry Andric let NumMicroOps = 2; 2340b57cec5SDimitry Andric} 2350b57cec5SDimitry Andric 2360b57cec5SDimitry Andric// 4 cycles on LS0 or LS1. 2370b57cec5SDimitry Andricdef THX2T99Write_4Cyc_LS01 : SchedWriteRes<[THX2T99LS01]> { 2380b57cec5SDimitry Andric let Latency = 4; 2390b57cec5SDimitry Andric let NumMicroOps = 4; 2400b57cec5SDimitry Andric} 2410b57cec5SDimitry Andric 2420b57cec5SDimitry Andric// 5 cycles on LS0 or LS1. 2430b57cec5SDimitry Andricdef THX2T99Write_5Cyc_LS01 : SchedWriteRes<[THX2T99LS01]> { 2440b57cec5SDimitry Andric let Latency = 5; 2450b57cec5SDimitry Andric let NumMicroOps = 3; 2460b57cec5SDimitry Andric} 2470b57cec5SDimitry Andric 2480b57cec5SDimitry Andric// 6 cycles on LS0 or LS1. 2490b57cec5SDimitry Andricdef THX2T99Write_6Cyc_LS01 : SchedWriteRes<[THX2T99LS01]> { 2500b57cec5SDimitry Andric let Latency = 6; 2510b57cec5SDimitry Andric let NumMicroOps = 3; 2520b57cec5SDimitry Andric} 2530b57cec5SDimitry Andric 2540b57cec5SDimitry Andric// 4 cycles on LS0 or LS1 and I0, I1, or I2. 2550b57cec5SDimitry Andricdef THX2T99Write_4Cyc_LS01_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 2560b57cec5SDimitry Andric let Latency = 4; 2570b57cec5SDimitry Andric let NumMicroOps = 3; 2580b57cec5SDimitry Andric} 2590b57cec5SDimitry Andric 2600b57cec5SDimitry Andric// 4 cycles on LS0 or LS1 and 2 of I0, I1, or I2. 2610b57cec5SDimitry Andricdef THX2T99Write_4Cyc_LS01_I012_I012 : 2620b57cec5SDimitry Andric SchedWriteRes<[THX2T99LS01, THX2T99I012, THX2T99I012]> { 2630b57cec5SDimitry Andric let Latency = 4; 2640b57cec5SDimitry Andric let NumMicroOps = 3; 2650b57cec5SDimitry Andric} 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric// 5 cycles on LS0 or LS1 and I0, I1, or I2. 2680b57cec5SDimitry Andricdef THX2T99Write_5Cyc_LS01_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 2690b57cec5SDimitry Andric let Latency = 5; 2700b57cec5SDimitry Andric let NumMicroOps = 3; 2710b57cec5SDimitry Andric} 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric// 5 cycles on LS0 or LS1 and 2 of I0, I1, or I2. 2740b57cec5SDimitry Andricdef THX2T99Write_5Cyc_LS01_I012_I012 : 2750b57cec5SDimitry Andric SchedWriteRes<[THX2T99LS01, THX2T99I012, THX2T99I012]> { 2760b57cec5SDimitry Andric let Latency = 5; 2770b57cec5SDimitry Andric let NumMicroOps = 3; 2780b57cec5SDimitry Andric} 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andric// 6 cycles on LS0 or LS1 and I0, I1, or I2. 2810b57cec5SDimitry Andricdef THX2T99Write_6Cyc_LS01_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 2820b57cec5SDimitry Andric let Latency = 6; 2830b57cec5SDimitry Andric let NumMicroOps = 4; 2840b57cec5SDimitry Andric} 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric// 6 cycles on LS0 or LS1 and 2 of I0, I1, or I2. 2870b57cec5SDimitry Andricdef THX2T99Write_6Cyc_LS01_I012_I012 : 2880b57cec5SDimitry Andric SchedWriteRes<[THX2T99LS01, THX2T99I012, THX2T99I012]> { 2890b57cec5SDimitry Andric let Latency = 6; 2900b57cec5SDimitry Andric let NumMicroOps = 3; 2910b57cec5SDimitry Andric} 2920b57cec5SDimitry Andric 2930b57cec5SDimitry Andric// 1 cycles on LS0 or LS1 and F0 or F1. 2940b57cec5SDimitry Andricdef THX2T99Write_1Cyc_LS01_F01 : SchedWriteRes<[THX2T99LS01, THX2T99F01]> { 2950b57cec5SDimitry Andric let Latency = 1; 2960b57cec5SDimitry Andric let NumMicroOps = 2; 2970b57cec5SDimitry Andric} 2980b57cec5SDimitry Andric 2990b57cec5SDimitry Andric// 5 cycles on LS0 or LS1 and F0 or F1. 3000b57cec5SDimitry Andricdef THX2T99Write_5Cyc_LS01_F01 : SchedWriteRes<[THX2T99LS01, THX2T99F01]> { 3010b57cec5SDimitry Andric let Latency = 5; 3020b57cec5SDimitry Andric let NumMicroOps = 3; 3030b57cec5SDimitry Andric} 3040b57cec5SDimitry Andric 3050b57cec5SDimitry Andric// 6 cycles on LS0 or LS1 and F0 or F1. 3060b57cec5SDimitry Andricdef THX2T99Write_6Cyc_LS01_F01 : SchedWriteRes<[THX2T99LS01, THX2T99F01]> { 3070b57cec5SDimitry Andric let Latency = 6; 3080b57cec5SDimitry Andric let NumMicroOps = 3; 3090b57cec5SDimitry Andric} 3100b57cec5SDimitry Andric 3110b57cec5SDimitry Andric// 7 cycles on LS0 or LS1 and F0 or F1. 3120b57cec5SDimitry Andricdef THX2T99Write_7Cyc_LS01_F01 : SchedWriteRes<[THX2T99LS01, THX2T99F01]> { 3130b57cec5SDimitry Andric let Latency = 7; 3140b57cec5SDimitry Andric let NumMicroOps = 3; 3150b57cec5SDimitry Andric} 3160b57cec5SDimitry Andric 3170b57cec5SDimitry Andric// 8 cycles on LS0 or LS1 and F0 or F1. 3180b57cec5SDimitry Andricdef THX2T99Write_8Cyc_LS01_F01 : SchedWriteRes<[THX2T99LS01, THX2T99F01]> { 3190b57cec5SDimitry Andric let Latency = 8; 3200b57cec5SDimitry Andric let NumMicroOps = 3; 3210b57cec5SDimitry Andric} 3220b57cec5SDimitry Andric 3230b57cec5SDimitry Andric// 8 cycles on LS0 or LS1 and I0, I1, or I2. 3240b57cec5SDimitry Andricdef THX2T99Write_8Cyc_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 3250b57cec5SDimitry Andric let Latency = 8; 3260b57cec5SDimitry Andric let NumMicroOps = 4; 3270b57cec5SDimitry Andric} 3280b57cec5SDimitry Andric 3290b57cec5SDimitry Andric// 12 cycles on LS0 or LS1 and I0, I1, or I2. 3300b57cec5SDimitry Andricdef THX2T99Write_12Cyc_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 3310b57cec5SDimitry Andric let Latency = 12; 3320b57cec5SDimitry Andric let NumMicroOps = 6; 3330b57cec5SDimitry Andric} 3340b57cec5SDimitry Andric 3350b57cec5SDimitry Andric// 16 cycles on LS0 or LS1 and I0, I1, or I2. 3360b57cec5SDimitry Andricdef THX2T99Write_16Cyc_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 3370b57cec5SDimitry Andric let Latency = 16; 3380b57cec5SDimitry Andric let NumMicroOps = 8; 3390b57cec5SDimitry Andric} 3400b57cec5SDimitry Andric 3410b57cec5SDimitry Andric// 24 cycles on LS0 or LS1 and I0, I1, or I2. 3420b57cec5SDimitry Andricdef THX2T99Write_24Cyc_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 3430b57cec5SDimitry Andric let Latency = 24; 3440b57cec5SDimitry Andric let NumMicroOps = 12; 3450b57cec5SDimitry Andric} 3460b57cec5SDimitry Andric 3470b57cec5SDimitry Andric// 32 cycles on LS0 or LS1 and I0, I1, or I2. 3480b57cec5SDimitry Andricdef THX2T99Write_32Cyc_I012 : SchedWriteRes<[THX2T99LS01, THX2T99I012]> { 3490b57cec5SDimitry Andric let Latency = 32; 3500b57cec5SDimitry Andric let NumMicroOps = 16; 3510b57cec5SDimitry Andric} 3520b57cec5SDimitry Andric 3530b57cec5SDimitry Andric// Define commonly used read types. 3540b57cec5SDimitry Andric 3550b57cec5SDimitry Andric// No forwarding is provided for these types. 3560b57cec5SDimitry Andricdef : ReadAdvance<ReadI, 0>; 3570b57cec5SDimitry Andricdef : ReadAdvance<ReadISReg, 0>; 3580b57cec5SDimitry Andricdef : ReadAdvance<ReadIEReg, 0>; 3590b57cec5SDimitry Andricdef : ReadAdvance<ReadIM, 0>; 3600b57cec5SDimitry Andricdef : ReadAdvance<ReadIMA, 0>; 3610b57cec5SDimitry Andricdef : ReadAdvance<ReadID, 0>; 3620b57cec5SDimitry Andricdef : ReadAdvance<ReadExtrHi, 0>; 3630b57cec5SDimitry Andricdef : ReadAdvance<ReadAdrBase, 0>; 3640b57cec5SDimitry Andricdef : ReadAdvance<ReadVLD, 0>; 365349cc55cSDimitry Andricdef : ReadAdvance<ReadST, 0>; 3660b57cec5SDimitry Andric 3670b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3680b57cec5SDimitry Andric// 3. Instruction Tables. 3690b57cec5SDimitry Andric 3700b57cec5SDimitry Andric//--- 3710b57cec5SDimitry Andric// 3.1 Branch Instructions 3720b57cec5SDimitry Andric//--- 3730b57cec5SDimitry Andric 3740b57cec5SDimitry Andric// Branch, immed 3750b57cec5SDimitry Andric// Branch and link, immed 3760b57cec5SDimitry Andric// Compare and branch 3770b57cec5SDimitry Andricdef : WriteRes<WriteBr, [THX2T99I2]> { 3780b57cec5SDimitry Andric let Latency = 1; 3790b57cec5SDimitry Andric let NumMicroOps = 2; 3800b57cec5SDimitry Andric} 3810b57cec5SDimitry Andric 3820b57cec5SDimitry Andric// Branch, register 3830b57cec5SDimitry Andric// Branch and link, register != LR 3840b57cec5SDimitry Andric// Branch and link, register = LR 3850b57cec5SDimitry Andricdef : WriteRes<WriteBrReg, [THX2T99I2]> { 3860b57cec5SDimitry Andric let Latency = 1; 3870b57cec5SDimitry Andric let NumMicroOps = 2; 3880b57cec5SDimitry Andric} 3890b57cec5SDimitry Andric 3900b57cec5SDimitry Andricdef : WriteRes<WriteSys, []> { let Latency = 1; } 3910b57cec5SDimitry Andricdef : WriteRes<WriteBarrier, []> { let Latency = 1; } 3920b57cec5SDimitry Andricdef : WriteRes<WriteHint, []> { let Latency = 1; } 3930b57cec5SDimitry Andric 3940b57cec5SDimitry Andricdef : WriteRes<WriteAtomic, []> { 3950b57cec5SDimitry Andric let Latency = 4; 3960b57cec5SDimitry Andric let NumMicroOps = 2; 3970b57cec5SDimitry Andric} 3980b57cec5SDimitry Andric 3990b57cec5SDimitry Andric//--- 4000b57cec5SDimitry Andric// Branch 4010b57cec5SDimitry Andric//--- 4020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I2], (instrs B, BL, BR, BLR)>; 4030b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I2], (instrs RET)>; 4040b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I2], (instregex "^B..$")>; 4050b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I2], 4060b57cec5SDimitry Andric (instregex "^CBZ", "^CBNZ", "^TBZ", "^TBNZ")>; 4070b57cec5SDimitry Andric 4080b57cec5SDimitry Andric//--- 4090b57cec5SDimitry Andric// 3.2 Arithmetic and Logical Instructions 4100b57cec5SDimitry Andric// 3.3 Move and Shift Instructions 4110b57cec5SDimitry Andric//--- 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andric 4140b57cec5SDimitry Andric// ALU, basic 4150b57cec5SDimitry Andric// Conditional compare 4160b57cec5SDimitry Andric// Conditional select 4170b57cec5SDimitry Andric// Address generation 4180b57cec5SDimitry Andricdef : WriteRes<WriteI, [THX2T99I012]> { 4190b57cec5SDimitry Andric let Latency = 1; 4200b57cec5SDimitry Andric let ResourceCycles = [1]; 4210b57cec5SDimitry Andric let NumMicroOps = 2; 4220b57cec5SDimitry Andric} 4230b57cec5SDimitry Andric 4240b57cec5SDimitry Andricdef : InstRW<[WriteI], 4250b57cec5SDimitry Andric (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 4260b57cec5SDimitry Andric "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 4270b57cec5SDimitry Andric "ADC(W|X)r", 4280b57cec5SDimitry Andric "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 4290b57cec5SDimitry Andric "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 4300b57cec5SDimitry Andric "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 4310b57cec5SDimitry Andric "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 4320b57cec5SDimitry Andric "SBCS(W|X)r", "CCMN(W|X)(i|r)", 4330b57cec5SDimitry Andric "CCMP(W|X)(i|r)", "CSEL(W|X)r", 4340b57cec5SDimitry Andric "CSINC(W|X)r", "CSINV(W|X)r", 4350b57cec5SDimitry Andric "CSNEG(W|X)r")>; 4360b57cec5SDimitry Andric 4370b57cec5SDimitry Andricdef : InstRW<[WriteI], (instrs COPY)>; 4380b57cec5SDimitry Andric 4390b57cec5SDimitry Andric// ALU, extend and/or shift 4400b57cec5SDimitry Andricdef : WriteRes<WriteISReg, [THX2T99I012]> { 4410b57cec5SDimitry Andric let Latency = 2; 4420b57cec5SDimitry Andric let ResourceCycles = [2]; 4430b57cec5SDimitry Andric let NumMicroOps = 2; 4440b57cec5SDimitry Andric} 4450b57cec5SDimitry Andric 4460b57cec5SDimitry Andricdef : InstRW<[WriteISReg], 4470b57cec5SDimitry Andric (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 4480b57cec5SDimitry Andric "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 4490b57cec5SDimitry Andric "ADC(W|X)r", 4500b57cec5SDimitry Andric "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 4510b57cec5SDimitry Andric "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 4520b57cec5SDimitry Andric "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 4530b57cec5SDimitry Andric "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 4540b57cec5SDimitry Andric "SBCS(W|X)r", "CCMN(W|X)(i|r)", 4550b57cec5SDimitry Andric "CCMP(W|X)(i|r)", "CSEL(W|X)r", 4560b57cec5SDimitry Andric "CSINC(W|X)r", "CSINV(W|X)r", 4570b57cec5SDimitry Andric "CSNEG(W|X)r")>; 4580b57cec5SDimitry Andric 4590b57cec5SDimitry Andricdef : WriteRes<WriteIEReg, [THX2T99I012]> { 4600b57cec5SDimitry Andric let Latency = 1; 4610b57cec5SDimitry Andric let ResourceCycles = [1]; 4620b57cec5SDimitry Andric let NumMicroOps = 2; 4630b57cec5SDimitry Andric} 4640b57cec5SDimitry Andric 4650b57cec5SDimitry Andricdef : InstRW<[WriteIEReg], 4660b57cec5SDimitry Andric (instregex "ADD?(W|X)r(i|r|s|x)", "ADDS?(W|X)r(i|r|s|x)(64)?", 4670b57cec5SDimitry Andric "AND?(W|X)r(i|r|s|x)", "ANDS?(W|X)r(i|r|s|x)", 4680b57cec5SDimitry Andric "ADC(W|X)r", 4690b57cec5SDimitry Andric "BIC?(W|X)r(i|r|s|x)", "BICS?(W|X)r(i|r|s|x)", 4700b57cec5SDimitry Andric "EON?(W|X)r(i|r|s|x)", "ORN?(W|X)r(i|r|s|x)", 4710b57cec5SDimitry Andric "ORR?(W|X)r(i|r|s|x)", "SUB?(W|X)r(i|r|s|x)", 4720b57cec5SDimitry Andric "SUBS?(W|X)r(i|r|s|x)", "SBC(W|X)r", 4730b57cec5SDimitry Andric "SBCS(W|X)r", "CCMN(W|X)(i|r)", 4740b57cec5SDimitry Andric "CCMP(W|X)(i|r)", "CSEL(W|X)r", 4750b57cec5SDimitry Andric "CSINC(W|X)r", "CSINV(W|X)r", 4760b57cec5SDimitry Andric "CSNEG(W|X)r")>; 4770b57cec5SDimitry Andric 4780b57cec5SDimitry Andric// Move immed 4790b57cec5SDimitry Andricdef : WriteRes<WriteImm, [THX2T99I012]> { 4800b57cec5SDimitry Andric let Latency = 1; 4810b57cec5SDimitry Andric let NumMicroOps = 2; 4820b57cec5SDimitry Andric} 4830b57cec5SDimitry Andric 4840b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], 4850b57cec5SDimitry Andric (instrs MOVKWi, MOVKXi, MOVNWi, MOVNXi, MOVZWi, MOVZXi)>; 4860b57cec5SDimitry Andric 4870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], 4880b57cec5SDimitry Andric (instrs ASRVWr, ASRVXr, LSLVWr, LSLVXr, RORVWr, RORVXr)>; 4890b57cec5SDimitry Andric 4900b57cec5SDimitry Andric// Variable shift 4910b57cec5SDimitry Andricdef : WriteRes<WriteIS, [THX2T99I012]> { 4920b57cec5SDimitry Andric let Latency = 1; 4930b57cec5SDimitry Andric let NumMicroOps = 2; 4940b57cec5SDimitry Andric} 4950b57cec5SDimitry Andric 4960b57cec5SDimitry Andric//--- 4970b57cec5SDimitry Andric// 3.4 Divide and Multiply Instructions 4980b57cec5SDimitry Andric//--- 4990b57cec5SDimitry Andric 5000b57cec5SDimitry Andric// Divide, W-form 5010b57cec5SDimitry Andric// Latency range of 13-23/13-39. 5020b57cec5SDimitry Andricdef : WriteRes<WriteID32, [THX2T99I1]> { 5030b57cec5SDimitry Andric let Latency = 39; 5040b57cec5SDimitry Andric let ResourceCycles = [39]; 5050b57cec5SDimitry Andric let NumMicroOps = 4; 5060b57cec5SDimitry Andric} 5070b57cec5SDimitry Andric 5080b57cec5SDimitry Andric// Divide, X-form 5090b57cec5SDimitry Andricdef : WriteRes<WriteID64, [THX2T99I1]> { 5100b57cec5SDimitry Andric let Latency = 23; 5110b57cec5SDimitry Andric let ResourceCycles = [23]; 5120b57cec5SDimitry Andric let NumMicroOps = 4; 5130b57cec5SDimitry Andric} 5140b57cec5SDimitry Andric 5150b57cec5SDimitry Andric// Multiply accumulate, W-form 5160b57cec5SDimitry Andricdef : WriteRes<WriteIM32, [THX2T99I012]> { 5170b57cec5SDimitry Andric let Latency = 5; 5180b57cec5SDimitry Andric let NumMicroOps = 3; 5190b57cec5SDimitry Andric} 5200b57cec5SDimitry Andric 5210b57cec5SDimitry Andric// Multiply accumulate, X-form 5220b57cec5SDimitry Andricdef : WriteRes<WriteIM64, [THX2T99I012]> { 5230b57cec5SDimitry Andric let Latency = 5; 5240b57cec5SDimitry Andric let NumMicroOps = 3; 5250b57cec5SDimitry Andric} 5260b57cec5SDimitry Andric 5270b57cec5SDimitry Andric//def : InstRW<[WriteIM32, ReadIM, ReadIM, ReadIMA, THX2T99Write_5Cyc_I012], 5280b57cec5SDimitry Andric// (instrs MADDWrrr, MSUBWrrr)>; 5290b57cec5SDimitry Andricdef : InstRW<[WriteIM32], (instrs MADDWrrr, MSUBWrrr)>; 5300b57cec5SDimitry Andricdef : InstRW<[WriteIM32], (instrs MADDXrrr, MSUBXrrr)>; 5310b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_I012], 5320b57cec5SDimitry Andric (instregex "(S|U)(MADDL|MSUBL)rrr")>; 5330b57cec5SDimitry Andric 5340b57cec5SDimitry Andricdef : InstRW<[WriteID32], (instrs SDIVWr, UDIVWr)>; 5350b57cec5SDimitry Andricdef : InstRW<[WriteID64], (instrs SDIVXr, UDIVXr)>; 5360b57cec5SDimitry Andric 5370b57cec5SDimitry Andric// Bitfield extract, two reg 5380b57cec5SDimitry Andricdef : WriteRes<WriteExtr, [THX2T99I012]> { 5390b57cec5SDimitry Andric let Latency = 1; 5400b57cec5SDimitry Andric let NumMicroOps = 2; 5410b57cec5SDimitry Andric} 5420b57cec5SDimitry Andric 5430b57cec5SDimitry Andric// Multiply high 5440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_I1], (instrs SMULHrr, UMULHrr)>; 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andric// Miscellaneous Data-Processing Instructions 5470b57cec5SDimitry Andric// Bitfield extract 5480b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], (instrs EXTRWrri, EXTRXrri)>; 5490b57cec5SDimitry Andric 5500b57cec5SDimitry Andric// Bitifield move - basic 5510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], 5520b57cec5SDimitry Andric (instrs SBFMWri, SBFMXri, UBFMWri, UBFMXri)>; 5530b57cec5SDimitry Andric 5540b57cec5SDimitry Andric// Bitfield move, insert 5550b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], (instregex "^BFM")>; 5560b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], (instregex "(S|U)?BFM.*")>; 5570b57cec5SDimitry Andric 5580b57cec5SDimitry Andric// Count leading 5590b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_3Cyc_I1], (instregex "^CLS(W|X)r$", 5600b57cec5SDimitry Andric "^CLZ(W|X)r$")>; 5610b57cec5SDimitry Andric 5620b57cec5SDimitry Andric// Reverse bits 5630b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_I012], (instrs RBITWr, RBITXr)>; 5640b57cec5SDimitry Andric 5650b57cec5SDimitry Andric// Cryptography Extensions 5660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F1], (instregex "^AES[DE]")>; 5670b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F1], (instregex "^AESI?MC")>; 5680b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F1], (instregex "^PMULL")>; 5690b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F1], (instregex "^SHA1SU0")>; 5700b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F1], (instregex "^SHA1(H|SU1)")>; 5710b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F1], (instregex "^SHA1[CMP]")>; 5720b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F1], (instregex "^SHA256SU0")>; 5730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F1], (instregex "^SHA256(H|H2|SU1)")>; 5740b57cec5SDimitry Andric 5750b57cec5SDimitry Andric// CRC Instructions 5760b57cec5SDimitry Andric// def : InstRW<[THX2T99Write_4Cyc_I1], (instregex "^CRC32", "^CRC32C")>; 5770b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_I1], 5780b57cec5SDimitry Andric (instrs CRC32Brr, CRC32Hrr, CRC32Wrr, CRC32Xrr)>; 5790b57cec5SDimitry Andric 5800b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_I1], 5810b57cec5SDimitry Andric (instrs CRC32CBrr, CRC32CHrr, CRC32CWrr, CRC32CXrr)>; 5820b57cec5SDimitry Andric 5830b57cec5SDimitry Andric// Reverse bits/bytes 5840b57cec5SDimitry Andric// NOTE: Handled by WriteI. 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andric//--- 5870b57cec5SDimitry Andric// 3.6 Load Instructions 5880b57cec5SDimitry Andric// 3.10 FP Load Instructions 5890b57cec5SDimitry Andric//--- 5900b57cec5SDimitry Andric 5910b57cec5SDimitry Andric// Load register, literal 5920b57cec5SDimitry Andric// Load register, unscaled immed 5930b57cec5SDimitry Andric// Load register, immed unprivileged 5940b57cec5SDimitry Andric// Load register, unsigned immed 5950b57cec5SDimitry Andricdef : WriteRes<WriteLD, [THX2T99LS01]> { 5960b57cec5SDimitry Andric let Latency = 4; 5970b57cec5SDimitry Andric let NumMicroOps = 4; 5980b57cec5SDimitry Andric} 5990b57cec5SDimitry Andric 6000b57cec5SDimitry Andric// Load register, immed post-index 6010b57cec5SDimitry Andric// NOTE: Handled by WriteLD, WriteI. 6020b57cec5SDimitry Andric// Load register, immed pre-index 6030b57cec5SDimitry Andric// NOTE: Handled by WriteLD, WriteAdr. 6040b57cec5SDimitry Andricdef : WriteRes<WriteAdr, [THX2T99I012]> { 6050b57cec5SDimitry Andric let Latency = 1; 6060b57cec5SDimitry Andric let NumMicroOps = 2; 6070b57cec5SDimitry Andric} 6080b57cec5SDimitry Andric 6090b57cec5SDimitry Andric// Load pair, immed offset, normal 6100b57cec5SDimitry Andric// Load pair, immed offset, signed words, base != SP 6110b57cec5SDimitry Andric// Load pair, immed offset signed words, base = SP 6120b57cec5SDimitry Andric// LDP only breaks into *one* LS micro-op. Thus 6130b57cec5SDimitry Andric// the resources are handled by WriteLD. 6140b57cec5SDimitry Andricdef : WriteRes<WriteLDHi, []> { 6150b57cec5SDimitry Andric let Latency = 5; 6160b57cec5SDimitry Andric let NumMicroOps = 5; 6170b57cec5SDimitry Andric} 6180b57cec5SDimitry Andric 6190b57cec5SDimitry Andric// Load register offset, basic 6200b57cec5SDimitry Andric// Load register, register offset, scale by 4/8 6210b57cec5SDimitry Andric// Load register, register offset, scale by 2 6220b57cec5SDimitry Andric// Load register offset, extend 6230b57cec5SDimitry Andric// Load register, register offset, extend, scale by 4/8 6240b57cec5SDimitry Andric// Load register, register offset, extend, scale by 2 6250b57cec5SDimitry Andricdef THX2T99WriteLDIdx : SchedWriteVariant<[ 6260b57cec5SDimitry Andric SchedVar<ScaledIdxPred, [THX2T99Write_6Cyc_LS01_I012_I012]>, 6270b57cec5SDimitry Andric SchedVar<NoSchedPred, [THX2T99Write_5Cyc_LS01_I012]>]>; 6280b57cec5SDimitry Andricdef : SchedAlias<WriteLDIdx, THX2T99WriteLDIdx>; 6290b57cec5SDimitry Andric 6300b57cec5SDimitry Andricdef THX2T99ReadAdrBase : SchedReadVariant<[ 6310b57cec5SDimitry Andric SchedVar<ScaledIdxPred, [ReadDefault]>, 6320b57cec5SDimitry Andric SchedVar<NoSchedPred, [ReadDefault]>]>; 6330b57cec5SDimitry Andricdef : SchedAlias<ReadAdrBase, THX2T99ReadAdrBase>; 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andric// Load pair, immed pre-index, normal 6360b57cec5SDimitry Andric// Load pair, immed pre-index, signed words 6370b57cec5SDimitry Andric// Load pair, immed post-index, normal 6380b57cec5SDimitry Andric// Load pair, immed post-index, signed words 6390b57cec5SDimitry Andric// NOTE: Handled by WriteLD, WriteLDHi, WriteAdr. 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDNPDi)>; 6420b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDNPQi)>; 6430b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDNPSi)>; 6440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDNPWi)>; 6450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDNPXi)>; 6460b57cec5SDimitry Andric 6470b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPDi)>; 6480b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPQi)>; 6490b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPSi)>; 6500b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPSWi)>; 6510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPWi)>; 6520b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi], (instrs LDPXi)>; 6530b57cec5SDimitry Andric 6540b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRBui)>; 6550b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRDui)>; 6560b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRHui)>; 6570b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01], (instrs LDRQui)>; 6580b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01], (instrs LDRSui)>; 6590b57cec5SDimitry Andric 6600b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRDl)>; 6610b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRQl)>; 6620b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRWl)>; 6630b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDRXl)>; 6640b57cec5SDimitry Andric 6650b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRBi)>; 6660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRHi)>; 6670b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRWi)>; 6680b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRXi)>; 6690b57cec5SDimitry Andric 6700b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRSBWi)>; 6710b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRSBXi)>; 6720b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRSHWi)>; 6730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRSHXi)>; 6740b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDTRSWi)>; 6750b57cec5SDimitry Andric 6760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 6770b57cec5SDimitry Andric (instrs LDPDpre)>; 6780b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 6790b57cec5SDimitry Andric (instrs LDPQpre)>; 6800b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 6810b57cec5SDimitry Andric (instrs LDPSpre)>; 6820b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 6830b57cec5SDimitry Andric (instrs LDPWpre)>; 6840b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 6850b57cec5SDimitry Andric (instrs LDPWpre)>; 6860b57cec5SDimitry Andric 6870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRBpre)>; 6880b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRDpre)>; 6890b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRHpre)>; 6900b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRQpre)>; 6910b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRSpre)>; 6920b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRWpre)>; 6930b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteAdr], (instrs LDRXpre)>; 6940b57cec5SDimitry Andric 6950b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSBWpre)>; 6960b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSBXpre)>; 6970b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSBWpost)>; 6980b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSBXpost)>; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSHWpre)>; 7010b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSHXpre)>; 7020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSHWpost)>; 7030b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRSHXpost)>; 7040b57cec5SDimitry Andric 7050b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRBBpre)>; 7060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRBBpost)>; 7070b57cec5SDimitry Andric 7080b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRHHpre)>; 7090b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, WriteAdr], (instrs LDRHHpost)>; 7100b57cec5SDimitry Andric 7110b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 7120b57cec5SDimitry Andric (instrs LDPDpost)>; 7130b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 7140b57cec5SDimitry Andric (instrs LDPQpost)>; 7150b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 7160b57cec5SDimitry Andric (instrs LDPSpost)>; 7170b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 7180b57cec5SDimitry Andric (instrs LDPWpost)>; 7190b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteLDHi, WriteAdr], 7200b57cec5SDimitry Andric (instrs LDPXpost)>; 7210b57cec5SDimitry Andric 7220b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRBpost)>; 7230b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRDpost)>; 7240b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRHpost)>; 7250b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRQpost)>; 7260b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRSpost)>; 7270b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRWpost)>; 7280b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012, WriteI], (instrs LDRXpost)>; 7290b57cec5SDimitry Andric 7300b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7310b57cec5SDimitry Andric (instrs LDPDpre)>; 7320b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7330b57cec5SDimitry Andric (instrs LDPQpre)>; 7340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7350b57cec5SDimitry Andric (instrs LDPSpre)>; 7360b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7370b57cec5SDimitry Andric (instrs LDPWpre)>; 7380b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7390b57cec5SDimitry Andric (instrs LDPXpre)>; 7400b57cec5SDimitry Andric 7410b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRBpre)>; 7420b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRDpre)>; 7430b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRHpre)>; 7440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRQpre)>; 7450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRSpre)>; 7460b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRWpre)>; 7470b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteAdr], (instrs LDRXpre)>; 7480b57cec5SDimitry Andric 7490b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7500b57cec5SDimitry Andric (instrs LDPDpost)>; 7510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7520b57cec5SDimitry Andric (instrs LDPQpost)>; 7530b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7540b57cec5SDimitry Andric (instrs LDPSpost)>; 7550b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7560b57cec5SDimitry Andric (instrs LDPWpost)>; 7570b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteLDHi, WriteAdr], 7580b57cec5SDimitry Andric (instrs LDPXpost)>; 7590b57cec5SDimitry Andric 7600b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRBpost)>; 7610b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRDpost)>; 7620b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRHpost)>; 7630b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRQpost)>; 7640b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRSpost)>; 7650b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRWpost)>; 7660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_I012_I012, WriteI], (instrs LDRXpost)>; 7670b57cec5SDimitry Andric 7680b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRBroW)>; 7690b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRDroW)>; 7700b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRHroW)>; 7710b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRHHroW)>; 7720b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRQroW)>; 7730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSroW)>; 7740b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSHWroW)>; 7750b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSHXroW)>; 7760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRWroW)>; 7770b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRXroW)>; 7780b57cec5SDimitry Andric 7790b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRBroX)>; 7800b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRDroX)>; 7810b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRHHroX)>; 7820b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRHroX)>; 7830b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRQroX)>; 7840b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSroX)>; 7850b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSHWroX)>; 7860b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRSHXroX)>; 7870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRWroX)>; 7880b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012, ReadAdrBase], (instrs LDRXroX)>; 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 7910b57cec5SDimitry Andric (instrs LDRBroW)>; 7920b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 7930b57cec5SDimitry Andric (instrs LDRBroW)>; 7940b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 7950b57cec5SDimitry Andric (instrs LDRDroW)>; 7960b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 7970b57cec5SDimitry Andric (instrs LDRHroW)>; 7980b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 7990b57cec5SDimitry Andric (instrs LDRHHroW)>; 8000b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8010b57cec5SDimitry Andric (instrs LDRQroW)>; 8020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8030b57cec5SDimitry Andric (instrs LDRSroW)>; 8040b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8050b57cec5SDimitry Andric (instrs LDRSHWroW)>; 8060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8070b57cec5SDimitry Andric (instrs LDRSHXroW)>; 8080b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8090b57cec5SDimitry Andric (instrs LDRWroW)>; 8100b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8110b57cec5SDimitry Andric (instrs LDRXroW)>; 8120b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8130b57cec5SDimitry Andric (instrs LDRBroX)>; 8140b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8150b57cec5SDimitry Andric (instrs LDRDroX)>; 8160b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8170b57cec5SDimitry Andric (instrs LDRHroX)>; 8180b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8190b57cec5SDimitry Andric (instrs LDRHHroX)>; 8200b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8210b57cec5SDimitry Andric (instrs LDRQroX)>; 8220b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8230b57cec5SDimitry Andric (instrs LDRSroX)>; 8240b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8250b57cec5SDimitry Andric (instrs LDRSHWroX)>; 8260b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8270b57cec5SDimitry Andric (instrs LDRSHXroX)>; 8280b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8290b57cec5SDimitry Andric (instrs LDRWroX)>; 8300b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01_I012_I012, ReadAdrBase], 8310b57cec5SDimitry Andric (instrs LDRXroX)>; 8320b57cec5SDimitry Andric 8330b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURBi)>; 8340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURBBi)>; 8350b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURDi)>; 8360b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURHi)>; 8370b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURHHi)>; 8380b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURQi)>; 8390b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSi)>; 8400b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURXi)>; 8410b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSBWi)>; 8420b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSBXi)>; 8430b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSHWi)>; 8440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSHXi)>; 8450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], (instrs LDURSWi)>; 8460b57cec5SDimitry Andric 8470b57cec5SDimitry Andric//--- 8480b57cec5SDimitry Andric// Prefetch 8490b57cec5SDimitry Andric//--- 8500b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_I012], (instrs PRFMl)>; 8510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_I012], (instrs PRFUMi)>; 8520b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_I012], (instrs PRFMui)>; 8530b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_I012], (instrs PRFMroW)>; 8540b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_I012], (instrs PRFMroX)>; 8550b57cec5SDimitry Andric 8560b57cec5SDimitry Andric//-- 8570b57cec5SDimitry Andric// 3.7 Store Instructions 8580b57cec5SDimitry Andric// 3.11 FP Store Instructions 8590b57cec5SDimitry Andric//-- 8600b57cec5SDimitry Andric 8610b57cec5SDimitry Andric// Store register, unscaled immed 8620b57cec5SDimitry Andric// Store register, immed unprivileged 8630b57cec5SDimitry Andric// Store register, unsigned immed 8640b57cec5SDimitry Andricdef : WriteRes<WriteST, [THX2T99LS01, THX2T99SD]> { 8650b57cec5SDimitry Andric let Latency = 1; 8660b57cec5SDimitry Andric let NumMicroOps = 2; 8670b57cec5SDimitry Andric} 8680b57cec5SDimitry Andric 8690b57cec5SDimitry Andric// Store register, immed post-index 8700b57cec5SDimitry Andric// NOTE: Handled by WriteAdr, WriteST, ReadAdrBase 8710b57cec5SDimitry Andric 8720b57cec5SDimitry Andric// Store register, immed pre-index 8730b57cec5SDimitry Andric// NOTE: Handled by WriteAdr, WriteST 8740b57cec5SDimitry Andric 8750b57cec5SDimitry Andric// Store register, register offset, basic 8760b57cec5SDimitry Andric// Store register, register offset, scaled by 4/8 8770b57cec5SDimitry Andric// Store register, register offset, scaled by 2 8780b57cec5SDimitry Andric// Store register, register offset, extend 8790b57cec5SDimitry Andric// Store register, register offset, extend, scale by 4/8 8800b57cec5SDimitry Andric// Store register, register offset, extend, scale by 1 8810b57cec5SDimitry Andricdef : WriteRes<WriteSTIdx, [THX2T99LS01, THX2T99SD, THX2T99I012]> { 8820b57cec5SDimitry Andric let Latency = 1; 8830b57cec5SDimitry Andric let NumMicroOps = 3; 8840b57cec5SDimitry Andric} 8850b57cec5SDimitry Andric 8860b57cec5SDimitry Andric// Store pair, immed offset, W-form 8870b57cec5SDimitry Andric// Store pair, immed offset, X-form 8880b57cec5SDimitry Andricdef : WriteRes<WriteSTP, [THX2T99LS01, THX2T99SD]> { 8890b57cec5SDimitry Andric let Latency = 1; 8900b57cec5SDimitry Andric let NumMicroOps = 2; 8910b57cec5SDimitry Andric} 8920b57cec5SDimitry Andric 8930b57cec5SDimitry Andric// Store pair, immed post-index, W-form 8940b57cec5SDimitry Andric// Store pair, immed post-index, X-form 8950b57cec5SDimitry Andric// Store pair, immed pre-index, W-form 8960b57cec5SDimitry Andric// Store pair, immed pre-index, X-form 8970b57cec5SDimitry Andric// NOTE: Handled by WriteAdr, WriteSTP. 8980b57cec5SDimitry Andric 8990b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURBi)>; 9000b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURBBi)>; 9010b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURDi)>; 9020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURHi)>; 9030b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURHHi)>; 9040b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURQi)>; 9050b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURSi)>; 9060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURWi)>; 9070b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STURXi)>; 9080b57cec5SDimitry Andric 9090b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01], (instrs STTRBi)>; 9100b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01], (instrs STTRHi)>; 9110b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01], (instrs STTRWi)>; 9120b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01], (instrs STTRXi)>; 9130b57cec5SDimitry Andric 9140b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STNPDi)>; 9150b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STNPQi)>; 9160b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STNPXi)>; 9170b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STNPWi)>; 9180b57cec5SDimitry Andric 9190b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STPDi)>; 9200b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STPQi)>; 9210b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STPXi)>; 9220b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], (instrs STPWi)>; 9230b57cec5SDimitry Andric 9240b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRBui)>; 9250b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRBui)>; 9260b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRDui)>; 9270b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRDui)>; 9280b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRHui)>; 9290b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRHui)>; 9300b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRQui)>; 9310b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRQui)>; 9320b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRXui)>; 9330b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRXui)>; 9340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012_I012], (instrs STRWui)>; 9350b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_I012], (instrs STRWui)>; 9360b57cec5SDimitry Andric 9370b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9380b57cec5SDimitry Andric (instrs STPDpre, STPDpost)>; 9390b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9400b57cec5SDimitry Andric (instrs STPDpre, STPDpost)>; 9410b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9420b57cec5SDimitry Andric (instrs STPDpre, STPDpost)>; 9430b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9440b57cec5SDimitry Andric (instrs STPDpre, STPDpost)>; 9450b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9460b57cec5SDimitry Andric (instrs STPQpre, STPQpost)>; 9470b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9480b57cec5SDimitry Andric (instrs STPQpre, STPQpost)>; 9490b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9500b57cec5SDimitry Andric (instrs STPQpre, STPQpost)>; 9510b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9520b57cec5SDimitry Andric (instrs STPQpre, STPQpost)>; 9530b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9540b57cec5SDimitry Andric (instrs STPSpre, STPSpost)>; 9550b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9560b57cec5SDimitry Andric (instrs STPSpre, STPSpost)>; 9570b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9580b57cec5SDimitry Andric (instrs STPSpre, STPSpost)>; 9590b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9600b57cec5SDimitry Andric (instrs STPSpre, STPSpost)>; 9610b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9620b57cec5SDimitry Andric (instrs STPWpre, STPWpost)>; 9630b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9640b57cec5SDimitry Andric (instrs STPWpre, STPWpost)>; 9650b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9660b57cec5SDimitry Andric (instrs STPWpre, STPWpost)>; 9670b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9680b57cec5SDimitry Andric (instrs STPWpre, STPWpost)>; 9690b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9700b57cec5SDimitry Andric (instrs STPXpre, STPXpost)>; 9710b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9720b57cec5SDimitry Andric (instrs STPXpre, STPXpost)>; 9730b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9740b57cec5SDimitry Andric (instrs STPXpre, STPXpost)>; 9750b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9760b57cec5SDimitry Andric (instrs STPXpre, STPXpost)>; 9770b57cec5SDimitry Andric 9780b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9790b57cec5SDimitry Andric (instrs STRBpre, STRBpost)>; 9800b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9810b57cec5SDimitry Andric (instrs STRBpre, STRBpost)>; 9820b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9830b57cec5SDimitry Andric (instrs STRBpre, STRBpost)>; 9840b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9850b57cec5SDimitry Andric (instrs STRBpre, STRBpost)>; 9860b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9870b57cec5SDimitry Andric (instrs STRBBpre, STRBBpost)>; 9880b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9890b57cec5SDimitry Andric (instrs STRBBpre, STRBBpost)>; 9900b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9910b57cec5SDimitry Andric (instrs STRBBpre, STRBBpost)>; 9920b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 9930b57cec5SDimitry Andric (instrs STRBBpre, STRBBpost)>; 9940b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 9950b57cec5SDimitry Andric (instrs STRDpre, STRDpost)>; 9960b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 9970b57cec5SDimitry Andric (instrs STRDpre, STRDpost)>; 9980b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 9990b57cec5SDimitry Andric (instrs STRDpre, STRDpost)>; 10000b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10010b57cec5SDimitry Andric (instrs STRDpre, STRDpost)>; 10020b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10030b57cec5SDimitry Andric (instrs STRHpre, STRHpost)>; 10040b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10050b57cec5SDimitry Andric (instrs STRHpre, STRHpost)>; 10060b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10070b57cec5SDimitry Andric (instrs STRHpre, STRHpost)>; 10080b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10090b57cec5SDimitry Andric (instrs STRHpre, STRHpost)>; 10100b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10110b57cec5SDimitry Andric (instrs STRHHpre, STRHHpost)>; 10120b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10130b57cec5SDimitry Andric (instrs STRHHpre, STRHHpost)>; 10140b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10150b57cec5SDimitry Andric (instrs STRHHpre, STRHHpost)>; 10160b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10170b57cec5SDimitry Andric (instrs STRHHpre, STRHHpost)>; 10180b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10190b57cec5SDimitry Andric (instrs STRQpre, STRQpost)>; 10200b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10210b57cec5SDimitry Andric (instrs STRQpre, STRQpost)>; 10220b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10230b57cec5SDimitry Andric (instrs STRQpre, STRQpost)>; 10240b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10250b57cec5SDimitry Andric (instrs STRQpre, STRQpost)>; 10260b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10270b57cec5SDimitry Andric (instrs STRSpre, STRSpost)>; 10280b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10290b57cec5SDimitry Andric (instrs STRSpre, STRSpost)>; 10300b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10310b57cec5SDimitry Andric (instrs STRSpre, STRSpost)>; 10320b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10330b57cec5SDimitry Andric (instrs STRSpre, STRSpost)>; 10340b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10350b57cec5SDimitry Andric (instrs STRWpre, STRWpost)>; 10360b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10370b57cec5SDimitry Andric (instrs STRWpre, STRWpost)>; 10380b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10390b57cec5SDimitry Andric (instrs STRWpre, STRWpost)>; 10400b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10410b57cec5SDimitry Andric (instrs STRWpre, STRWpost)>; 10420b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012], 10430b57cec5SDimitry Andric (instrs STRXpre, STRXpost)>; 10440b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10450b57cec5SDimitry Andric (instrs STRXpre, STRXpost)>; 10460b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012], 10470b57cec5SDimitry Andric (instrs STRXpre, STRXpost)>; 10480b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10490b57cec5SDimitry Andric (instrs STRXpre, STRXpost)>; 10500b57cec5SDimitry Andric 10510b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10520b57cec5SDimitry Andric (instrs STRBroW, STRBroX)>; 10530b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10540b57cec5SDimitry Andric (instrs STRBroW, STRBroX)>; 10550b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10560b57cec5SDimitry Andric (instrs STRBBroW, STRBBroX)>; 10570b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10580b57cec5SDimitry Andric (instrs STRBBroW, STRBBroX)>; 10590b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10600b57cec5SDimitry Andric (instrs STRDroW, STRDroX)>; 10610b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10620b57cec5SDimitry Andric (instrs STRDroW, STRDroX)>; 10630b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10640b57cec5SDimitry Andric (instrs STRHroW, STRHroX)>; 10650b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10660b57cec5SDimitry Andric (instrs STRHroW, STRHroX)>; 10670b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10680b57cec5SDimitry Andric (instrs STRHHroW, STRHHroX)>; 10690b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10700b57cec5SDimitry Andric (instrs STRHHroW, STRHHroX)>; 10710b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10720b57cec5SDimitry Andric (instrs STRQroW, STRQroX)>; 10730b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10740b57cec5SDimitry Andric (instrs STRQroW, STRQroX)>; 10750b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10760b57cec5SDimitry Andric (instrs STRSroW, STRSroX)>; 10770b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10780b57cec5SDimitry Andric (instrs STRSroW, STRSroX)>; 10790b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10800b57cec5SDimitry Andric (instrs STRWroW, STRWroX)>; 10810b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10820b57cec5SDimitry Andric (instrs STRWroW, STRWroX)>; 10830b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012, ReadAdrBase], 10840b57cec5SDimitry Andric (instrs STRXroW, STRXroX)>; 10850b57cec5SDimitry Andricdef : InstRW<[WriteAdr, THX2T99Write_1Cyc_LS01_I012_I012, ReadAdrBase], 10860b57cec5SDimitry Andric (instrs STRXroW, STRXroX)>; 10870b57cec5SDimitry Andric 10880b57cec5SDimitry Andric//--- 10890b57cec5SDimitry Andric// 3.8 FP Data Processing Instructions 10900b57cec5SDimitry Andric//--- 10910b57cec5SDimitry Andric 10920b57cec5SDimitry Andric// FP absolute value 10930b57cec5SDimitry Andric// FP min/max 10940b57cec5SDimitry Andric// FP negate 10950b57cec5SDimitry Andricdef : WriteRes<WriteF, [THX2T99F01]> { 10960b57cec5SDimitry Andric let Latency = 5; 10970b57cec5SDimitry Andric let NumMicroOps = 2; 10980b57cec5SDimitry Andric} 10990b57cec5SDimitry Andric 11000b57cec5SDimitry Andric// FP arithmetic 11010b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "^FADD", "^FSUB")>; 11020b57cec5SDimitry Andric 11030b57cec5SDimitry Andric// FP compare 11040b57cec5SDimitry Andricdef : WriteRes<WriteFCmp, [THX2T99F01]> { 11050b57cec5SDimitry Andric let Latency = 5; 11060b57cec5SDimitry Andric let NumMicroOps = 2; 11070b57cec5SDimitry Andric} 11080b57cec5SDimitry Andric 11090b57cec5SDimitry Andric// FP Mul, Div, Sqrt 11100b57cec5SDimitry Andricdef : WriteRes<WriteFDiv, [THX2T99F01]> { 11110b57cec5SDimitry Andric let Latency = 22; 11120b57cec5SDimitry Andric let ResourceCycles = [19]; 11130b57cec5SDimitry Andric} 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andricdef THX2T99XWriteFDiv : SchedWriteRes<[THX2T99F01]> { 11160b57cec5SDimitry Andric let Latency = 16; 11170b57cec5SDimitry Andric let ResourceCycles = [8]; 11180b57cec5SDimitry Andric let NumMicroOps = 4; 11190b57cec5SDimitry Andric} 11200b57cec5SDimitry Andric 11210b57cec5SDimitry Andricdef THX2T99XWriteFDivSP : SchedWriteRes<[THX2T99F01]> { 11220b57cec5SDimitry Andric let Latency = 16; 11230b57cec5SDimitry Andric let ResourceCycles = [8]; 11240b57cec5SDimitry Andric let NumMicroOps = 4; 11250b57cec5SDimitry Andric} 11260b57cec5SDimitry Andric 11270b57cec5SDimitry Andricdef THX2T99XWriteFDivDP : SchedWriteRes<[THX2T99F01]> { 11280b57cec5SDimitry Andric let Latency = 23; 11290b57cec5SDimitry Andric let ResourceCycles = [12]; 11300b57cec5SDimitry Andric let NumMicroOps = 4; 11310b57cec5SDimitry Andric} 11320b57cec5SDimitry Andric 11330b57cec5SDimitry Andricdef THX2T99XWriteFSqrtSP : SchedWriteRes<[THX2T99F01]> { 11340b57cec5SDimitry Andric let Latency = 16; 11350b57cec5SDimitry Andric let ResourceCycles = [8]; 11360b57cec5SDimitry Andric let NumMicroOps = 4; 11370b57cec5SDimitry Andric} 11380b57cec5SDimitry Andric 11390b57cec5SDimitry Andricdef THX2T99XWriteFSqrtDP : SchedWriteRes<[THX2T99F01]> { 11400b57cec5SDimitry Andric let Latency = 23; 11410b57cec5SDimitry Andric let ResourceCycles = [12]; 11420b57cec5SDimitry Andric let NumMicroOps = 4; 11430b57cec5SDimitry Andric} 11440b57cec5SDimitry Andric 11450b57cec5SDimitry Andric// FP divide, S-form 11460b57cec5SDimitry Andric// FP square root, S-form 11470b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFDivSP], (instrs FDIVSrr)>; 11480b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFSqrtSP], (instrs FSQRTSr)>; 11490b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFDivSP], (instregex "^FDIVv.*32$")>; 11500b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFSqrtSP], (instregex "^.*SQRT.*32$")>; 11510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_F01], (instregex "^FDIVSrr", "^FSQRTSr")>; 11520b57cec5SDimitry Andric 11530b57cec5SDimitry Andric// FP divide, D-form 11540b57cec5SDimitry Andric// FP square root, D-form 11550b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFDivDP], (instrs FDIVDrr)>; 11560b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFSqrtDP], (instrs FSQRTDr)>; 11570b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFDivDP], (instregex "^FDIVv.*64$")>; 11580b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFSqrtDP], (instregex "^.*SQRT.*64$")>; 11590b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_23Cyc_F01], (instregex "^FDIVDrr", "^FSQRTDr")>; 11600b57cec5SDimitry Andric 11610b57cec5SDimitry Andric// FP multiply 11620b57cec5SDimitry Andric// FP multiply accumulate 11630b57cec5SDimitry Andricdef : WriteRes<WriteFMul, [THX2T99F01]> { 11640b57cec5SDimitry Andric let Latency = 6; 11650b57cec5SDimitry Andric let ResourceCycles = [2]; 11660b57cec5SDimitry Andric let NumMicroOps = 3; 11670b57cec5SDimitry Andric} 11680b57cec5SDimitry Andric 11690b57cec5SDimitry Andricdef THX2T99XWriteFMul : SchedWriteRes<[THX2T99F01]> { 11700b57cec5SDimitry Andric let Latency = 6; 11710b57cec5SDimitry Andric let ResourceCycles = [2]; 11720b57cec5SDimitry Andric let NumMicroOps = 3; 11730b57cec5SDimitry Andric} 11740b57cec5SDimitry Andric 11750b57cec5SDimitry Andricdef THX2T99XWriteFMulAcc : SchedWriteRes<[THX2T99F01]> { 11760b57cec5SDimitry Andric let Latency = 6; 11770b57cec5SDimitry Andric let ResourceCycles = [2]; 11780b57cec5SDimitry Andric let NumMicroOps = 3; 11790b57cec5SDimitry Andric} 11800b57cec5SDimitry Andric 11810b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFMul], (instregex "^FMUL", "^FNMUL")>; 11820b57cec5SDimitry Andricdef : InstRW<[THX2T99XWriteFMulAcc], 11830b57cec5SDimitry Andric (instregex "^FMADD", "^FMSUB", "^FNMADD", "^FNMSUB")>; 11840b57cec5SDimitry Andric 11850b57cec5SDimitry Andric// FP round to integral 11860b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 11870b57cec5SDimitry Andric (instregex "^FRINT(A|I|M|N|P|X|Z)(Sr|Dr)")>; 11880b57cec5SDimitry Andric 11890b57cec5SDimitry Andric// FP select 11900b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_F01], (instregex "^FCSEL")>; 11910b57cec5SDimitry Andric 11920b57cec5SDimitry Andric//--- 11930b57cec5SDimitry Andric// 3.9 FP Miscellaneous Instructions 11940b57cec5SDimitry Andric//--- 11950b57cec5SDimitry Andric 11960b57cec5SDimitry Andric// FP convert, from vec to vec reg 11970b57cec5SDimitry Andric// FP convert, from gen to vec reg 11980b57cec5SDimitry Andric// FP convert, from vec to gen reg 11990b57cec5SDimitry Andricdef : WriteRes<WriteFCvt, [THX2T99F01]> { 12000b57cec5SDimitry Andric let Latency = 7; 12010b57cec5SDimitry Andric let NumMicroOps = 3; 12020b57cec5SDimitry Andric} 12030b57cec5SDimitry Andric 12040b57cec5SDimitry Andric// FP move, immed 12050b57cec5SDimitry Andric// FP move, register 12060b57cec5SDimitry Andricdef : WriteRes<WriteFImm, [THX2T99F01]> { 12070b57cec5SDimitry Andric let Latency = 4; 12080b57cec5SDimitry Andric let NumMicroOps = 2; 12090b57cec5SDimitry Andric} 12100b57cec5SDimitry Andric 12110b57cec5SDimitry Andric// FP transfer, from gen to vec reg 12120b57cec5SDimitry Andric// FP transfer, from vec to gen reg 12130b57cec5SDimitry Andricdef : WriteRes<WriteFCopy, [THX2T99F01]> { 12140b57cec5SDimitry Andric let Latency = 4; 12150b57cec5SDimitry Andric let NumMicroOps = 2; 12160b57cec5SDimitry Andric} 12170b57cec5SDimitry Andric 12180b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instrs FMOVXDHighr, FMOVDXHighr)>; 12190b57cec5SDimitry Andric 12200b57cec5SDimitry Andric//--- 12210b57cec5SDimitry Andric// 3.12 ASIMD Integer Instructions 12220b57cec5SDimitry Andric//--- 12230b57cec5SDimitry Andric 12240b57cec5SDimitry Andric// ASIMD absolute diff, D-form 12250b57cec5SDimitry Andric// ASIMD absolute diff, Q-form 12260b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form 12270b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form 12280b57cec5SDimitry Andric// ASIMD absolute diff accum long 12290b57cec5SDimitry Andric// ASIMD absolute diff long 12300b57cec5SDimitry Andric// ASIMD arith, basic 12310b57cec5SDimitry Andric// ASIMD arith, complex 12320b57cec5SDimitry Andric// ASIMD compare 12330b57cec5SDimitry Andric// ASIMD logical (AND, BIC, EOR) 12340b57cec5SDimitry Andric// ASIMD max/min, basic 12350b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S 12360b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H 12370b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B 12380b57cec5SDimitry Andric// ASIMD multiply, D-form 12390b57cec5SDimitry Andric// ASIMD multiply, Q-form 12400b57cec5SDimitry Andric// ASIMD multiply accumulate long 12410b57cec5SDimitry Andric// ASIMD multiply accumulate saturating long 12420b57cec5SDimitry Andric// ASIMD multiply long 12430b57cec5SDimitry Andric// ASIMD pairwise add and accumulate 12440b57cec5SDimitry Andric// ASIMD shift accumulate 12450b57cec5SDimitry Andric// ASIMD shift by immed, basic 12460b57cec5SDimitry Andric// ASIMD shift by immed and insert, basic, D-form 12470b57cec5SDimitry Andric// ASIMD shift by immed and insert, basic, Q-form 12480b57cec5SDimitry Andric// ASIMD shift by immed, complex 12490b57cec5SDimitry Andric// ASIMD shift by register, basic, D-form 12500b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form 12510b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form 12520b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form 1253349cc55cSDimitry Andricdef : WriteRes<WriteVd, [THX2T99F01]> { 1254349cc55cSDimitry Andric let Latency = 7; 1255349cc55cSDimitry Andric let NumMicroOps = 4; 1256349cc55cSDimitry Andric let ResourceCycles = [4]; 1257349cc55cSDimitry Andric} 1258349cc55cSDimitry Andricdef : WriteRes<WriteVq, [THX2T99F01]> { 12590b57cec5SDimitry Andric let Latency = 7; 12600b57cec5SDimitry Andric let NumMicroOps = 4; 12610b57cec5SDimitry Andric let ResourceCycles = [4]; 12620b57cec5SDimitry Andric} 12630b57cec5SDimitry Andric 12640b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S 12650b57cec5SDimitry Andric// ASIMD arith, reduce, 8B/8H 12660b57cec5SDimitry Andric// ASIMD arith, reduce, 16B 12670b57cec5SDimitry Andric 12680b57cec5SDimitry Andric// ASIMD logical (MVN (alias for NOT), ORN, ORR) 12690b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 12700b57cec5SDimitry Andric (instregex "^ANDv", "^BICv", "^EORv", "^ORRv", "^ORNv", "^NOTv")>; 12710b57cec5SDimitry Andric 12720b57cec5SDimitry Andric// ASIMD arith, reduce 12730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_10Cyc_F01], 12740b57cec5SDimitry Andric (instregex "^ADDVv", "^SADDLVv", "^UADDLVv")>; 12750b57cec5SDimitry Andric 12760b57cec5SDimitry Andric// ASIMD polynomial (8x8) multiply long 12770b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^(S|U|SQD)MULL")>; 12780b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 12790b57cec5SDimitry Andric (instregex "(S|U|SQD)(MLAL|MLSL|MULL)v.*")>; 12800b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F1], (instregex "^PMULL(v8i8|v16i8)")>; 12810b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^PMULL(v1i64|v2i64)")>; 12820b57cec5SDimitry Andric 12830b57cec5SDimitry Andric// ASIMD absolute diff accum, D-form 12840b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 12850b57cec5SDimitry Andric (instregex "^[SU]ABA(v8i8|v4i16|v2i32)$")>; 12860b57cec5SDimitry Andric// ASIMD absolute diff accum, Q-form 12870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 12880b57cec5SDimitry Andric (instregex "^[SU]ABA(v16i8|v8i16|v4i32)$")>; 12890b57cec5SDimitry Andric// ASIMD absolute diff accum long 12900b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 12910b57cec5SDimitry Andric (instregex "^[SU]ABAL")>; 12920b57cec5SDimitry Andric// ASIMD arith, reduce, 4H/4S 12930b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 12940b57cec5SDimitry Andric (instregex "^[SU]?ADDL?V(v8i8|v4i16|v2i32)v$")>; 12950b57cec5SDimitry Andric// ASIMD arith, reduce, 8B 12960b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 12970b57cec5SDimitry Andric (instregex "^[SU]?ADDL?V(v8i16|v4i32)v$")>; 12980b57cec5SDimitry Andric// ASIMD arith, reduce, 16B/16H 12990b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_10Cyc_F01], 13000b57cec5SDimitry Andric (instregex "^[SU]?ADDL?Vv16i8v$")>; 13010b57cec5SDimitry Andric// ASIMD max/min, reduce, 4H/4S 13020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_10Cyc_F01], 13030b57cec5SDimitry Andric (instregex "^[SU](MIN|MAX)V(v4i16|v4i32)v$")>; 13040b57cec5SDimitry Andric// ASIMD max/min, reduce, 8B/8H 13050b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13060b57cec5SDimitry Andric (instregex "^[SU](MIN|MAX)V(v8i8|v8i16)v$")>; 13070b57cec5SDimitry Andric// ASIMD max/min, reduce, 16B/16H 13080b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_10Cyc_F01], 13090b57cec5SDimitry Andric (instregex "^[SU](MIN|MAX)Vv16i8v$")>; 13100b57cec5SDimitry Andric// ASIMD multiply, D-form 13110b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13120b57cec5SDimitry Andric (instregex "^(P?MUL|SQR?DMULH)" # 13130b57cec5SDimitry Andric "(v8i8|v4i16|v2i32|v1i8|v1i16|v1i32|v1i64)" # 13140b57cec5SDimitry Andric "(_indexed)?$")>; 13150b57cec5SDimitry Andric// ASIMD multiply, Q-form 13160b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13170b57cec5SDimitry Andric (instregex "^(P?MUL|SQR?DMULH)(v16i8|v8i16|v4i32)(_indexed)?$")>; 13180b57cec5SDimitry Andric// ASIMD multiply accumulate, D-form 13190b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13200b57cec5SDimitry Andric (instregex "^ML[AS](v8i8|v4i16|v2i32)(_indexed)?$")>; 13210b57cec5SDimitry Andric// ASIMD multiply accumulate, Q-form 13220b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13230b57cec5SDimitry Andric (instregex "^ML[AS](v16i8|v8i16|v4i32)(_indexed)?$")>; 13240b57cec5SDimitry Andric// ASIMD shift accumulate 13250b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13260b57cec5SDimitry Andric (instregex "SRSRAv","SSRAv","URSRAv","USRAv")>; 13270b57cec5SDimitry Andric 13280b57cec5SDimitry Andric// ASIMD shift by immed, basic 13290b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13300b57cec5SDimitry Andric (instregex "RSHRNv","SHRNv", "SQRSHRNv","SQRSHRUNv", 13310b57cec5SDimitry Andric "SQSHRNv","SQSHRUNv", "UQRSHRNv", 13320b57cec5SDimitry Andric "UQSHRNv","SQXTNv","SQXTUNv","UQXTNv")>; 13330b57cec5SDimitry Andric// ASIMD shift by immed, complex 13340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^[SU]?(Q|R){1,2}SHR")>; 13350b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^SQSHLU")>; 13360b57cec5SDimitry Andric// ASIMD shift by register, basic, Q-form 13370b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13380b57cec5SDimitry Andric (instregex "^[SU]SHL(v16i8|v8i16|v4i32|v2i64)")>; 13390b57cec5SDimitry Andric// ASIMD shift by register, complex, D-form 13400b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13410b57cec5SDimitry Andric (instregex "^[SU][QR]{1,2}SHL" # 13420b57cec5SDimitry Andric "(v1i8|v1i16|v1i32|v1i64|v8i8|v4i16|v2i32|b|d|h|s)")>; 13430b57cec5SDimitry Andric// ASIMD shift by register, complex, Q-form 13440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13450b57cec5SDimitry Andric (instregex "^[SU][QR]{1,2}SHL(v16i8|v8i16|v4i32|v2i64)")>; 13460b57cec5SDimitry Andric 13470b57cec5SDimitry Andric// ASIMD Arithmetic 13480b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13490b57cec5SDimitry Andric (instregex "(ADD|SUB)(v8i8|v4i16|v2i32|v1i64)")>; 13500b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13510b57cec5SDimitry Andric (instregex "(ADD|SUB)(v16i8|v8i16|v4i32|v2i64)")>; 13520b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "(ADD|SUB)HNv.*")>; 13530b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "(RADD|RSUB)HNv.*")>; 13540b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13550b57cec5SDimitry Andric (instregex "^SQADD", "^SQNEG", "^SQSUB", "^SRHADD", 13560b57cec5SDimitry Andric "^SUQADD", "^UQADD", "^UQSUB", "^URHADD", "^USQADD")>; 13570b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13580b57cec5SDimitry Andric (instregex "ADDP(v16i8|v8i16|v4i32|v2i64)")>; 13590b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 13600b57cec5SDimitry Andric (instregex "((AND|ORN|EOR|EON)S?(Xr[rsi]|v16i8|v8i16|v4i32)|" # 13610b57cec5SDimitry Andric "(ORR|BIC)S?(Xr[rs]|v16i8|v8i16|v4i32))")>; 13620b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 13630b57cec5SDimitry Andric (instregex "(CLS|CLZ|CNT)(v4i32|v8i16|v16i8)")>; 13640b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^SADALP","^UADALP")>; 13650b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^SADDLPv","^UADDLPv")>; 13660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^SADDLV","^UADDLV")>; 13670b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13680b57cec5SDimitry Andric (instregex "^ADDVv","^SMAXVv","^UMAXVv","^SMINVv","^UMINVv")>; 13690b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13700b57cec5SDimitry Andric (instregex "^SABAv","^UABAv","^SABALv","^UABALv")>; 13710b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13720b57cec5SDimitry Andric (instregex "^SQADDv","^SQSUBv","^UQADDv","^UQSUBv")>; 13730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^SUQADDv","^USQADDv")>; 13740b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13750b57cec5SDimitry Andric (instregex "^ADDHNv","^RADDHNv", "^RSUBHNv", 13760b57cec5SDimitry Andric "^SQABS", "^SQADD", "^SQNEG", "^SQSUB", 13770b57cec5SDimitry Andric "^SRHADD", "^SUBHNv", "^SUQADD", 13780b57cec5SDimitry Andric "^UQADD", "^UQSUB", "^URHADD", "^USQADD")>; 13790b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13800b57cec5SDimitry Andric (instregex "^CMEQv","^CMGEv","^CMGTv", 13810b57cec5SDimitry Andric "^CMLEv","^CMLTv", "^CMHIv","^CMHSv")>; 13820b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13830b57cec5SDimitry Andric (instregex "^SMAXv","^SMINv","^UMAXv","^UMINv", 13840b57cec5SDimitry Andric "^SMAXPv","^SMINPv","^UMAXPv","^UMINPv")>; 13850b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 13860b57cec5SDimitry Andric (instregex "^SABDv","^UABDv", "^SABDLv","^UABDLv")>; 13870b57cec5SDimitry Andric 13880b57cec5SDimitry Andric//--- 13890b57cec5SDimitry Andric// 3.13 ASIMD Floating-point Instructions 13900b57cec5SDimitry Andric//--- 13910b57cec5SDimitry Andric 13920b57cec5SDimitry Andric// ASIMD FP absolute value 13930b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FABSv")>; 13940b57cec5SDimitry Andric 13950b57cec5SDimitry Andric// ASIMD FP arith, normal, D-form 13960b57cec5SDimitry Andric// ASIMD FP arith, normal, Q-form 13970b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], 13980b57cec5SDimitry Andric (instregex "^FABDv", "^FADDv", "^FSUBv")>; 13990b57cec5SDimitry Andric 14000b57cec5SDimitry Andric// ASIMD FP arith,pairwise, D-form 14010b57cec5SDimitry Andric// ASIMD FP arith, pairwise, Q-form 14020b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "^FADDPv")>; 14030b57cec5SDimitry Andric 14040b57cec5SDimitry Andric// ASIMD FP compare, D-form 14050b57cec5SDimitry Andric// ASIMD FP compare, Q-form 14060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FACGEv", "^FACGTv")>; 14070b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FCMEQv", "^FCMGEv", 14080b57cec5SDimitry Andric "^FCMGTv", "^FCMLEv", 14090b57cec5SDimitry Andric "^FCMLTv")>; 14100b57cec5SDimitry Andric 14110b57cec5SDimitry Andric// ASIMD FP round, D-form 14120b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 14130b57cec5SDimitry Andric (instregex "^FRINT[AIMNPXZ](v2f32)")>; 14140b57cec5SDimitry Andric// ASIMD FP round, Q-form 14150b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 14160b57cec5SDimitry Andric (instregex "^FRINT[AIMNPXZ](v4f32|v2f64)")>; 14170b57cec5SDimitry Andric 14180b57cec5SDimitry Andric// ASIMD FP convert, long 14190b57cec5SDimitry Andric// ASIMD FP convert, narrow 14200b57cec5SDimitry Andric// ASIMD FP convert, other, D-form 14210b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form 14220b57cec5SDimitry Andric// NOTE: Handled by WriteV. 14230b57cec5SDimitry Andric 14240b57cec5SDimitry Andric// ASIMD FP convert, long and narrow 14250b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^FCVT(L|N|XN)v")>; 14260b57cec5SDimitry Andric// ASIMD FP convert, other, D-form 14270b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 14280b57cec5SDimitry Andric (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v2f32|v1i32|v2i32|v1i64)")>; 14290b57cec5SDimitry Andric// ASIMD FP convert, other, Q-form 14300b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 14310b57cec5SDimitry Andric (instregex "^[FVSU]CVT([AMNPZ][SU])?(_Int)?(v4f32|v2f64|v4i32|v2i64)")>; 14320b57cec5SDimitry Andric 14330b57cec5SDimitry Andric// ASIMD FP divide, D-form, F32 14340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_F01], (instrs FDIVv2f32)>; 14350b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_F01], (instregex "FDIVv2f32")>; 14360b57cec5SDimitry Andric 14370b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F32 14380b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_F01], (instrs FDIVv4f32)>; 14390b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_F01], (instregex "FDIVv4f32")>; 14400b57cec5SDimitry Andric 14410b57cec5SDimitry Andric// ASIMD FP divide, Q-form, F64 14420b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_23Cyc_F01], (instrs FDIVv2f64)>; 14430b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_23Cyc_F01], (instregex "FDIVv2f64")>; 14440b57cec5SDimitry Andric 14450b57cec5SDimitry Andric// ASIMD FP max/min, normal, D-form 14460b57cec5SDimitry Andric// ASIMD FP max/min, normal, Q-form 14470b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FMAXv", "^FMAXNMv", 14480b57cec5SDimitry Andric "^FMINv", "^FMINNMv")>; 14490b57cec5SDimitry Andric 14500b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, D-form 14510b57cec5SDimitry Andric// ASIMD FP max/min, pairwise, Q-form 14520b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FMAXPv", "^FMAXNMPv", 14530b57cec5SDimitry Andric "^FMINPv", "^FMINNMPv")>; 14540b57cec5SDimitry Andric 14550b57cec5SDimitry Andric// ASIMD FP max/min, reduce 14560b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FMAXVv", "^FMAXNMVv", 14570b57cec5SDimitry Andric "^FMINVv", "^FMINNMVv")>; 14580b57cec5SDimitry Andric 14590b57cec5SDimitry Andric// ASIMD FP multiply, D-form, FZ 14600b57cec5SDimitry Andric// ASIMD FP multiply, D-form, no FZ 14610b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, FZ 14620b57cec5SDimitry Andric// ASIMD FP multiply, Q-form, no FZ 14630b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "^FMULv", "^FMULXv")>; 14640b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], 14650b57cec5SDimitry Andric (instregex "^FMULX?(v2f32|v1i32|v2i32|v1i64|32|64)")>; 14660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], 14670b57cec5SDimitry Andric (instregex "^FMULX?(v4f32|v2f64|v4i32|v2i64)")>; 14680b57cec5SDimitry Andric 14690b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Dform, FZ 14700b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Dform, no FZ 14710b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Qform, FZ 14720b57cec5SDimitry Andric// ASIMD FP multiply accumulate, Qform, no FZ 14730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "^FMLAv", "^FMLSv")>; 14740b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], 14750b57cec5SDimitry Andric (instregex "^FML[AS](v2f32|v1i32|v2i32|v1i64)")>; 14760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], 14770b57cec5SDimitry Andric (instregex "^FML[AS](v4f32|v2f64|v4i32|v2i64)")>; 14780b57cec5SDimitry Andric 14790b57cec5SDimitry Andric// ASIMD FP negate 14800b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FNEGv")>; 14810b57cec5SDimitry Andric 14820b57cec5SDimitry Andric//-- 14830b57cec5SDimitry Andric// 3.14 ASIMD Miscellaneous Instructions 14840b57cec5SDimitry Andric//-- 14850b57cec5SDimitry Andric 14860b57cec5SDimitry Andric// ASIMD bit reverse 14870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^RBITv")>; 14880b57cec5SDimitry Andric 14890b57cec5SDimitry Andric// ASIMD bitwise insert, D-form 14900b57cec5SDimitry Andric// ASIMD bitwise insert, Q-form 14910b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 14925ffd83dbSDimitry Andric (instregex "^BIFv", "^BITv", "^BSLv", "^BSPv")>; 14930b57cec5SDimitry Andric 14940b57cec5SDimitry Andric// ASIMD count, D-form 14950b57cec5SDimitry Andric// ASIMD count, Q-form 14960b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 14970b57cec5SDimitry Andric (instregex "^CLSv", "^CLZv", "^CNTv")>; 14980b57cec5SDimitry Andric 14990b57cec5SDimitry Andric// ASIMD duplicate, gen reg 15000b57cec5SDimitry Andric// ASIMD duplicate, element 15010b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^DUPv")>; 150204eeddc0SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^DUP(i8|i16|i32|i64)$")>; 15030b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^DUPv.+gpr")>; 15040b57cec5SDimitry Andric 15050b57cec5SDimitry Andric// ASIMD extract 15060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^EXTv")>; 15070b57cec5SDimitry Andric 15080b57cec5SDimitry Andric// ASIMD extract narrow 15090b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], (instregex "^XTNv")>; 15100b57cec5SDimitry Andric 15110b57cec5SDimitry Andric// ASIMD extract narrow, saturating 15120b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_F01], 15130b57cec5SDimitry Andric (instregex "^SQXTNv", "^SQXTUNv", "^UQXTNv")>; 15140b57cec5SDimitry Andric 15150b57cec5SDimitry Andric// ASIMD insert, element to element 15160b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^INSv")>; 15170b57cec5SDimitry Andric 15180b57cec5SDimitry Andric// ASIMD transfer, element to gen reg 15190b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^[SU]MOVv")>; 15200b57cec5SDimitry Andric 15210b57cec5SDimitry Andric// ASIMD move, integer immed 15220b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^MOVIv")>; 15230b57cec5SDimitry Andric 15240b57cec5SDimitry Andric// ASIMD move, FP immed 15250b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^FMOVv")>; 15260b57cec5SDimitry Andric 15270b57cec5SDimitry Andric// ASIMD reciprocal estimate, D-form 15280b57cec5SDimitry Andric// ASIMD reciprocal estimate, Q-form 15290b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 15300b57cec5SDimitry Andric (instregex "^FRECPEv", "^FRECPXv", "^URECPEv", 15310b57cec5SDimitry Andric "^FRSQRTEv", "^URSQRTEv")>; 15320b57cec5SDimitry Andric 15330b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, FZ 15340b57cec5SDimitry Andric// ASIMD reciprocal step, D-form, no FZ 15350b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, FZ 15360b57cec5SDimitry Andric// ASIMD reciprocal step, Q-form, no FZ 15370b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "^FRECPSv", "^FRSQRTSv")>; 15380b57cec5SDimitry Andric 15390b57cec5SDimitry Andric// ASIMD reverse 15400b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], 15410b57cec5SDimitry Andric (instregex "^REV16v", "^REV32v", "^REV64v")>; 15420b57cec5SDimitry Andric 15430b57cec5SDimitry Andric// ASIMD table lookup, D-form 15440b57cec5SDimitry Andric// ASIMD table lookup, Q-form 15450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_F01], (instregex "^TBLv", "^TBXv")>; 15460b57cec5SDimitry Andric 15470b57cec5SDimitry Andric// ASIMD transfer, element to word or word 15480b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^[SU]MOVv")>; 15490b57cec5SDimitry Andric 15500b57cec5SDimitry Andric// ASIMD transfer, element to gen reg 15510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_F01], (instregex "(S|U)MOVv.*")>; 15520b57cec5SDimitry Andric 15530b57cec5SDimitry Andric// ASIMD transfer gen reg to element 15540b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^INSv")>; 15550b57cec5SDimitry Andric 15560b57cec5SDimitry Andric// ASIMD transpose 15570b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^TRN1v", "^TRN2v", 15580b57cec5SDimitry Andric "^UZP1v", "^UZP2v")>; 15590b57cec5SDimitry Andric 15600b57cec5SDimitry Andric// ASIMD unzip/zip 15610b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_F01], (instregex "^ZIP1v", "^ZIP2v")>; 15620b57cec5SDimitry Andric 15630b57cec5SDimitry Andric//-- 15640b57cec5SDimitry Andric// 3.15 ASIMD Load Instructions 15650b57cec5SDimitry Andric//-- 15660b57cec5SDimitry Andric 15670b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, D-form 15680b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 1 reg, Q-form 15690b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], 15700b57cec5SDimitry Andric (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 15710b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01, WriteAdr], 15720b57cec5SDimitry Andric (instregex "^LD1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 15730b57cec5SDimitry Andric 15740b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, D-form 15750b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 2 reg, Q-form 15760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01], 15770b57cec5SDimitry Andric (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 15780b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_4Cyc_LS01, WriteAdr], 15790b57cec5SDimitry Andric (instregex "^LD1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 15800b57cec5SDimitry Andric 15810b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, D-form 15820b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 3 reg, Q-form 15830b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01], 15840b57cec5SDimitry Andric (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 15850b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01, WriteAdr], 15860b57cec5SDimitry Andric (instregex "^LD1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 15870b57cec5SDimitry Andric 15880b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, D-form 15890b57cec5SDimitry Andric// ASIMD load, 1 element, multiple, 4 reg, Q-form 15900b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01], 15910b57cec5SDimitry Andric (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 15920b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01, WriteAdr], 15930b57cec5SDimitry Andric (instregex "^LD1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 15940b57cec5SDimitry Andric 15950b57cec5SDimitry Andric// ASIMD load, 1 element, one lane, B/H/S 15960b57cec5SDimitry Andric// ASIMD load, 1 element, one lane, D 15970b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01], (instregex "^LD1i(8|16|32|64)$")>; 15980b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01, WriteAdr], 15990b57cec5SDimitry Andric (instregex "^LD1i(8|16|32|64)_POST$")>; 16000b57cec5SDimitry Andric 16010b57cec5SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, B/H/S 16020b57cec5SDimitry Andric// ASIMD load, 1 element, all lanes, D-form, D 16030b57cec5SDimitry Andric// ASIMD load, 1 element, all lanes, Q-form 16040b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01], 16050b57cec5SDimitry Andric (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01, WriteAdr], 16070b57cec5SDimitry Andric (instregex "^LD1Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16080b57cec5SDimitry Andric 16090b57cec5SDimitry Andric// ASIMD load, 2 element, multiple, D-form, B/H/S 16100b57cec5SDimitry Andric// ASIMD load, 2 element, multiple, Q-form, D 16110b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01], 16120b57cec5SDimitry Andric (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 16130b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01, WriteAdr], 16140b57cec5SDimitry Andric (instregex "^LD2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 16150b57cec5SDimitry Andric 16160b57cec5SDimitry Andric// ASIMD load, 2 element, one lane, B/H 16170b57cec5SDimitry Andric// ASIMD load, 2 element, one lane, S 16180b57cec5SDimitry Andric// ASIMD load, 2 element, one lane, D 16190b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01], (instregex "^LD2i(8|16|32|64)$")>; 16200b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01, WriteAdr], 16210b57cec5SDimitry Andric (instregex "^LD2i(8|16|32|64)_POST$")>; 16220b57cec5SDimitry Andric 16230b57cec5SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, B/H/S 16240b57cec5SDimitry Andric// ASIMD load, 2 element, all lanes, D-form, D 16250b57cec5SDimitry Andric// ASIMD load, 2 element, all lanes, Q-form 16260b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01], 16270b57cec5SDimitry Andric (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16280b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_5Cyc_LS01_F01, WriteAdr], 16290b57cec5SDimitry Andric (instregex "^LD2Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16300b57cec5SDimitry Andric 16310b57cec5SDimitry Andric// ASIMD load, 3 element, multiple, D-form, B/H/S 16320b57cec5SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, B/H/S 16330b57cec5SDimitry Andric// ASIMD load, 3 element, multiple, Q-form, D 16340b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_LS01_F01], 16350b57cec5SDimitry Andric (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 16360b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_LS01_F01, WriteAdr], 16370b57cec5SDimitry Andric (instregex "^LD3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 16380b57cec5SDimitry Andric 16390b57cec5SDimitry Andric// ASIMD load, 3 element, one lone, B/H 16400b57cec5SDimitry Andric// ASIMD load, 3 element, one lane, S 16410b57cec5SDimitry Andric// ASIMD load, 3 element, one lane, D 16420b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_LS01_F01], (instregex "^LD3i(8|16|32|64)$")>; 16430b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_LS01_F01, WriteAdr], 16440b57cec5SDimitry Andric (instregex "^LD3i(8|16|32|64)_POST$")>; 16450b57cec5SDimitry Andric 16460b57cec5SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, B/H/S 16470b57cec5SDimitry Andric// ASIMD load, 3 element, all lanes, D-form, D 16480b57cec5SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, B/H/S 16490b57cec5SDimitry Andric// ASIMD load, 3 element, all lanes, Q-form, D 16500b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_LS01_F01], 16510b57cec5SDimitry Andric (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16520b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_7Cyc_LS01_F01, WriteAdr], 16530b57cec5SDimitry Andric (instregex "^LD3Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16540b57cec5SDimitry Andric 16550b57cec5SDimitry Andric// ASIMD load, 4 element, multiple, D-form, B/H/S 16560b57cec5SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, B/H/S 16570b57cec5SDimitry Andric// ASIMD load, 4 element, multiple, Q-form, D 16580b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_LS01_F01], 16590b57cec5SDimitry Andric (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 16600b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_LS01_F01, WriteAdr], 16610b57cec5SDimitry Andric (instregex "^LD4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 16620b57cec5SDimitry Andric 16630b57cec5SDimitry Andric// ASIMD load, 4 element, one lane, B/H 16640b57cec5SDimitry Andric// ASIMD load, 4 element, one lane, S 16650b57cec5SDimitry Andric// ASIMD load, 4 element, one lane, D 16660b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_F01], (instregex "^LD4i(8|16|32|64)$")>; 16670b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_F01, WriteAdr], 16680b57cec5SDimitry Andric (instregex "^LD4i(8|16|32|64)_POST$")>; 16690b57cec5SDimitry Andric 16700b57cec5SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, B/H/S 16710b57cec5SDimitry Andric// ASIMD load, 4 element, all lanes, D-form, D 16720b57cec5SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, B/H/S 16730b57cec5SDimitry Andric// ASIMD load, 4 element, all lanes, Q-form, D 16740b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_F01], 16750b57cec5SDimitry Andric (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_6Cyc_LS01_F01, WriteAdr], 16770b57cec5SDimitry Andric (instregex "^LD4Rv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16780b57cec5SDimitry Andric 16790b57cec5SDimitry Andric//-- 16800b57cec5SDimitry Andric// 3.16 ASIMD Store Instructions 16810b57cec5SDimitry Andric//-- 16820b57cec5SDimitry Andric 16830b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, D-form 16840b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 1 reg, Q-form 16850b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], 16860b57cec5SDimitry Andric (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16870b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01, WriteAdr], 16880b57cec5SDimitry Andric (instregex "^ST1Onev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16890b57cec5SDimitry Andric 16900b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, D-form 16910b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 2 reg, Q-form 16920b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], 16930b57cec5SDimitry Andric (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 16940b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01, WriteAdr], 16950b57cec5SDimitry Andric (instregex "^ST1Twov(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 16960b57cec5SDimitry Andric 16970b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, D-form 16980b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 3 reg, Q-form 16990b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], 17000b57cec5SDimitry Andric (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 17010b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01, WriteAdr], 17020b57cec5SDimitry Andric (instregex "^ST1Threev(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 17030b57cec5SDimitry Andric 17040b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, D-form 17050b57cec5SDimitry Andric// ASIMD store, 1 element, multiple, 4 reg, Q-form 17060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01], 17070b57cec5SDimitry Andric (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)$")>; 17080b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01, WriteAdr], 17090b57cec5SDimitry Andric (instregex "^ST1Fourv(8b|4h|2s|1d|16b|8h|4s|2d)_POST$")>; 17100b57cec5SDimitry Andric 17110b57cec5SDimitry Andric// ASIMD store, 1 element, one lane, B/H/S 17120b57cec5SDimitry Andric// ASIMD store, 1 element, one lane, D 17130b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], 17140b57cec5SDimitry Andric (instregex "^ST1i(8|16|32|64)$")>; 17150b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17160b57cec5SDimitry Andric (instregex "^ST1i(8|16|32|64)_POST$")>; 17170b57cec5SDimitry Andric 17180b57cec5SDimitry Andric// ASIMD store, 2 element, multiple, D-form, B/H/S 17190b57cec5SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, B/H/S 17200b57cec5SDimitry Andric// ASIMD store, 2 element, multiple, Q-form, D 17210b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], 17220b57cec5SDimitry Andric (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)$")>; 17230b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17240b57cec5SDimitry Andric (instregex "^ST2Twov(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 17250b57cec5SDimitry Andric 17260b57cec5SDimitry Andric// ASIMD store, 2 element, one lane, B/H/S 17270b57cec5SDimitry Andric// ASIMD store, 2 element, one lane, D 17280b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], 17290b57cec5SDimitry Andric (instregex "^ST2i(8|16|32|64)$")>; 17300b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17310b57cec5SDimitry Andric (instregex "^ST2i(8|16|32|64)_POST$")>; 17320b57cec5SDimitry Andric 17330b57cec5SDimitry Andric// ASIMD store, 3 element, multiple, D-form, B/H/S 17340b57cec5SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, B/H/S 17350b57cec5SDimitry Andric// ASIMD store, 3 element, multiple, Q-form, D 17360b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], 17370b57cec5SDimitry Andric (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)$")>; 17380b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17390b57cec5SDimitry Andric (instregex "^ST3Threev(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 17400b57cec5SDimitry Andric 17410b57cec5SDimitry Andric// ASIMD store, 3 element, one lane, B/H 17420b57cec5SDimitry Andric// ASIMD store, 3 element, one lane, S 17430b57cec5SDimitry Andric// ASIMD store, 3 element, one lane, D 17440b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], (instregex "^ST3i(8|16|32|64)$")>; 17450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17460b57cec5SDimitry Andric (instregex "^ST3i(8|16|32|64)_POST$")>; 17470b57cec5SDimitry Andric 17480b57cec5SDimitry Andric// ASIMD store, 4 element, multiple, D-form, B/H/S 17490b57cec5SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, B/H/S 17500b57cec5SDimitry Andric// ASIMD store, 4 element, multiple, Q-form, D 17510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], 17520b57cec5SDimitry Andric (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)$")>; 17530b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17540b57cec5SDimitry Andric (instregex "^ST4Fourv(8b|4h|2s|16b|8h|4s|2d)_POST$")>; 17550b57cec5SDimitry Andric 17560b57cec5SDimitry Andric// ASIMD store, 4 element, one lane, B/H 17570b57cec5SDimitry Andric// ASIMD store, 4 element, one lane, S 17580b57cec5SDimitry Andric// ASIMD store, 4 element, one lane, D 17590b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01], (instregex "^ST4i(8|16|32|64)$")>; 17600b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_1Cyc_LS01_F01, WriteAdr], 17610b57cec5SDimitry Andric (instregex "^ST4i(8|16|32|64)_POST$")>; 17620b57cec5SDimitry Andric 17630b57cec5SDimitry Andric// V8.1a Atomics (LSE) 17640b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 17650b57cec5SDimitry Andric (instrs CASB, CASH, CASW, CASX)>; 17660b57cec5SDimitry Andric 17670b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17680b57cec5SDimitry Andric (instrs CASAB, CASAH, CASAW, CASAX)>; 17690b57cec5SDimitry Andric 17700b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17710b57cec5SDimitry Andric (instrs CASLB, CASLH, CASLW, CASLX)>; 17720b57cec5SDimitry Andric 17730b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 17740b57cec5SDimitry Andric (instrs CASALB, CASALH, CASALW, CASALX)>; 17750b57cec5SDimitry Andric 17760b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17770b57cec5SDimitry Andric (instrs LDLARB, LDLARH, LDLARW, LDLARX)>; 17780b57cec5SDimitry Andric 17790b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 17800b57cec5SDimitry Andric (instrs LDADDB, LDADDH, LDADDW, LDADDX)>; 17810b57cec5SDimitry Andric 17820b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17830b57cec5SDimitry Andric (instrs LDADDAB, LDADDAH, LDADDAW, LDADDAX)>; 17840b57cec5SDimitry Andric 17850b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17860b57cec5SDimitry Andric (instrs LDADDLB, LDADDLH, LDADDLW, LDADDLX)>; 17870b57cec5SDimitry Andric 17880b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 17890b57cec5SDimitry Andric (instrs LDADDALB, LDADDALH, LDADDALW, LDADDALX)>; 17900b57cec5SDimitry Andric 17910b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 17920b57cec5SDimitry Andric (instrs LDCLRB, LDCLRH, LDCLRW, LDCLRX)>; 17930b57cec5SDimitry Andric 17940b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17950b57cec5SDimitry Andric (instrs LDCLRAB, LDCLRAH, LDCLRAW, LDCLRAX)>; 17960b57cec5SDimitry Andric 17970b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 17980b57cec5SDimitry Andric (instrs LDCLRLB, LDCLRLH, LDCLRLW, LDCLRLX)>; 17990b57cec5SDimitry Andric 18000b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 18010b57cec5SDimitry Andric (instrs LDCLRALB, LDCLRALH, LDCLRALW, LDCLRALX)>; 18020b57cec5SDimitry Andric 18030b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18040b57cec5SDimitry Andric (instrs LDEORB, LDEORH, LDEORW, LDEORX)>; 18050b57cec5SDimitry Andric 18060b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18070b57cec5SDimitry Andric (instrs LDEORAB, LDEORAH, LDEORAW, LDEORAX)>; 18080b57cec5SDimitry Andric 18090b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18100b57cec5SDimitry Andric (instrs LDEORLB, LDEORLH, LDEORLW, LDEORLX)>; 18110b57cec5SDimitry Andric 18120b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 18130b57cec5SDimitry Andric (instrs LDEORALB, LDEORALH, LDEORALW, LDEORALX)>; 18140b57cec5SDimitry Andric 18150b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18160b57cec5SDimitry Andric (instrs LDSETB, LDSETH, LDSETW, LDSETX)>; 18170b57cec5SDimitry Andric 18180b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18190b57cec5SDimitry Andric (instrs LDSETAB, LDSETAH, LDSETAW, LDSETAX)>; 18200b57cec5SDimitry Andric 18210b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18220b57cec5SDimitry Andric (instrs LDSETLB, LDSETLH, LDSETLW, LDSETLX)>; 18230b57cec5SDimitry Andric 18240b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 18250b57cec5SDimitry Andric (instrs LDSETALB, LDSETALH, LDSETALW, LDSETALX)>; 18260b57cec5SDimitry Andric 18270b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18280b57cec5SDimitry Andric (instrs LDSMAXB, LDSMAXH, LDSMAXW, LDSMAXX, 18290b57cec5SDimitry Andric LDSMAXAB, LDSMAXAH, LDSMAXAW, LDSMAXAX, 18300b57cec5SDimitry Andric LDSMAXLB, LDSMAXLH, LDSMAXLW, LDSMAXLX, 18310b57cec5SDimitry Andric LDSMAXALB, LDSMAXALH, LDSMAXALW, LDSMAXALX)>; 18320b57cec5SDimitry Andric 18330b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18340b57cec5SDimitry Andric (instrs LDSMINB, LDSMINH, LDSMINW, LDSMINX, 18350b57cec5SDimitry Andric LDSMINAB, LDSMINAH, LDSMINAW, LDSMINAX, 18360b57cec5SDimitry Andric LDSMINLB, LDSMINLH, LDSMINLW, LDSMINLX, 18370b57cec5SDimitry Andric LDSMINALB, LDSMINALH, LDSMINALW, LDSMINALX)>; 18380b57cec5SDimitry Andric 18390b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18400b57cec5SDimitry Andric (instrs LDUMAXB, LDUMAXH, LDUMAXW, LDUMAXX, 18410b57cec5SDimitry Andric LDUMAXAB, LDUMAXAH, LDUMAXAW, LDUMAXAX, 18420b57cec5SDimitry Andric LDUMAXLB, LDUMAXLH, LDUMAXLW, LDUMAXLX, 18430b57cec5SDimitry Andric LDUMAXALB, LDUMAXALH, LDUMAXALW, LDUMAXALX)>; 18440b57cec5SDimitry Andric 18450b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18460b57cec5SDimitry Andric (instrs LDUMINB, LDUMINH, LDUMINW, LDUMINX, 18470b57cec5SDimitry Andric LDUMINAB, LDUMINAH, LDUMINAW, LDUMINAX, 18480b57cec5SDimitry Andric LDUMINLB, LDUMINLH, LDUMINLW, LDUMINLX, 18490b57cec5SDimitry Andric LDUMINALB, LDUMINALH, LDUMINALW, LDUMINALX)>; 18500b57cec5SDimitry Andric 18510b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18520b57cec5SDimitry Andric (instrs SWPB, SWPH, SWPW, SWPX)>; 18530b57cec5SDimitry Andric 18540b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18550b57cec5SDimitry Andric (instrs SWPAB, SWPAH, SWPAW, SWPAX)>; 18560b57cec5SDimitry Andric 18570b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_12Cyc_I012, WriteAtomic], 18580b57cec5SDimitry Andric (instrs SWPLB, SWPLH, SWPLW, SWPLX)>; 18590b57cec5SDimitry Andric 18600b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_16Cyc_I012, WriteAtomic], 18610b57cec5SDimitry Andric (instrs SWPALB, SWPALH, SWPALW, SWPALX)>; 18620b57cec5SDimitry Andric 18630b57cec5SDimitry Andricdef : InstRW<[THX2T99Write_8Cyc_I012, WriteAtomic], 18640b57cec5SDimitry Andric (instrs STLLRB, STLLRH, STLLRW, STLLRX)>; 18650b57cec5SDimitry Andric 18660b57cec5SDimitry Andric} // SchedModel = ThunderX2T99Model 18670b57cec5SDimitry Andric 1868