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