10b57cec5SDimitry Andric//=- SystemZScheduleZ196.td - SystemZ Scheduling Definitions ---*- tblgen -*-=// 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 machine model for Z196 to support instruction 100b57cec5SDimitry Andric// scheduling and other instruction cost heuristics. 110b57cec5SDimitry Andric// 120b57cec5SDimitry Andric// Pseudos expanded right after isel do not need to be modelled here. 130b57cec5SDimitry Andric// 140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 150b57cec5SDimitry Andric 160b57cec5SDimitry Andricdef Z196Model : SchedMachineModel { 170b57cec5SDimitry Andric 180b57cec5SDimitry Andric let UnsupportedFeatures = Arch9UnsupportedFeatures.List; 190b57cec5SDimitry Andric 200b57cec5SDimitry Andric let IssueWidth = 3; 210b57cec5SDimitry Andric let MicroOpBufferSize = 40; // Issue queues 220b57cec5SDimitry Andric let LoadLatency = 1; // Optimistic load latency. 230b57cec5SDimitry Andric 240b57cec5SDimitry Andric let PostRAScheduler = 1; 250b57cec5SDimitry Andric 260b57cec5SDimitry Andric // Extra cycles for a mispredicted branch. 270b57cec5SDimitry Andric let MispredictPenalty = 16; 280b57cec5SDimitry Andric} 290b57cec5SDimitry Andric 300b57cec5SDimitry Andriclet SchedModel = Z196Model in { 310b57cec5SDimitry Andric// These definitions need the SchedModel value. They could be put in a 320b57cec5SDimitry Andric// subtarget common include file, but it seems the include system in Tablegen 330b57cec5SDimitry Andric// currently (2016) rejects multiple includes of same file. 340b57cec5SDimitry Andric 350b57cec5SDimitry Andric// Decoder grouping rules 360b57cec5SDimitry Andriclet NumMicroOps = 1 in { 370b57cec5SDimitry Andric def : WriteRes<NormalGr, []>; 380b57cec5SDimitry Andric def : WriteRes<BeginGroup, []> { let BeginGroup = 1; } 390b57cec5SDimitry Andric def : WriteRes<EndGroup, []> { let EndGroup = 1; } 400b57cec5SDimitry Andric} 410b57cec5SDimitry Andricdef : WriteRes<GroupAlone, []> { 420b57cec5SDimitry Andric let NumMicroOps = 3; 430b57cec5SDimitry Andric let BeginGroup = 1; 440b57cec5SDimitry Andric let EndGroup = 1; 450b57cec5SDimitry Andric} 460b57cec5SDimitry Andricdef : WriteRes<GroupAlone2, []> { 470b57cec5SDimitry Andric let NumMicroOps = 6; 480b57cec5SDimitry Andric let BeginGroup = 1; 490b57cec5SDimitry Andric let EndGroup = 1; 500b57cec5SDimitry Andric} 510b57cec5SDimitry Andricdef : WriteRes<GroupAlone3, []> { 520b57cec5SDimitry Andric let NumMicroOps = 9; 530b57cec5SDimitry Andric let BeginGroup = 1; 540b57cec5SDimitry Andric let EndGroup = 1; 550b57cec5SDimitry Andric} 560b57cec5SDimitry Andric 570b57cec5SDimitry Andric// Incoming latency removed from the register operand which is used together 580b57cec5SDimitry Andric// with a memory operand by the instruction. 590b57cec5SDimitry Andricdef : ReadAdvance<RegReadAdv, 4>; 600b57cec5SDimitry Andric 610b57cec5SDimitry Andric// LoadLatency (above) is not used for instructions in this file. This is 620b57cec5SDimitry Andric// instead the role of LSULatency, which is the latency value added to the 630b57cec5SDimitry Andric// result of loads and instructions with folded memory operands. 640b57cec5SDimitry Andricdef : WriteRes<LSULatency, []> { let Latency = 4; let NumMicroOps = 0; } 650b57cec5SDimitry Andric 660b57cec5SDimitry Andriclet NumMicroOps = 0 in { 670b57cec5SDimitry Andric foreach L = 1-30 in { 680b57cec5SDimitry Andric def : WriteRes<!cast<SchedWrite>("WLat"#L), []> { let Latency = L; } 690b57cec5SDimitry Andric } 700b57cec5SDimitry Andric} 710b57cec5SDimitry Andric 720b57cec5SDimitry Andric// Execution units. 730b57cec5SDimitry Andricdef Z196_FXUnit : ProcResource<2>; 740b57cec5SDimitry Andricdef Z196_LSUnit : ProcResource<2>; 750b57cec5SDimitry Andricdef Z196_FPUnit : ProcResource<1>; 760b57cec5SDimitry Andricdef Z196_DFUnit : ProcResource<1>; 770b57cec5SDimitry Andricdef Z196_MCD : ProcResource<1>; 780b57cec5SDimitry Andric 790b57cec5SDimitry Andric// Subtarget specific definitions of scheduling resources. 800b57cec5SDimitry Andriclet NumMicroOps = 0 in { 810b57cec5SDimitry Andric def : WriteRes<FXU, [Z196_FXUnit]>; 820b57cec5SDimitry Andric def : WriteRes<LSU, [Z196_LSUnit]>; 830b57cec5SDimitry Andric def : WriteRes<FPU, [Z196_FPUnit]>; 840b57cec5SDimitry Andric def : WriteRes<DFU, [Z196_DFUnit]>; 855f757f3fSDimitry Andric foreach Num = 2-6 in { let ReleaseAtCycles = [Num] in { 860b57cec5SDimitry Andric def : WriteRes<!cast<SchedWrite>("FXU"#Num), [Z196_FXUnit]>; 870b57cec5SDimitry Andric def : WriteRes<!cast<SchedWrite>("LSU"#Num), [Z196_LSUnit]>; 880b57cec5SDimitry Andric def : WriteRes<!cast<SchedWrite>("FPU"#Num), [Z196_FPUnit]>; 890b57cec5SDimitry Andric def : WriteRes<!cast<SchedWrite>("DFU"#Num), [Z196_DFUnit]>; 900b57cec5SDimitry Andric }} 910b57cec5SDimitry Andric} 920b57cec5SDimitry Andric 930b57cec5SDimitry Andricdef : WriteRes<MCD, [Z196_MCD]> { let NumMicroOps = 3; 940b57cec5SDimitry Andric let BeginGroup = 1; 950b57cec5SDimitry Andric let EndGroup = 1; } 960b57cec5SDimitry Andric 970b57cec5SDimitry Andric// -------------------------- INSTRUCTIONS ---------------------------------- // 980b57cec5SDimitry Andric 990b57cec5SDimitry Andric// InstRW constructs have been used in order to preserve the 1000b57cec5SDimitry Andric// readability of the InstrInfo files. 1010b57cec5SDimitry Andric 1020b57cec5SDimitry Andric// For each instruction, as matched by a regexp, provide a list of 1030b57cec5SDimitry Andric// resources that it needs. These will be combined into a SchedClass. 1040b57cec5SDimitry Andric 1050b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1060b57cec5SDimitry Andric// Stack allocation 1070b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1080b57cec5SDimitry Andric 1090b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ADJDYNALLOC$")>; // Pseudo -> LA / LAY 1100b57cec5SDimitry Andric 1110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1120b57cec5SDimitry Andric// Branch instructions 1130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1140b57cec5SDimitry Andric 1150b57cec5SDimitry Andric// Branch 1160b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "(Call)?BRC(L)?(Asm.*)?$")>; 1170b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "(Call)?J(G)?(Asm.*)?$")>; 1180b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "(Call)?BC(R)?(Asm.*)?$")>; 1190b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "(Call)?B(R)?(Asm.*)?$")>; 1200b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], (instregex "BRCT(G|H)?$")>; 1210b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], (instregex "BCT(G)?(R)?$")>; 1220b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU3, LSU, GroupAlone2], 1230b57cec5SDimitry Andric (instregex "B(R)?X(H|L).*$")>; 1240b57cec5SDimitry Andric 1250b57cec5SDimitry Andric// Compare and branch 1260b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], 1270b57cec5SDimitry Andric (instregex "C(L)?(G)?(I|R)J(Asm.*)?$")>; 1280b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], 1290b57cec5SDimitry Andric (instregex "C(L)?(G)?(I|R)B(Call|Return|Asm.*)?$")>; 1300b57cec5SDimitry Andric 1310b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1320b57cec5SDimitry Andric// Trap instructions 1330b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1340b57cec5SDimitry Andric 1350b57cec5SDimitry Andric// Trap 1360b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "(Cond)?Trap$")>; 1370b57cec5SDimitry Andric 1380b57cec5SDimitry Andric// Compare and trap 1390b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "C(G)?(I|R)T(Asm.*)?$")>; 1400b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CL(G)?RT(Asm.*)?$")>; 1410b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CL(F|G)IT(Asm.*)?$")>; 1420b57cec5SDimitry Andric 1430b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1440b57cec5SDimitry Andric// Call and return instructions 1450b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1460b57cec5SDimitry Andric 1470b57cec5SDimitry Andric// Call 1480b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, FXU2, GroupAlone], (instregex "(Call)?BRAS$")>; 149fe6060f1SDimitry Andricdef : InstRW<[WLat1, LSU, FXU2, GroupAlone], (instregex "(Call)?BRASL(_XPLINK64)?$")>; 15081ad6265SDimitry Andricdef : InstRW<[WLat1, LSU, FXU2, GroupAlone], (instregex "(Call)?BAS(R)?(_XPLINK64|_STACKEXT)?$")>; 1510b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, FXU2, GroupAlone], (instregex "TLS_(G|L)DCALL$")>; 1520b57cec5SDimitry Andric 1530b57cec5SDimitry Andric// Return 15481ad6265SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "Return(_XPLINK)?$")>; 15581ad6265SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "CondReturn(_XPLINK)?$")>; 1560b57cec5SDimitry Andric 1570b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1580b57cec5SDimitry Andric// Move instructions 1590b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 1600b57cec5SDimitry Andric 1610b57cec5SDimitry Andric// Moves 1620b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "MV(G|H)?HI$")>; 1630b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "MVI(Y)?$")>; 1640b57cec5SDimitry Andric 1650b57cec5SDimitry Andric// Move character 1660b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU3, GroupAlone], (instregex "MVC$")>; 1670b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "MVCL(E|U)?$")>; 1680b57cec5SDimitry Andric 1690b57cec5SDimitry Andric// Pseudo -> reg move 1700b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "COPY(_TO_REGCLASS)?$")>; 1710b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "EXTRACT_SUBREG$")>; 1720b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "INSERT_SUBREG$")>; 1730b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "REG_SEQUENCE$")>; 1740b57cec5SDimitry Andric 1750b57cec5SDimitry Andric// Loads 1760b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "L(Y|FH|RL|Mux)?$")>; 1770b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LG(RL)?$")>; 1780b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "L128$")>; 1790b57cec5SDimitry Andric 1800b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LLIH(F|H|L)$")>; 1810b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LLIL(F|H|L)$")>; 1820b57cec5SDimitry Andric 1830b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LG(F|H)I$")>; 1840b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LHI(Mux)?$")>; 185e8d8bef9SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LR$")>; 1860b57cec5SDimitry Andric 1870b57cec5SDimitry Andric// Load and test 1880b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, LSU, FXU, NormalGr], (instregex "LT(G)?$")>; 1890b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LT(G)?R$")>; 1900b57cec5SDimitry Andric 1910b57cec5SDimitry Andric// Stores 1920b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STG(RL)?$")>; 1930b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "ST128$")>; 1940b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "ST(Y|FH|RL|Mux)?$")>; 1950b57cec5SDimitry Andric 1960b57cec5SDimitry Andric// String moves. 1970b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "MVST$")>; 1980b57cec5SDimitry Andric 1990b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2000b57cec5SDimitry Andric// Conditional move instructions 2010b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2020b57cec5SDimitry Andric 2030b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU, EndGroup], (instregex "LOC(G)?R(Asm.*)?$")>; 2040b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, RegReadAdv, FXU, LSU, EndGroup], 2050b57cec5SDimitry Andric (instregex "LOC(G)?(Asm.*)?$")>; 2060b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, EndGroup], (instregex "STOC(G)?(Asm.*)?$")>; 2070b57cec5SDimitry Andric 2080b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2090b57cec5SDimitry Andric// Sign extensions 2100b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2110b57cec5SDimitry Andric 2120b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "L(B|H|G)R$")>; 2130b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LG(B|H|F)R$")>; 2140b57cec5SDimitry Andric 2150b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LTGF$")>; 2160b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LTGFR$")>; 2170b57cec5SDimitry Andric 2180b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LB(H|Mux)?$")>; 2190b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LH(Y)?$")>; 2200b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LH(H|Mux|RL)$")>; 2210b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LG(B|H|F)$")>; 2220b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LG(H|F)RL$")>; 2230b57cec5SDimitry Andric 2240b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2250b57cec5SDimitry Andric// Zero extensions 2260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2270b57cec5SDimitry Andric 2280b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LLCR(Mux)?$")>; 2290b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LLHR(Mux)?$")>; 2300b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LLG(C|H|F|T)R$")>; 2310b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LLC(Mux)?$")>; 2320b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LLH(Mux)?$")>; 2330b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LL(C|H)H$")>; 2340b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LLHRL$")>; 2350b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LLG(C|H|F|T|HRL|FRL)$")>; 2360b57cec5SDimitry Andric 2370b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2380b57cec5SDimitry Andric// Truncations 2390b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2400b57cec5SDimitry Andric 2410b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STC(H|Y|Mux)?$")>; 2420b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STH(H|Y|RL|Mux)?$")>; 2430b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STCM(H|Y)?$")>; 2440b57cec5SDimitry Andric 2450b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2460b57cec5SDimitry Andric// Multi-register moves 2470b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2480b57cec5SDimitry Andric 2490b57cec5SDimitry Andric// Load multiple (estimated average of 5 ops) 2500b57cec5SDimitry Andricdef : InstRW<[WLat10, WLat10, LSU5, GroupAlone], (instregex "LM(H|Y|G)?$")>; 2510b57cec5SDimitry Andric 2520b57cec5SDimitry Andric// Load multiple disjoint 2530b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "LMD$")>; 2540b57cec5SDimitry Andric 2550b57cec5SDimitry Andric// Store multiple (estimated average of 3 ops) 2560b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU2, FXU5, GroupAlone], (instregex "STM(H|Y|G)?$")>; 2570b57cec5SDimitry Andric 2580b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2590b57cec5SDimitry Andric// Byte swaps 2600b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2610b57cec5SDimitry Andric 2620b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LRV(G)?R$")>; 2630b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "LRV(G|H)?$")>; 2640b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STRV(G|H)?$")>; 2650b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "MVCIN$")>; 2660b57cec5SDimitry Andric 2670b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2680b57cec5SDimitry Andric// Load address instructions 2690b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2700b57cec5SDimitry Andric 2710b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LA(Y|RL)?$")>; 2720b57cec5SDimitry Andric 2730b57cec5SDimitry Andric// Load the Global Offset Table address 2740b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "GOT$")>; 2750b57cec5SDimitry Andric 2760b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2770b57cec5SDimitry Andric// Absolute and Negation 2780b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2790b57cec5SDimitry Andric 2800b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU, NormalGr], (instregex "LP(G)?R$")>; 2810b57cec5SDimitry Andricdef : InstRW<[WLat3, WLat3, FXU2, GroupAlone], (instregex "L(N|P)GFR$")>; 2820b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU, NormalGr], (instregex "LN(R|GR)$")>; 2830b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LC(R|GR)$")>; 2840b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU2, GroupAlone], (instregex "LCGFR$")>; 2850b57cec5SDimitry Andric 2860b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2870b57cec5SDimitry Andric// Insertion 2880b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 2890b57cec5SDimitry Andric 2900b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "IC(Y)?$")>; 2910b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 2920b57cec5SDimitry Andric (instregex "IC32(Y)?$")>; 2930b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 2940b57cec5SDimitry Andric (instregex "ICM(H|Y)?$")>; 2950b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "II(F|H|L)Mux$")>; 2960b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IIHF(64)?$")>; 2970b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IIHH(64)?$")>; 2980b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IIHL(64)?$")>; 2990b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IILF(64)?$")>; 3000b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IILH(64)?$")>; 3010b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "IILL(64)?$")>; 3020b57cec5SDimitry Andric 3030b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3040b57cec5SDimitry Andric// Addition 3050b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3060b57cec5SDimitry Andric 3070b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3080b57cec5SDimitry Andric (instregex "A(L)?(Y)?$")>; 3090b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "A(L)?SI$")>; 3100b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 3110b57cec5SDimitry Andric (instregex "AH(Y)?$")>; 3120b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AIH$")>; 3130b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AFI(Mux)?$")>; 3140b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AGFI$")>; 3150b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AGHI(K)?$")>; 3160b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AGR(K)?$")>; 3170b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AHI(K)?$")>; 3180b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AHIMux(K)?$")>; 3190b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AL(FI|HSIK)$")>; 3200b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3210b57cec5SDimitry Andric (instregex "ALGF$")>; 3220b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ALGHSIK$")>; 3230b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ALGF(I|R)$")>; 3240b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ALGR(K)?$")>; 3250b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ALR(K)?$")>; 3260b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "AR(K)?$")>; 3270b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "A(L)?HHHR$")>; 3280b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU2, GroupAlone], (instregex "A(L)?HHLR$")>; 3290b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "ALSIH(N)?$")>; 3300b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3310b57cec5SDimitry Andric (instregex "A(L)?G$")>; 3320b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "A(L)?GSI$")>; 3330b57cec5SDimitry Andric 3340b57cec5SDimitry Andric// Logical addition with carry 3350b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU, LSU, GroupAlone], 3360b57cec5SDimitry Andric (instregex "ALC(G)?$")>; 3370b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU, GroupAlone], (instregex "ALC(G)?R$")>; 3380b57cec5SDimitry Andric 3390b57cec5SDimitry Andric// Add with sign extension (32 -> 64) 3400b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 3410b57cec5SDimitry Andric (instregex "AGF$")>; 3420b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU2, GroupAlone], (instregex "AGFR$")>; 3430b57cec5SDimitry Andric 3440b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3450b57cec5SDimitry Andric// Subtraction 3460b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3470b57cec5SDimitry Andric 3480b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3490b57cec5SDimitry Andric (instregex "S(G|Y)?$")>; 3500b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 3510b57cec5SDimitry Andric (instregex "SH(Y)?$")>; 3520b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SGR(K)?$")>; 3530b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SLFI$")>; 3540b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3550b57cec5SDimitry Andric (instregex "SL(G|GF|Y)?$")>; 3560b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SLGF(I|R)$")>; 3570b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SLGR(K)?$")>; 3580b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SLR(K)?$")>; 3590b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SR(K)?$")>; 3600b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "S(L)?HHHR$")>; 3610b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU2, GroupAlone], (instregex "S(L)?HHLR$")>; 3620b57cec5SDimitry Andric 3630b57cec5SDimitry Andric// Subtraction with borrow 3640b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU, LSU, GroupAlone], 3650b57cec5SDimitry Andric (instregex "SLB(G)?$")>; 3660b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU, GroupAlone], (instregex "SLB(G)?R$")>; 3670b57cec5SDimitry Andric 3680b57cec5SDimitry Andric// Subtraction with sign extension (32 -> 64) 3690b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 3700b57cec5SDimitry Andric (instregex "SGF$")>; 3710b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU2, GroupAlone], (instregex "SGFR$")>; 3720b57cec5SDimitry Andric 3730b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3740b57cec5SDimitry Andric// AND 3750b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3760b57cec5SDimitry Andric 3770b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3780b57cec5SDimitry Andric (instregex "N(G|Y)?$")>; 3790b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NGR(K)?$")>; 3800b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NI(FMux|HMux|LMux)$")>; 3810b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "NI(Y)?$")>; 3820b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NIHF(64)?$")>; 3830b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NIHH(64)?$")>; 3840b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NIHL(64)?$")>; 3850b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NILF(64)?$")>; 3860b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NILH(64)?$")>; 3870b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NILL(64)?$")>; 3880b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "NR(K)?$")>; 3890b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, LSU2, FXU, GroupAlone], (instregex "NC$")>; 3900b57cec5SDimitry Andric 3910b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3920b57cec5SDimitry Andric// OR 3930b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 3940b57cec5SDimitry Andric 3950b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 3960b57cec5SDimitry Andric (instregex "O(G|Y)?$")>; 3970b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OGR(K)?$")>; 3980b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "OI(Y)?$")>; 3990b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OI(FMux|HMux|LMux)$")>; 4000b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OIHF(64)?$")>; 4010b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OIHH(64)?$")>; 4020b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OIHL(64)?$")>; 4030b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OILF(64)?$")>; 4040b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OILH(64)?$")>; 4050b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OILL(64)?$")>; 4060b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "OR(K)?$")>; 4070b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, LSU2, FXU, GroupAlone], (instregex "OC$")>; 4080b57cec5SDimitry Andric 4090b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4100b57cec5SDimitry Andric// XOR 4110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4120b57cec5SDimitry Andric 4130b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 4140b57cec5SDimitry Andric (instregex "X(G|Y)?$")>; 4150b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "XI(Y)?$")>; 4160b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "XIFMux$")>; 4170b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "XGR(K)?$")>; 4180b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "XIHF(64)?$")>; 4190b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "XILF(64)?$")>; 4200b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "XR(K)?$")>; 4210b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, LSU2, FXU, GroupAlone], (instregex "XC$")>; 4220b57cec5SDimitry Andric 4230b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4240b57cec5SDimitry Andric// Multiplication 4250b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4260b57cec5SDimitry Andric 4270b57cec5SDimitry Andricdef : InstRW<[WLat6LSU, RegReadAdv, FXU, LSU, NormalGr], 4280b57cec5SDimitry Andric (instregex "MS(GF|Y)?$")>; 4290b57cec5SDimitry Andricdef : InstRW<[WLat6, FXU, NormalGr], (instregex "MS(R|FI)$")>; 4300b57cec5SDimitry Andricdef : InstRW<[WLat8LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "MSG$")>; 4310b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, NormalGr], (instregex "MSGR$")>; 4320b57cec5SDimitry Andricdef : InstRW<[WLat6, FXU, NormalGr], (instregex "MSGF(I|R)$")>; 4330b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FXU2, LSU, GroupAlone], 4340b57cec5SDimitry Andric (instregex "MLG$")>; 4350b57cec5SDimitry Andricdef : InstRW<[WLat9, FXU2, GroupAlone], (instregex "MLGR$")>; 4360b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, NormalGr], (instregex "MGHI$")>; 4370b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, NormalGr], (instregex "MHI$")>; 4380b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "MH(Y)?$")>; 4390b57cec5SDimitry Andricdef : InstRW<[WLat7, FXU2, GroupAlone], (instregex "M(L)?R$")>; 4400b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, FXU2, LSU, GroupAlone], 4410b57cec5SDimitry Andric (instregex "M(FY|L)?$")>; 4420b57cec5SDimitry Andric 4430b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4440b57cec5SDimitry Andric// Division and remainder 4450b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4460b57cec5SDimitry Andric 4470b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, FXU5, GroupAlone3], (instregex "DR$")>; 4480b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FPU4, LSU, FXU4, GroupAlone3], 4490b57cec5SDimitry Andric (instregex "D$")>; 4500b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, FXU4, GroupAlone3], (instregex "DSG(F)?R$")>; 4510b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FPU4, LSU, FXU3, GroupAlone3], 4520b57cec5SDimitry Andric (instregex "DSG(F)?$")>; 4530b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, FXU5, GroupAlone3], (instregex "DL(G)?R$")>; 4540b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FPU4, LSU, FXU4, GroupAlone3], 4550b57cec5SDimitry Andric (instregex "DL(G)?$")>; 4560b57cec5SDimitry Andric 4570b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4580b57cec5SDimitry Andric// Shifts 4590b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4600b57cec5SDimitry Andric 4610b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SLL(G|K)?$")>; 4620b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SRL(G|K)?$")>; 4630b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "SRA(G|K)?$")>; 4640b57cec5SDimitry Andricdef : InstRW<[WLat2, WLat2, FXU, NormalGr], (instregex "SLA(G|K)?$")>; 4650b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, WLat5LSU, FXU4, LSU, GroupAlone2], 4660b57cec5SDimitry Andric (instregex "S(L|R)D(A|L)$")>; 4670b57cec5SDimitry Andric 4680b57cec5SDimitry Andric// Rotate 4690b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, FXU, LSU, NormalGr], (instregex "RLL(G)?$")>; 4700b57cec5SDimitry Andric 4710b57cec5SDimitry Andric// Rotate and insert 4720b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "RISBH(G|H|L)$")>; 4730b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "RISBL(G|H|L)$")>; 474*0fca6ea1SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "RISBG(32)?(Z)?$")>; 4750b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "RISBMux$")>; 4760b57cec5SDimitry Andric 4770b57cec5SDimitry Andric// Rotate and Select 4780b57cec5SDimitry Andricdef : InstRW<[WLat3, WLat3, FXU2, GroupAlone], (instregex "R(N|O|X)SBG$")>; 4790b57cec5SDimitry Andric 4800b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4810b57cec5SDimitry Andric// Comparison 4820b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 4830b57cec5SDimitry Andric 4840b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "C(G|Y|Mux|RL)?$")>; 4850b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "C(F|H)I(Mux)?$")>; 4860b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CG(F|H)I$")>; 4870b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CG(HSI|RL)$")>; 4880b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "C(G)?R$")>; 4890b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CIH$")>; 4900b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "CHF$")>; 4910b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CHSI$")>; 4920b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], 4930b57cec5SDimitry Andric (instregex "CL(Y|Mux)?$")>; 4940b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLFHSI$")>; 4950b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CLFI(Mux)?$")>; 4960b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "CLG$")>; 4970b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLG(HRL|HSI)$")>; 4980b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "CLGF$")>; 4990b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLGFRL$")>; 5000b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CLGF(I|R)$")>; 5010b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CLGR$")>; 5020b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLGRL$")>; 5030b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, RegReadAdv, FXU, LSU, NormalGr], (instregex "CLHF$")>; 5040b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLH(RL|HSI)$")>; 5050b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CLIH$")>; 5060b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLI(Y)?$")>; 5070b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "CLR$")>; 5080b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "CLRL$")>; 5090b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "C(L)?HHR$")>; 5100b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU2, GroupAlone], (instregex "C(L)?HLR$")>; 5110b57cec5SDimitry Andric 5120b57cec5SDimitry Andric// Compare halfword 5130b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 5140b57cec5SDimitry Andric (instregex "CH(Y)?$")>; 5150b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, FXU2, LSU, GroupAlone], (instregex "CHRL$")>; 5160b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], (instregex "CGH$")>; 5170b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, FXU2, LSU, GroupAlone], (instregex "CGHRL$")>; 5180b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, FXU2, LSU, GroupAlone], (instregex "CHHSI$")>; 5190b57cec5SDimitry Andric 5200b57cec5SDimitry Andric// Compare with sign extension (32 -> 64) 5210b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], (instregex "CGF$")>; 5220b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, FXU2, LSU, GroupAlone], (instregex "CGFRL$")>; 5230b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU2, GroupAlone], (instregex "CGFR$")>; 5240b57cec5SDimitry Andric 5250b57cec5SDimitry Andric// Compare logical character 5260b57cec5SDimitry Andricdef : InstRW<[WLat9, FXU, LSU2, GroupAlone], (instregex "CLC$")>; 5270b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "CLCL(E|U)?$")>; 5280b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "CLST$")>; 5290b57cec5SDimitry Andric 5300b57cec5SDimitry Andric// Test under mask 5310b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, NormalGr], (instregex "TM(Y)?$")>; 5320b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TM(H|L)Mux$")>; 5330b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TMHH(64)?$")>; 5340b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TMHL(64)?$")>; 5350b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TMLH(64)?$")>; 5360b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TMLL(64)?$")>; 5370b57cec5SDimitry Andric 5380b57cec5SDimitry Andric// Compare logical characters under mask 5390b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, RegReadAdv, FXU2, LSU, GroupAlone], 5400b57cec5SDimitry Andric (instregex "CLM(H|Y)?$")>; 5410b57cec5SDimitry Andric 5420b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5430b57cec5SDimitry Andric// Prefetch 5440b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5450b57cec5SDimitry Andric 5460b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, GroupAlone], (instregex "PFD(RL)?$")>; 5470b57cec5SDimitry Andric 5480b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5490b57cec5SDimitry Andric// Atomic operations 5500b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5510b57cec5SDimitry Andric 5520b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "Serialize$")>; 5530b57cec5SDimitry Andric 5540b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LAA(G)?$")>; 5550b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LAAL(G)?$")>; 5560b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LAN(G)?$")>; 5570b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LAO(G)?$")>; 5580b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, WLat1LSU, FXU, LSU, NormalGr], (instregex "LAX(G)?$")>; 5590b57cec5SDimitry Andric 5600b57cec5SDimitry Andric// Test and set 5610b57cec5SDimitry Andricdef : InstRW<[WLat1LSU, FXU, LSU, EndGroup], (instregex "TS$")>; 5620b57cec5SDimitry Andric 5630b57cec5SDimitry Andric// Compare and swap 5640b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, FXU2, LSU, GroupAlone], 5650b57cec5SDimitry Andric (instregex "CS(G|Y)?$")>; 5660b57cec5SDimitry Andric 5670b57cec5SDimitry Andric// Compare double and swap 5680b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, WLat5LSU, FXU5, LSU, GroupAlone2], 5690b57cec5SDimitry Andric (instregex "CDS(Y)?$")>; 5700b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU6, LSU2, GroupAlone], 5710b57cec5SDimitry Andric (instregex "CDSG$")>; 5720b57cec5SDimitry Andric 5730b57cec5SDimitry Andric// Compare and swap and store 5740b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "CSST$")>; 5750b57cec5SDimitry Andric 5760b57cec5SDimitry Andric// Perform locked operation 5770b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PLO$")>; 5780b57cec5SDimitry Andric 5790b57cec5SDimitry Andric// Load/store pair from/to quadword 5800b57cec5SDimitry Andricdef : InstRW<[WLat4LSU, LSU2, GroupAlone], (instregex "LPQ$")>; 5810b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU2, LSU2, GroupAlone], (instregex "STPQ$")>; 5820b57cec5SDimitry Andric 5830b57cec5SDimitry Andric// Load pair disjoint 5840b57cec5SDimitry Andricdef : InstRW<[WLat2LSU, WLat2LSU, LSU2, GroupAlone], (instregex "LPD(G)?$")>; 5850b57cec5SDimitry Andric 5860b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5870b57cec5SDimitry Andric// Translate and convert 5880b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 5890b57cec5SDimitry Andric 5900b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TR$")>; 5910b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "TRT$")>; 5920b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "TRTR$")>; 5930b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "TRE$")>; 5940b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "TRT(R)?E(Opt)?$")>; 5950b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "TR(T|O)(T|O)(Opt)?$")>; 5960b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], 5970b57cec5SDimitry Andric (instregex "CU(12|14|21|24|41|42)(Opt)?$")>; 5980b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "(CUUTF|CUTFU)(Opt)?$")>; 5990b57cec5SDimitry Andric 6000b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6010b57cec5SDimitry Andric// Message-security assist 6020b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6030b57cec5SDimitry Andric 6040b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], 6050b57cec5SDimitry Andric (instregex "KM(C|F|O|CTR)?$")>; 6060b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "(KIMD|KLMD|KMAC|PCC)$")>; 6070b57cec5SDimitry Andric 6080b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6090b57cec5SDimitry Andric// Decimal arithmetic 6100b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6110b57cec5SDimitry Andric 6120b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FXU, DFU2, LSU2, GroupAlone2], 6130b57cec5SDimitry Andric (instregex "CVBG$")>; 6140b57cec5SDimitry Andricdef : InstRW<[WLat20, RegReadAdv, FXU, DFU, LSU, GroupAlone2], 6150b57cec5SDimitry Andric (instregex "CVB(Y)?$")>; 6160b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU3, DFU4, LSU, GroupAlone3], (instregex "CVDG$")>; 6170b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU2, DFU, LSU, GroupAlone3], (instregex "CVD(Y)?$")>; 6180b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU5, GroupAlone], (instregex "MV(N|O|Z)$")>; 6190b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU5, GroupAlone], (instregex "(PACK|PKA|PKU)$")>; 6200b57cec5SDimitry Andricdef : InstRW<[WLat10, LSU5, GroupAlone], (instregex "UNPK(A|U)$")>; 6210b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU5, GroupAlone], (instregex "UNPK$")>; 6220b57cec5SDimitry Andric 6230b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, FXU, DFU4, LSU2, GroupAlone], 6240b57cec5SDimitry Andric (instregex "(A|S|ZA)P$")>; 6250b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, DFU4, LSU2, GroupAlone], (instregex "(M|D)P$")>; 6260b57cec5SDimitry Andricdef : InstRW<[WLat15, FXU2, DFU4, LSU3, GroupAlone], (instregex "SRP$")>; 6270b57cec5SDimitry Andricdef : InstRW<[WLat11, DFU4, LSU2, GroupAlone], (instregex "CP$")>; 6280b57cec5SDimitry Andricdef : InstRW<[WLat5LSU, DFU2, LSU2, GroupAlone], (instregex "TP$")>; 6290b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "ED(MK)?$")>; 6300b57cec5SDimitry Andric 6310b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6320b57cec5SDimitry Andric// Access registers 6330b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6340b57cec5SDimitry Andric 6350b57cec5SDimitry Andric// Extract/set/copy access register 6360b57cec5SDimitry Andricdef : InstRW<[WLat3, LSU, NormalGr], (instregex "(EAR|SAR|CPYA)$")>; 6370b57cec5SDimitry Andric 6380b57cec5SDimitry Andric// Load address extended 6390b57cec5SDimitry Andricdef : InstRW<[WLat5, LSU, FXU, GroupAlone], (instregex "LAE(Y)?$")>; 6400b57cec5SDimitry Andric 6410b57cec5SDimitry Andric// Load/store access multiple (not modeled precisely) 6420b57cec5SDimitry Andricdef : InstRW<[WLat10, WLat10, LSU5, GroupAlone], (instregex "LAM(Y)?$")>; 6430b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU5, LSU5, GroupAlone], (instregex "STAM(Y)?$")>; 6440b57cec5SDimitry Andric 6450b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6460b57cec5SDimitry Andric// Program mask and addressing mode 6470b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6480b57cec5SDimitry Andric 6490b57cec5SDimitry Andric// Insert Program Mask 6500b57cec5SDimitry Andricdef : InstRW<[WLat3, FXU, EndGroup], (instregex "IPM$")>; 6510b57cec5SDimitry Andric 6520b57cec5SDimitry Andric// Set Program Mask 6530b57cec5SDimitry Andricdef : InstRW<[WLat3, LSU, EndGroup], (instregex "SPM$")>; 6540b57cec5SDimitry Andric 6550b57cec5SDimitry Andric// Branch and link 6560b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU2, LSU, GroupAlone], (instregex "BAL(R)?$")>; 6570b57cec5SDimitry Andric 6580b57cec5SDimitry Andric// Test addressing mode 6590b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "TAM$")>; 6600b57cec5SDimitry Andric 6610b57cec5SDimitry Andric// Set addressing mode 6620b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "SAM(24|31|64)$")>; 6630b57cec5SDimitry Andric 6640b57cec5SDimitry Andric// Branch (and save) and set mode. 6650b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], (instregex "BSM$")>; 6660b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU2, LSU, GroupAlone], (instregex "BASSM$")>; 6670b57cec5SDimitry Andric 6680b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6690b57cec5SDimitry Andric// Miscellaneous Instructions. 6700b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6710b57cec5SDimitry Andric 6720b57cec5SDimitry Andric// Find leftmost one 6730b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FXU2, GroupAlone], (instregex "FLOGR$")>; 6740b57cec5SDimitry Andric 6750b57cec5SDimitry Andric// Population count 6760b57cec5SDimitry Andricdef : InstRW<[WLat3, WLat3, FXU, NormalGr], (instregex "POPCNT$")>; 6770b57cec5SDimitry Andric 6780b57cec5SDimitry Andric// String instructions 6790b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "SRST(U)?$")>; 6800b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "CUSE$")>; 6810b57cec5SDimitry Andric 6820b57cec5SDimitry Andric// Various complex instructions 6830b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CFC$")>; 6840b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, WLat30, WLat30, WLat30, MCD], 6850b57cec5SDimitry Andric (instregex "UPT$")>; 6860b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "CKSM$")>; 6870b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, WLat30, MCD], (instregex "CMPSC$")>; 6880b57cec5SDimitry Andric 6890b57cec5SDimitry Andric// Execute 6900b57cec5SDimitry Andricdef : InstRW<[LSU, GroupAlone], (instregex "EX(RL)?$")>; 6910b57cec5SDimitry Andric 6920b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6930b57cec5SDimitry Andric// .insn directive instructions 6940b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 6950b57cec5SDimitry Andric 6960b57cec5SDimitry Andric// An "empty" sched-class will be assigned instead of the "invalid sched-class". 6970b57cec5SDimitry Andric// getNumDecoderSlots() will then return 1 instead of 0. 6980b57cec5SDimitry Andricdef : InstRW<[], (instregex "Insn.*")>; 6990b57cec5SDimitry Andric 7000b57cec5SDimitry Andric 7010b57cec5SDimitry Andric// ----------------------------- Floating point ----------------------------- // 7020b57cec5SDimitry Andric 7030b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7040b57cec5SDimitry Andric// FP: Move instructions 7050b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7060b57cec5SDimitry Andric 7070b57cec5SDimitry Andric// Load zero 7080b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LZ(DR|ER)$")>; 7090b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU2, GroupAlone2], (instregex "LZXR$")>; 7100b57cec5SDimitry Andric 7110b57cec5SDimitry Andric// Load 7120b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LER$")>; 7130b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LD(R|R32|GR)$")>; 7140b57cec5SDimitry Andricdef : InstRW<[WLat3, FXU, NormalGr], (instregex "LGDR$")>; 7150b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU2, GroupAlone2], (instregex "LXR$")>; 7160b57cec5SDimitry Andric 7170b57cec5SDimitry Andric// Load and Test 7180b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, FPU, NormalGr], (instregex "LT(E|D)BR$")>; 7197a6dacacSDimitry Andricdef : InstRW<[WLat10, WLat10, FPU4, GroupAlone], (instregex "LTXBR$")>; 7200b57cec5SDimitry Andric 7210b57cec5SDimitry Andric// Copy sign 7220b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU2, GroupAlone], (instregex "CPSDR(d|s)(d|s)$")>; 7230b57cec5SDimitry Andric 7240b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7250b57cec5SDimitry Andric// FP: Load instructions 7260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7270b57cec5SDimitry Andric 7280b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "L(E|D)(Y|E32)?$")>; 7290b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LX$")>; 7300b57cec5SDimitry Andric 7310b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7320b57cec5SDimitry Andric// FP: Store instructions 7330b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7340b57cec5SDimitry Andric 7350b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "ST(E|D)(Y)?$")>; 7360b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, NormalGr], (instregex "STX$")>; 7370b57cec5SDimitry Andric 7380b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7390b57cec5SDimitry Andric// FP: Conversion instructions 7400b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7410b57cec5SDimitry Andric 7420b57cec5SDimitry Andric// Load rounded 7430b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "LEDBR(A)?$")>; 7440b57cec5SDimitry Andricdef : InstRW<[WLat9, FPU2, NormalGr], (instregex "L(E|D)XBR(A)?$")>; 7450b57cec5SDimitry Andric 7460b57cec5SDimitry Andric// Load lengthened 7470b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, FPU, LSU, NormalGr], (instregex "LDEB$")>; 7480b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "LDEBR$")>; 7490b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, FPU4, LSU, GroupAlone], (instregex "LX(E|D)B$")>; 7500b57cec5SDimitry Andricdef : InstRW<[WLat10, FPU4, GroupAlone], (instregex "LX(E|D)BR$")>; 7510b57cec5SDimitry Andric 7520b57cec5SDimitry Andric// Convert from fixed / logical 7530b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, FPU, GroupAlone], (instregex "C(E|D)(F|G)BR(A)?$")>; 7540b57cec5SDimitry Andricdef : InstRW<[WLat11, FXU, FPU4, GroupAlone2], (instregex "CX(F|G)BR(A?)$")>; 7550b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, FPU, GroupAlone], (instregex "CEL(F|G)BR$")>; 7560b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, FPU, GroupAlone], (instregex "CDL(F|G)BR$")>; 7570b57cec5SDimitry Andricdef : InstRW<[WLat11, FXU, FPU4, GroupAlone2], (instregex "CXL(F|G)BR$")>; 7580b57cec5SDimitry Andric 7590b57cec5SDimitry Andric// Convert to fixed / logical 7600b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU, FPU, GroupAlone], 7610b57cec5SDimitry Andric (instregex "C(F|G)(E|D)BR(A?)$")>; 7620b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU, FPU2, GroupAlone], 7630b57cec5SDimitry Andric (instregex "C(F|G)XBR(A?)$")>; 7640b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU, FPU, GroupAlone], 7650b57cec5SDimitry Andric (instregex "CL(F|G)(E|D)BR$")>; 7660b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU, FPU2, GroupAlone], (instregex "CL(F|G)XBR$")>; 7670b57cec5SDimitry Andric 7680b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7690b57cec5SDimitry Andric// FP: Unary arithmetic 7700b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7710b57cec5SDimitry Andric 7720b57cec5SDimitry Andric// Load Complement / Negative / Positive 7730b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "L(C|N|P)(E|D)BR$")>; 7740b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "L(C|N|P)DFR(_32)?$")>; 7750b57cec5SDimitry Andricdef : InstRW<[WLat10, WLat10, FPU4, GroupAlone], (instregex "L(C|N|P)XBR$")>; 7760b57cec5SDimitry Andric 7770b57cec5SDimitry Andric// Square root 7780b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, LSU, NormalGr], (instregex "SQ(E|D)B$")>; 7790b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, NormalGr], (instregex "SQ(E|D)BR$")>; 7800b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "SQXBR$")>; 7810b57cec5SDimitry Andric 7820b57cec5SDimitry Andric// Load FP integer 7830b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "FI(E|D)BR(A)?$")>; 7840b57cec5SDimitry Andricdef : InstRW<[WLat15, FPU4, GroupAlone], (instregex "FIXBR(A)?$")>; 7850b57cec5SDimitry Andric 7860b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7870b57cec5SDimitry Andric// FP: Binary arithmetic 7880b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 7890b57cec5SDimitry Andric 7900b57cec5SDimitry Andric// Addition 7910b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], 7920b57cec5SDimitry Andric (instregex "A(E|D)B$")>; 7930b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "A(E|D)BR$")>; 7940b57cec5SDimitry Andricdef : InstRW<[WLat20, WLat20, FPU4, GroupAlone], (instregex "AXBR$")>; 7950b57cec5SDimitry Andric 7960b57cec5SDimitry Andric// Subtraction 7970b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], 7980b57cec5SDimitry Andric (instregex "S(E|D)B$")>; 7990b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "S(E|D)BR$")>; 8000b57cec5SDimitry Andricdef : InstRW<[WLat20, WLat20, FPU4, GroupAlone], (instregex "SXBR$")>; 8010b57cec5SDimitry Andric 8020b57cec5SDimitry Andric// Multiply 8030b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], 8040b57cec5SDimitry Andric (instregex "M(D|DE|EE)B$")>; 8050b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "M(D|DE|EE)BR$")>; 8060b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FPU4, LSU, GroupAlone], 8070b57cec5SDimitry Andric (instregex "MXDB$")>; 8080b57cec5SDimitry Andricdef : InstRW<[WLat10, FPU4, GroupAlone], (instregex "MXDBR$")>; 8090b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "MXBR$")>; 8100b57cec5SDimitry Andric 8110b57cec5SDimitry Andric// Multiply and add / subtract 8120b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, RegReadAdv, FPU2, LSU, GroupAlone], 8130b57cec5SDimitry Andric (instregex "M(A|S)EB$")>; 8140b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, GroupAlone], (instregex "M(A|S)EBR$")>; 8150b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, RegReadAdv, FPU2, LSU, GroupAlone], 8160b57cec5SDimitry Andric (instregex "M(A|S)DB$")>; 8170b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, GroupAlone], (instregex "M(A|S)DBR$")>; 8180b57cec5SDimitry Andric 8190b57cec5SDimitry Andric// Division 8200b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FPU, LSU, NormalGr], (instregex "D(E|D)B$")>; 8210b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, NormalGr], (instregex "D(E|D)BR$")>; 8220b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "DXBR$")>; 8230b57cec5SDimitry Andric 8240b57cec5SDimitry Andric// Divide to integer 8250b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "DI(E|D)BR$")>; 8260b57cec5SDimitry Andric 8270b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8280b57cec5SDimitry Andric// FP: Comparisons 8290b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8300b57cec5SDimitry Andric 8310b57cec5SDimitry Andric// Compare 8320b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FPU, LSU, NormalGr], 8330b57cec5SDimitry Andric (instregex "(K|C)(E|D)B$")>; 8340b57cec5SDimitry Andricdef : InstRW<[WLat9, FPU, NormalGr], (instregex "(K|C)(E|D)BR$")>; 8350b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU2, NormalGr], (instregex "(K|C)XBR$")>; 8360b57cec5SDimitry Andric 8370b57cec5SDimitry Andric// Test Data Class 8380b57cec5SDimitry Andricdef : InstRW<[WLat15, FPU, LSU, NormalGr], (instregex "TC(E|D)B$")>; 8390b57cec5SDimitry Andricdef : InstRW<[WLat15, FPU4, LSU, GroupAlone], (instregex "TCXB$")>; 8400b57cec5SDimitry Andric 8410b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8420b57cec5SDimitry Andric// FP: Floating-point control register instructions 8430b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8440b57cec5SDimitry Andric 8450b57cec5SDimitry Andricdef : InstRW<[WLat4, FXU, LSU, GroupAlone], (instregex "EFPC$")>; 8460b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], (instregex "STFPC$")>; 8470b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, GroupAlone], (instregex "SFPC$")>; 8480b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU2, GroupAlone], (instregex "LFPC$")>; 8490b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SFASR$")>; 8500b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "LFAS$")>; 8510b57cec5SDimitry Andricdef : InstRW<[WLat2, FXU, GroupAlone], (instregex "SRNM(B|T)?$")>; 8520b57cec5SDimitry Andric 8530b57cec5SDimitry Andric 8540b57cec5SDimitry Andric// --------------------- Hexadecimal floating point ------------------------- // 8550b57cec5SDimitry Andric 8560b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8570b57cec5SDimitry Andric// HFP: Move instructions 8580b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8590b57cec5SDimitry Andric 8600b57cec5SDimitry Andric// Load and Test 8610b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, FPU, NormalGr], (instregex "LT(E|D)R$")>; 8620b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, FPU4, GroupAlone], (instregex "LTXR$")>; 8630b57cec5SDimitry Andric 8640b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8650b57cec5SDimitry Andric// HFP: Conversion instructions 8660b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8670b57cec5SDimitry Andric 8680b57cec5SDimitry Andric// Load rounded 8690b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "(LEDR|LRER)$")>; 8700b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "LEXR$")>; 8710b57cec5SDimitry Andricdef : InstRW<[WLat9, FPU, NormalGr], (instregex "(LDXR|LRDR)$")>; 8720b57cec5SDimitry Andric 8730b57cec5SDimitry Andric// Load lengthened 8740b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "LDE$")>; 8750b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LDER$")>; 8760b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, FPU4, LSU, GroupAlone], (instregex "LX(E|D)$")>; 8770b57cec5SDimitry Andricdef : InstRW<[WLat9, FPU4, GroupAlone], (instregex "LX(E|D)R$")>; 8780b57cec5SDimitry Andric 8790b57cec5SDimitry Andric// Convert from fixed 8800b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, FPU, GroupAlone], (instregex "C(E|D)(F|G)R$")>; 8810b57cec5SDimitry Andricdef : InstRW<[WLat10, FXU, FPU4, GroupAlone2], (instregex "CX(F|G)R$")>; 8820b57cec5SDimitry Andric 8830b57cec5SDimitry Andric// Convert to fixed 8840b57cec5SDimitry Andricdef : InstRW<[WLat12, WLat12, FXU, FPU, GroupAlone], 8850b57cec5SDimitry Andric (instregex "C(F|G)(E|D)R$")>; 8860b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, FXU, FPU2, GroupAlone], (instregex "C(F|G)XR$")>; 8870b57cec5SDimitry Andric 8880b57cec5SDimitry Andric// Convert BFP to HFP / HFP to BFP. 8890b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "THD(E)?R$")>; 8900b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "TB(E)?DR$")>; 8910b57cec5SDimitry Andric 8920b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8930b57cec5SDimitry Andric// HFP: Unary arithmetic 8940b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 8950b57cec5SDimitry Andric 8960b57cec5SDimitry Andric// Load Complement / Negative / Positive 8970b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "L(C|N|P)(E|D)R$")>; 8980b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, FPU4, GroupAlone], (instregex "L(C|N|P)XR$")>; 8990b57cec5SDimitry Andric 9000b57cec5SDimitry Andric// Halve 9010b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "H(E|D)R$")>; 9020b57cec5SDimitry Andric 9030b57cec5SDimitry Andric// Square root 9040b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, LSU, NormalGr], (instregex "SQ(E|D)$")>; 9050b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, NormalGr], (instregex "SQ(E|D)R$")>; 9060b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "SQXR$")>; 9070b57cec5SDimitry Andric 9080b57cec5SDimitry Andric// Load FP integer 9090b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "FI(E|D)R$")>; 9100b57cec5SDimitry Andricdef : InstRW<[WLat15, FPU4, GroupAlone], (instregex "FIXR$")>; 9110b57cec5SDimitry Andric 9120b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9130b57cec5SDimitry Andric// HFP: Binary arithmetic 9140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9150b57cec5SDimitry Andric 9160b57cec5SDimitry Andric// Addition 9170b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], 9180b57cec5SDimitry Andric (instregex "A(E|D|U|W)$")>; 9190b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "A(E|D|U|W)R$")>; 9200b57cec5SDimitry Andricdef : InstRW<[WLat15, WLat15, FPU4, GroupAlone], (instregex "AXR$")>; 9210b57cec5SDimitry Andric 9220b57cec5SDimitry Andric// Subtraction 9230b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], 9240b57cec5SDimitry Andric (instregex "S(E|D|U|W)$")>; 9250b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FPU, NormalGr], (instregex "S(E|D|U|W)R$")>; 9260b57cec5SDimitry Andricdef : InstRW<[WLat15, WLat15, FPU4, GroupAlone], (instregex "SXR$")>; 9270b57cec5SDimitry Andric 9280b57cec5SDimitry Andric// Multiply 9290b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, FPU, LSU, NormalGr], (instregex "M(D|EE)$")>; 9300b57cec5SDimitry Andricdef : InstRW<[WLat8LSU, RegReadAdv, FPU, LSU, NormalGr], (instregex "M(DE|E)$")>; 9310b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, NormalGr], (instregex "M(D|EE)R$")>; 9320b57cec5SDimitry Andricdef : InstRW<[WLat8, FPU, NormalGr], (instregex "M(DE|E)R$")>; 9330b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FPU4, LSU, GroupAlone], (instregex "MXD$")>; 9340b57cec5SDimitry Andricdef : InstRW<[WLat10, FPU4, GroupAlone], (instregex "MXDR$")>; 9350b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "MXR$")>; 9360b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FPU4, LSU, GroupAlone], (instregex "MY$")>; 9370b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, FPU2, LSU, GroupAlone], 9380b57cec5SDimitry Andric (instregex "MY(H|L)$")>; 9390b57cec5SDimitry Andricdef : InstRW<[WLat10, FPU4, GroupAlone], (instregex "MYR$")>; 9400b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, GroupAlone], (instregex "MY(H|L)R$")>; 9410b57cec5SDimitry Andric 9420b57cec5SDimitry Andric// Multiply and add / subtract 9430b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, RegReadAdv, FPU2, LSU, GroupAlone], 9440b57cec5SDimitry Andric (instregex "M(A|S)(E|D)$")>; 9450b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, GroupAlone], (instregex "M(A|S)(E|D)R$")>; 9460b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, RegReadAdv, FPU4, LSU, GroupAlone], 9470b57cec5SDimitry Andric (instregex "MAY$")>; 9480b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, RegReadAdv, RegReadAdv, FPU2, LSU, GroupAlone], 9490b57cec5SDimitry Andric (instregex "MAY(H|L)$")>; 9500b57cec5SDimitry Andricdef : InstRW<[WLat10, FPU4, GroupAlone], (instregex "MAYR$")>; 9510b57cec5SDimitry Andricdef : InstRW<[WLat7, FPU, GroupAlone], (instregex "MAY(H|L)R$")>; 9520b57cec5SDimitry Andric 9530b57cec5SDimitry Andric// Division 9540b57cec5SDimitry Andricdef : InstRW<[WLat30, RegReadAdv, FPU, LSU, NormalGr], (instregex "D(E|D)$")>; 9550b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU, NormalGr], (instregex "D(E|D)R$")>; 9560b57cec5SDimitry Andricdef : InstRW<[WLat30, FPU4, GroupAlone], (instregex "DXR$")>; 9570b57cec5SDimitry Andric 9580b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9590b57cec5SDimitry Andric// HFP: Comparisons 9600b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9610b57cec5SDimitry Andric 9620b57cec5SDimitry Andric// Compare 9630b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, RegReadAdv, FPU, LSU, NormalGr], (instregex "C(E|D)$")>; 9640b57cec5SDimitry Andricdef : InstRW<[WLat9, FPU, NormalGr], (instregex "C(E|D)R$")>; 9650b57cec5SDimitry Andricdef : InstRW<[WLat15, FPU2, NormalGr], (instregex "CXR$")>; 9660b57cec5SDimitry Andric 9670b57cec5SDimitry Andric 9680b57cec5SDimitry Andric// ------------------------ Decimal floating point -------------------------- // 9690b57cec5SDimitry Andric 9700b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9710b57cec5SDimitry Andric// DFP: Move instructions 9720b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9730b57cec5SDimitry Andric 9740b57cec5SDimitry Andric// Load and Test 9750b57cec5SDimitry Andricdef : InstRW<[WLat4, WLat4, DFU, NormalGr], (instregex "LTDTR$")>; 9760b57cec5SDimitry Andricdef : InstRW<[WLat6, WLat6, DFU4, GroupAlone], (instregex "LTXTR$")>; 9770b57cec5SDimitry Andric 9780b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9790b57cec5SDimitry Andric// DFP: Conversion instructions 9800b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 9810b57cec5SDimitry Andric 9820b57cec5SDimitry Andric// Load rounded 9830b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU, NormalGr], (instregex "LEDTR$")>; 9840b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU2, NormalGr], (instregex "LDXTR$")>; 9850b57cec5SDimitry Andric 9860b57cec5SDimitry Andric// Load lengthened 9870b57cec5SDimitry Andricdef : InstRW<[WLat7, DFU, NormalGr], (instregex "LDETR$")>; 9880b57cec5SDimitry Andricdef : InstRW<[WLat6, DFU4, GroupAlone], (instregex "LXDTR$")>; 9890b57cec5SDimitry Andric 9900b57cec5SDimitry Andric// Convert from fixed / logical 9910b57cec5SDimitry Andricdef : InstRW<[WLat9, FXU, DFU, GroupAlone], (instregex "CDFTR$")>; 9920b57cec5SDimitry Andricdef : InstRW<[WLat30, FXU, DFU, GroupAlone], (instregex "CDGTR(A)?$")>; 9930b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, DFU4, GroupAlone2], (instregex "CXFTR(A)?$")>; 9940b57cec5SDimitry Andricdef : InstRW<[WLat30, FXU, DFU4, GroupAlone2], (instregex "CXGTR(A)?$")>; 9950b57cec5SDimitry Andricdef : InstRW<[WLat9, FXU, DFU, GroupAlone], (instregex "CDL(F|G)TR$")>; 9960b57cec5SDimitry Andricdef : InstRW<[WLat9, FXU, DFU4, GroupAlone2], (instregex "CXLFTR$")>; 9970b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, DFU4, GroupAlone2], (instregex "CXLGTR$")>; 9980b57cec5SDimitry Andric 9990b57cec5SDimitry Andric// Convert to fixed / logical 10000b57cec5SDimitry Andricdef : InstRW<[WLat11, WLat11, FXU, DFU, GroupAlone], (instregex "CFDTR(A)?$")>; 10010b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, FXU, DFU, GroupAlone], (instregex "CGDTR(A)?$")>; 10020b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FXU, DFU2, GroupAlone], (instregex "CFXTR$")>; 10030b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, FXU, DFU2, GroupAlone], (instregex "CGXTR(A)?$")>; 10040b57cec5SDimitry Andricdef : InstRW<[WLat11, WLat11, FXU, DFU, GroupAlone], (instregex "CL(F|G)DTR$")>; 10050b57cec5SDimitry Andricdef : InstRW<[WLat7, WLat7, FXU, DFU2, GroupAlone], (instregex "CL(F|G)XTR$")>; 10060b57cec5SDimitry Andric 10070b57cec5SDimitry Andric// Convert from / to signed / unsigned packed 10080b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, DFU, GroupAlone], (instregex "CD(S|U)TR$")>; 10090b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU2, DFU4, GroupAlone2], (instregex "CX(S|U)TR$")>; 10100b57cec5SDimitry Andricdef : InstRW<[WLat7, FXU, DFU, GroupAlone], (instregex "C(S|U)DTR$")>; 10110b57cec5SDimitry Andricdef : InstRW<[WLat12, FXU2, DFU4, GroupAlone2], (instregex "C(S|U)XTR$")>; 10120b57cec5SDimitry Andric 10130b57cec5SDimitry Andric// Perform floating-point operation 10140b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "PFPO$")>; 10150b57cec5SDimitry Andric 10160b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10170b57cec5SDimitry Andric// DFP: Unary arithmetic 10180b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10190b57cec5SDimitry Andric 10200b57cec5SDimitry Andric// Load FP integer 10210b57cec5SDimitry Andricdef : InstRW<[WLat8, DFU, NormalGr], (instregex "FIDTR$")>; 10220b57cec5SDimitry Andricdef : InstRW<[WLat10, DFU4, GroupAlone], (instregex "FIXTR$")>; 10230b57cec5SDimitry Andric 10240b57cec5SDimitry Andric// Extract biased exponent 10250b57cec5SDimitry Andricdef : InstRW<[WLat7, FXU, DFU, GroupAlone], (instregex "EEDTR$")>; 10260b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, DFU2, GroupAlone], (instregex "EEXTR$")>; 10270b57cec5SDimitry Andric 10280b57cec5SDimitry Andric// Extract significance 10290b57cec5SDimitry Andricdef : InstRW<[WLat7, FXU, DFU, GroupAlone], (instregex "ESDTR$")>; 10300b57cec5SDimitry Andricdef : InstRW<[WLat8, FXU, DFU2, GroupAlone], (instregex "ESXTR$")>; 10310b57cec5SDimitry Andric 10320b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10330b57cec5SDimitry Andric// DFP: Binary arithmetic 10340b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10350b57cec5SDimitry Andric 10360b57cec5SDimitry Andric// Addition 10370b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, DFU, NormalGr], (instregex "ADTR(A)?$")>; 10380b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, DFU4, GroupAlone], (instregex "AXTR(A)?$")>; 10390b57cec5SDimitry Andric 10400b57cec5SDimitry Andric// Subtraction 10410b57cec5SDimitry Andricdef : InstRW<[WLat9, WLat9, DFU, NormalGr], (instregex "SDTR(A)?$")>; 10420b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, DFU4, GroupAlone], (instregex "SXTR(A)?$")>; 10430b57cec5SDimitry Andric 10440b57cec5SDimitry Andric// Multiply 10450b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU, NormalGr], (instregex "MDTR(A)?$")>; 10460b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU4, GroupAlone], (instregex "MXTR(A)?$")>; 10470b57cec5SDimitry Andric 10480b57cec5SDimitry Andric// Division 10490b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU, NormalGr], (instregex "DDTR(A)?$")>; 10500b57cec5SDimitry Andricdef : InstRW<[WLat30, DFU4, GroupAlone], (instregex "DXTR(A)?$")>; 10510b57cec5SDimitry Andric 10520b57cec5SDimitry Andric// Quantize 10530b57cec5SDimitry Andricdef : InstRW<[WLat8, WLat8, DFU, NormalGr], (instregex "QADTR$")>; 10540b57cec5SDimitry Andricdef : InstRW<[WLat10, WLat10, DFU4, GroupAlone], (instregex "QAXTR$")>; 10550b57cec5SDimitry Andric 10560b57cec5SDimitry Andric// Reround 10570b57cec5SDimitry Andricdef : InstRW<[WLat11, WLat11, FXU, DFU, GroupAlone], (instregex "RRDTR$")>; 10580b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, FXU, DFU4, GroupAlone2], (instregex "RRXTR$")>; 10590b57cec5SDimitry Andric 10600b57cec5SDimitry Andric// Shift significand left/right 10610b57cec5SDimitry Andricdef : InstRW<[WLat7LSU, LSU, DFU, GroupAlone], (instregex "S(L|R)DT$")>; 10620b57cec5SDimitry Andricdef : InstRW<[WLat11LSU, LSU, DFU4, GroupAlone], (instregex "S(L|R)XT$")>; 10630b57cec5SDimitry Andric 10640b57cec5SDimitry Andric// Insert biased exponent 10650b57cec5SDimitry Andricdef : InstRW<[WLat5, FXU, DFU, GroupAlone], (instregex "IEDTR$")>; 10660b57cec5SDimitry Andricdef : InstRW<[WLat7, FXU, DFU4, GroupAlone2], (instregex "IEXTR$")>; 10670b57cec5SDimitry Andric 10680b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10690b57cec5SDimitry Andric// DFP: Comparisons 10700b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10710b57cec5SDimitry Andric 10720b57cec5SDimitry Andric// Compare 10730b57cec5SDimitry Andricdef : InstRW<[WLat9, DFU, NormalGr], (instregex "(K|C)DTR$")>; 10740b57cec5SDimitry Andricdef : InstRW<[WLat10, DFU2, NormalGr], (instregex "(K|C)XTR$")>; 10750b57cec5SDimitry Andric 10760b57cec5SDimitry Andric// Compare biased exponent 10770b57cec5SDimitry Andricdef : InstRW<[WLat4, DFU, NormalGr], (instregex "CEDTR$")>; 10780b57cec5SDimitry Andricdef : InstRW<[WLat5, DFU2, NormalGr], (instregex "CEXTR$")>; 10790b57cec5SDimitry Andric 10800b57cec5SDimitry Andric// Test Data Class/Group 10810b57cec5SDimitry Andricdef : InstRW<[WLat9, LSU, DFU, NormalGr], (instregex "TD(C|G)DT$")>; 10820b57cec5SDimitry Andricdef : InstRW<[WLat10, LSU, DFU, NormalGr], (instregex "TD(C|G)ET$")>; 10830b57cec5SDimitry Andricdef : InstRW<[WLat10, LSU, DFU2, NormalGr], (instregex "TD(C|G)XT$")>; 10840b57cec5SDimitry Andric 10850b57cec5SDimitry Andric 10860b57cec5SDimitry Andric// -------------------------------- System ---------------------------------- // 10870b57cec5SDimitry Andric 10880b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10890b57cec5SDimitry Andric// System: Program-Status Word Instructions 10900b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 10910b57cec5SDimitry Andric 10920b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "EPSW$")>; 10930b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "LPSW(E)?$")>; 10940b57cec5SDimitry Andricdef : InstRW<[WLat3, FXU, GroupAlone], (instregex "IPK$")>; 10950b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "SPKA$")>; 10960b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "SSM$")>; 10970b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, LSU, GroupAlone], (instregex "ST(N|O)SM$")>; 10980b57cec5SDimitry Andricdef : InstRW<[WLat3, FXU, NormalGr], (instregex "IAC$")>; 10990b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "SAC(F)?$")>; 11000b57cec5SDimitry Andric 11010b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11020b57cec5SDimitry Andric// System: Control Register Instructions 11030b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11040b57cec5SDimitry Andric 11050b57cec5SDimitry Andricdef : InstRW<[WLat10, WLat10, LSU2, GroupAlone], (instregex "LCTL(G)?$")>; 11060b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU5, LSU5, GroupAlone], (instregex "STCT(L|G)$")>; 11070b57cec5SDimitry Andricdef : InstRW<[LSULatency, LSU, NormalGr], (instregex "E(P|S)A(I)?R$")>; 11080b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SSA(I)?R$")>; 11090b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "ESEA$")>; 11100b57cec5SDimitry Andric 11110b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11120b57cec5SDimitry Andric// System: Prefix-Register Instructions 11130b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11140b57cec5SDimitry Andric 11150b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "S(T)?PX$")>; 11160b57cec5SDimitry Andric 11170b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11180b57cec5SDimitry Andric// System: Storage-Key and Real Memory Instructions 11190b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11200b57cec5SDimitry Andric 11210b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "ISKE$")>; 11220b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "IVSK$")>; 11230b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SSKE(Opt)?$")>; 11240b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "RRB(E|M)$")>; 11250b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PFMF$")>; 11260b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "TB$")>; 11270b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PGIN$")>; 11280b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PGOUT$")>; 11290b57cec5SDimitry Andric 11300b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11310b57cec5SDimitry Andric// System: Dynamic-Address-Translation Instructions 11320b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11330b57cec5SDimitry Andric 11340b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "IPTE(Opt)?(Opt)?$")>; 11350b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "IDTE(Opt)?$")>; 11360b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PTLB$")>; 11370b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "CSP(G)?$")>; 11380b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, WLat30, MCD], (instregex "LPTEA$")>; 11390b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "LRA(Y|G)?$")>; 11400b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STRAG$")>; 11410b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "LURA(G)?$")>; 11420b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STUR(A|G)$")>; 11430b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TPROT$")>; 11440b57cec5SDimitry Andric 11450b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11460b57cec5SDimitry Andric// System: Memory-move Instructions 11470b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11480b57cec5SDimitry Andric 11490b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "MVC(K|P|S)$")>; 11500b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "MVC(S|D)K$")>; 11510b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "MVCOS$")>; 11520b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "MVPG$")>; 11530b57cec5SDimitry Andric 11540b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11550b57cec5SDimitry Andric// System: Address-Space Instructions 11560b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11570b57cec5SDimitry Andric 11580b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "LASP$")>; 11590b57cec5SDimitry Andricdef : InstRW<[WLat1, LSU, GroupAlone], (instregex "PALB$")>; 11600b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PC$")>; 11610b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PR$")>; 11620b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PT(I)?$")>; 11630b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "RP$")>; 11640b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "BS(G|A)$")>; 11650b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TAR$")>; 11660b57cec5SDimitry Andric 11670b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11680b57cec5SDimitry Andric// System: Linkage-Stack Instructions 11690b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11700b57cec5SDimitry Andric 11710b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "BAKR$")>; 11720b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "EREG(G)?$")>; 11730b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "(E|M)STA$")>; 11740b57cec5SDimitry Andric 11750b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11760b57cec5SDimitry Andric// System: Time-Related Instructions 11770b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11780b57cec5SDimitry Andric 11790b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PTFF$")>; 11800b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SCK$")>; 11810b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SCKPF$")>; 11820b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SCKC$")>; 11830b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SPT$")>; 11840b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STCK(F)?$")>; 11850b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STCKE$")>; 11860b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STCKC$")>; 11870b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STPT$")>; 11880b57cec5SDimitry Andric 11890b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11900b57cec5SDimitry Andric// System: CPU-Related Instructions 11910b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 11920b57cec5SDimitry Andric 11930b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STAP$")>; 11940b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STIDP$")>; 11950b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "STSI$")>; 11960b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "STFL(E)?$")>; 11970b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "ECAG$")>; 11980b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "ECTG$")>; 11990b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PTF$")>; 12000b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "PCKMO$")>; 12010b57cec5SDimitry Andric 12020b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12030b57cec5SDimitry Andric// System: Miscellaneous Instructions 12040b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12050b57cec5SDimitry Andric 12060b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SVC$")>; 12070b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, GroupAlone], (instregex "MC$")>; 12080b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "DIAG$")>; 12090b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TRAC(E|G)$")>; 12100b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TRAP(2|4)$")>; 12110b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SIG(P|A)$")>; 12120b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SIE$")>; 12130b57cec5SDimitry Andric 12140b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12150b57cec5SDimitry Andric// System: CPU-Measurement Facility Instructions 12160b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12170b57cec5SDimitry Andric 12180b57cec5SDimitry Andricdef : InstRW<[WLat1, FXU, NormalGr], (instregex "LPP$")>; 12190b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "ECPGA$")>; 12200b57cec5SDimitry Andricdef : InstRW<[WLat30, WLat30, MCD], (instregex "E(C|P)CTR$")>; 12210b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "LCCTL$")>; 12220b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "L(P|S)CTL$")>; 12230b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "Q(S|CTR)I$")>; 12240b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "S(C|P)CTR$")>; 12250b57cec5SDimitry Andric 12260b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12270b57cec5SDimitry Andric// System: I/O Instructions 12280b57cec5SDimitry Andric//===----------------------------------------------------------------------===// 12290b57cec5SDimitry Andric 12300b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "(C|H|R|X)SCH$")>; 12310b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "(M|S|ST|T)SCH$")>; 12320b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "RCHP$")>; 12330b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SCHM$")>; 12340b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "STC(PS|RW)$")>; 12350b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "TPI$")>; 12360b57cec5SDimitry Andricdef : InstRW<[WLat30, MCD], (instregex "SAL$")>; 12370b57cec5SDimitry Andric 1238*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1239*0fca6ea1SDimitry Andric// NOPs 1240*0fca6ea1SDimitry Andric//===----------------------------------------------------------------------===// 1241*0fca6ea1SDimitry Andric 1242*0fca6ea1SDimitry Andricdef : InstRW<[WLat1, LSU, EndGroup], (instregex "NOP(R)?$")>; 12430b57cec5SDimitry Andric} 12440b57cec5SDimitry Andric 1245