/*
 * Copyright (C) 1991 by the University of Waterloo.All rights reserved.
 *
 * opcodes -- symbolic definitions for System/370 instructions
 *
 * Ref. System/370 Reference Summary (GX20-1850), ESA/370 Principles
 *  of Operation (SA22-7200).
 */

#ifndef _OPCODES_H_INCLUDED
#define _OPCODES_H_INCLUDED

#define OP_PR           0x0101  /* program return */
#define OP_UPT          0x0102  /* update tree */
#define OP_SPM          0x0400  /* set program mask */
#define OP_BALR         0x0500  /* branch and link */
#define OP_BCTR         0x0600  /* branch on count */
#define OP_BCR          0x0700  /* branch on condition */
#define OP_SSK          0x0800  /* set storage key */
#define OP_ISK          0x0900  /* insert storage key */
#define OP_SVC          0x0a00  /* supervisor call */
#define OP_BSM          0x0b00  /* branch and set mode */
#define OP_BASSM        0x0c00  /* branch and save and set mode */
#define OP_BASR         0x0d00  /* branch and save */
#define OP_MVCL         0x0e00  /* move long */
#define OP_CLCL         0x0f00  /* compare logical long */

#define OP_LPR          0x1000  /* load positive */
#define OP_LNR          0x1100  /* load negative */
#define OP_LTR          0x1200  /* load and test */
#define OP_LCR          0x1300  /* load complement */
#define OP_NR           0x1400  /* and */
#define OP_CLR          0x1500  /* compare logical */
#define OP_OR           0x1600  /* or */
#define OP_XR           0x1700  /* exclusive or */
#define OP_LR           0x1800  /* load */
#define OP_CR           0x1900  /* compare */
#define OP_AR           0x1a00  /* add */
#define OP_SR           0x1b00  /* subtract */
#define OP_MR           0x1c00  /* multiply */
#define OP_DR           0x1d00  /* divide */
#define OP_ALR          0x1e00  /* add logical */
#define OP_SLR          0x1f00  /* subtract logical */

#define OP_LPDR         0x2000  /* load positive (long) */
#define OP_LNDR         0x2100  /* load negative (long) */
#define OP_LTDR         0x2200  /* load and test (long) */
#define OP_LCDR         0x2300  /* load complement (long) */
#define OP_HDR          0x2400  /* halve (long) */
#define OP_LRDR         0x2500  /* load rounded (extended to long) */
#define OP_MXR          0x2600  /* multiply (extended) */
#define OP_MXDR         0x2700  /* multiply (long to extended) */
#define OP_LDR          0x2800  /* load (long) */
#define OP_CDR          0x2900  /* compare (long) */
#define OP_ADR          0x2a00  /* add normalized (long) */
#define OP_SDR          0x2b00  /* subtract normalized (long) */
#define OP_MDR          0x2c00  /* multiply (long) */
#define OP_DDR          0x2d00  /* divide (long) */
#define OP_AWR          0x2e00  /* add unnormalized (long) */
#define OP_SWR          0x2f00  /* subtract unnormalized (long) */

#define OP_LPER         0x3000  /* load positive (short) */
#define OP_LNER         0x3100  /* load negative (short) */
#define OP_LTER         0x3200  /* load and test (short) */
#define OP_LCER         0x3300  /* load complement (short) */
#define OP_HER          0x3400  /* halve (short) */
#define OP_LRER         0x3500  /* load rounded (long to short) */
#define OP_AXR          0x3600  /* add normalized (extended) */
#define OP_SXR          0x3700  /* subtract normalized (extended) */
#define OP_LER          0x3800  /* load (short) */
#define OP_CER          0x3900  /* compare (short) */
#define OP_AER          0x3a00  /* add normalized (short) */
#define OP_SER          0x3b00  /* subtract normalized (short) */
#define OP_MER          0x3c00  /* multiply (short to long) */
#define OP_DER          0x3d00  /* divide (short) */
#define OP_AUR          0x3e00  /* add unnormalized (short) */
#define OP_SUR          0x3f00  /* subtract unnormalized (short) */

#define OP_STH          0x4000  /* store halfword */
#define OP_LA           0x4100  /* load address */
#define OP_STC          0x4200  /* store character */
#define OP_IC           0x4300  /* insert character */
#define OP_EX           0x4400  /* execute */
#define OP_BAL          0x4500  /* branch and link */
#define OP_BCT          0x4600  /* branch on count */
#define OP_BC           0x4700  /* branch on condition */
#define OP_LH           0x4800  /* load halfword */
#define OP_CH           0x4900  /* compare halfword */
#define OP_AH           0x4a00  /* add halfword */
#define OP_SH           0x4b00  /* subtract halfword */
#define OP_MH           0x4c00  /* multiply halfword */
#define OP_BAS          0x4d00  /* branch and save */
#define OP_CVD          0x4e00  /* convert to decimal */
#define OP_CVB          0x4f00  /* convert to binary */

#define OP_ST           0x5000  /* store */
#define OP_LAE          0x5100  /* load address extended */
#define OP_N            0x5400  /* and */
#define OP_CL           0x5500  /* compare logical */
#define OP_O            0x5600  /* or */
#define OP_X            0x5700  /* exclusive or */
#define OP_L            0x5800  /* load */
#define OP_C            0x5900  /* compare */
#define OP_A            0x5a00  /* add */
#define OP_S            0x5b00  /* subtract */
#define OP_M            0x5c00  /* multiply */
#define OP_D            0x5d00  /* divide */
#define OP_AL           0x5e00  /* add logical */
#define OP_SL           0x5f00  /* subtract logical */

#define OP_STD          0x6000  /* store (long) */
#define OP_MXD          0x6700  /* multiply (long to extended) */
#define OP_LD           0x6800  /* load (long) */
#define OP_CD           0x6900  /* compare (long) */
#define OP_AD           0x6a00  /* add normalized (long) */
#define OP_SD           0x6b00  /* subtract normalized (long) */
#define OP_MD           0x6c00  /* multiply (long) */
#define OP_DD           0x6d00  /* divide (long) */
#define OP_AW           0x6e00  /* add unnormalized (long) */
#define OP_SW           0x6f00  /* subtract unnormalized (long) */

#define OP_STE          0x7000  /* store (short) */
#define OP_LE           0x7800  /* load (short) */
#define OP_CE           0x7900  /* compare (short) */
#define OP_AE           0x7a00  /* add normalized (short) */
#define OP_SE           0x7b00  /* subtract normalized (short) */
#define OP_ME           0x7c00  /* multiply (short to long) */
#define OP_DE           0x7d00  /* divide (short) */
#define OP_AU           0x7e00  /* add unnormalized (short) */
#define OP_SU           0x7f00  /* subtract unnormalized (short) */

#define OP_SSM          0x8000  /* set system mask */
#define OP_LPSW         0x8200  /* load PSW */
#define OP_DIAG         0x8300  /* diagnose */
#define OP_WRD          0x8400  /* write direct */
#define OP_RDD          0x8500  /* read direct */
#define OP_BXH          0x8600  /* branch on index high */
#define OP_BXLE         0x8700  /* branch on index low or equal */
#define OP_SRL          0x8800  /* shift right single logical */
#define OP_SLL          0x8900  /* shift left single logical */
#define OP_SRA          0x8a00  /* shift right single */
#define OP_SLA          0x8b00  /* shift left single */
#define OP_SRDL         0x8c00  /* shift right double logical */
#define OP_SLDL         0x8d00  /* shift left double logical */
#define OP_SRDA         0x8e00  /* shift right double */
#define OP_SLDA         0x8f00  /* shift left double */

#define OP_STM          0x9000  /* store multiple */
#define OP_TM           0x9100  /* test under mask */
#define OP_MVI          0x9200  /* move (immediate) */
#define OP_TS           0x9300  /* test and set */
#define OP_NI           0x9400  /* and (immediate) */
#define OP_CLI          0x9500  /* compare logical (immediate) */
#define OP_OI           0x9600  /* or (immediate) */
#define OP_XI           0x9700  /* exclusive or (immediate) */
#define OP_LM           0x9800  /* load multiple */
#define OP_TRACE        0x9900  /* trace */
#define OP_LAM          0x9a00  /* load access multiple */
#define OP_STAM         0x9b00  /* store access multiple */
#define OP_SIO          0x9c00  /* start I/O */
#define OP_SIOF         0x9c01  /* start I/O fast release */
#define OP_RIO          0x9c02  /* resume I/O */
#define OP_TIO          0x9d00  /* test I/O */
#define OP_CLRIO        0x9d01  /* clear I/O */
#define OP_HIO          0x9e00  /* halt I/O */
#define OP_HDV          0x9e01  /* halt device */
#define OP_TCH          0x9f00  /* test channel */
#define OP_CLRCH        0x9f01  /* clear channel */

#define OP_STNSM        0xac00  /* store then and system mask */
#define OP_STOSM        0xad00  /* store then or system mask */
#define OP_SIGP         0xae00  /* signal processor */
#define OP_MC           0xaf00  /* monitor call */

#define OP_LRA          0xb100  /* load real address */
#define OP_CONCS        0xb200  /* connect channel set */
#define OP_DISCS        0xb201  /* disconnect channel set */
#define OP_STIDP        0xb202  /* store CPU id */
#define OP_STIDC        0xb203  /* store channel id */
#define OP_SCK          0xb204  /* set clock */
#define OP_STCK         0xb205  /* store clock */
#define OP_SCKC         0xb206  /* set clock comparator */
#define OP_STCKC        0xb207  /* store clock comparator */
#define OP_SPT          0xb208  /* set CPU timer */
#define OP_STPT         0xb209  /* store CPU timer */
#define OP_SPKA         0xb20a  /* set PSW key from address */
#define OP_IPK          0xb20b  /* insert PSW key */
#define OP_PTLB         0xb20d  /* purge TLB */
#define OP_SPX          0xb210  /* set prefix */
#define OP_STPX         0xb211  /* store prefix */
#define OP_STAP         0xb212  /* store CPU address */
#define OP_RRB          0xb213  /* reset reference bit */
#define OP_PC           0xb218  /* program call */
#define OP_SAC          0xb219  /* set address space control */
#define OP_CFC          0xb21a  /* compare and form codeword */
#define OP_IPTE         0xb221  /* invalidate page table entry */
#define OP_IPM          0xb222  /* insert program mask */
#define OP_IVSK         0xb223  /* insert virtual storage key */
#define OP_IAC          0xb224  /* insert address space control */
#define OP_SSAR         0xb225  /* set secondary ASN */
#define OP_EPAR         0xb226  /* extract primary ASN */
#define OP_ESAR         0xb227  /* extract secondary ASN */
#define OP_PT           0xb228  /* program transfer */
#define OP_ISKE         0xb229  /* insert storage key extended */
#define OP_RRBE         0xb22a  /* reset reference bit extended */
#define OP_SSKE         0xb22b  /* set storage key extended */
#define OP_TB           0xb22c  /* test block */
#define OP_DXR          0xb22d  /* divide (extended) */
#define OP_CSCH         0xb230  /* clear subchannel */
#define OP_HSCH         0xb231  /* halt subchannel */
#define OP_MSCH         0xb232  /* modify subchannel */
#define OP_SSCH         0xb233  /* start subchannel */
#define OP_STSCH        0xb234  /* store subchannel */
#define OP_TSCH         0xb235  /* test subchannel */
#define OP_TPI          0xb236  /* test pending interrupt */
#define OP_SAL          0xb237  /* set address limit */
#define OP_RSCH         0xb238  /* resume subchannel */
#define OP_STCRW        0xb239  /* store channel report word */
#define OP_STCPS        0xb23a  /* store channel path status */
#define OP_RCHP         0xb23b  /* reset channel path */
#define OP_SCHM         0xb23c  /* set channel monitor */
#define OP_BAKR         0xb240  /* branch and stack */
#define OP_STURA        0xb246  /* store using real address */
#define OP_MSTA         0xb247  /* modified stacked state */
#define OP_PALB         0xb248  /* purge ALB */
#define OP_EREG         0xb249  /* extract stacked registers */
#define OP_ESTA         0xb24a  /* extract stacked state */
#define OP_LURA         0xb24b  /* load using real address */
#define OP_TAR          0xb24c  /* test access */
#define OP_CPYA         0xb24d  /* copy access */
#define OP_SAR          0xb24e  /* set access */
#define OP_EAR          0xb24f  /* extract access */
#define OP_STCTL        0xb600  /* store control */
#define OP_LCTL         0xb700  /* load control */
#define OP_CS           0xba00  /* compare and swap */
#define OP_CDS          0xbb00  /* compare double and swap */
#define OP_CLM          0xbd00  /* compare logical chars under mask */
#define OP_STCM         0xbe00  /* store characters under mask */
#define OP_ICM          0xbf00  /* insert characters under mask */

#define OP_MVN          0xd100  /* move numerics */
#define OP_MVC          0xd200  /* move (character) */
#define OP_MVZ          0xd300  /* move zones */
#define OP_NC           0xd400  /* and (character) */
#define OP_CLC          0xd500  /* compare logical (character) */
#define OP_OC           0xd600  /* or (character) */
#define OP_XC           0xd700  /* exclusive or (character) */
#define OP_MVCK         0xd900  /* move with key */
#define OP_MVCP         0xda00  /* move to primary */
#define OP_MVCS         0xdb00  /* move to secondary */
#define OP_TR           0xdc00  /* translate */
#define OP_TRT          0xdd00  /* translate and test */
#define OP_ED           0xde00  /* edit */
#define OP_EDMK         0xdf00  /* edit and mark */

#define OP_LASP         0xe500  /* load address space parameters */
#define OP_TPROT        0xe501  /* test protection */
#define OP_MVCSK        0xe50e  /* move with source key */
#define OP_MVCDK        0xe50f  /* move with destination key */
#define OP_MVCIN        0xe800  /* move inverse */

#define OP_SRP          0xf000  /* shift and round decimal */
#define OP_MVO          0xf100  /* move with offset */
#define OP_PACK         0xf200  /* pack */
#define OP_UNPK         0xf300  /* unpack */
#define OP_ZAP          0xf800  /* zero and add */
#define OP_CP           0xf900  /* compare decimal */
#define OP_AP           0xfa00  /* add decimal */
#define OP_SP           0xfb00  /* subtract decimal */
#define OP_MP           0xfc00  /* multiply decimal */
#define OP_DP           0xfd00  /* divide decimal */

#endif /* _OPCODES_H_INCLUDED */