Skip to content

Latest commit

 

History

History
279 lines (276 loc) · 14.7 KB

File metadata and controls

279 lines (276 loc) · 14.7 KB

MMIX Instruction Quick Reference

MMIX is a 64-bit big-endian RISC machine (Knuth) with 256 general-purpose registers, a separate 256-entry special-register file, byte-addressed memory, and fixed 32-bit instructions. Immediates in assembly may be decimal, octal, hex, or character literals; labels and IS constants resolve where expressions are accepted. This assembler targets the MMIXAL dialect used by mmixal/mmixrun; the table below lists mnemonics this assembler accepts with their operand forms and a terse description for quick reference.

Minimal assembly skeleton

LOC #100           % code start
GREG @             % global register base (optional)
Main    SETL $0,0  % your code here
        TRAP 0,Halt,0

Instruction table

Mnemonic Operands Description
SET SET $X, $Y register copy pseudo-instruction - emits ORI $X, $Y, 0
SETI SETI $X, immediate regisger set pseudo-instruction
SETL SETL $X, YZ set low wyde
SETH SETH $X, YZ set high wyde
SETMH SETMH $X, YZ set medium high wyde
SETML SETML $X, YZ set medium low wyde
INCH INCH $X, YZ increment high wyde
INCMH INCMH $X, YZ increment medium high wyde
INCML INCML $X, YZ increment medium low wyde
ORH ORH $X, YZ or high wyde
ORMH ORMH $X, YZ or medium high wyde
ORML ORML $X, YZ or medium low wyde
ORL ORL $X, YZ or low wyde
ANDNH ANDNH $X, YZ and-not high wyde
ANDNMH ANDNMH $X, YZ and-not medium high wyde
ANDNML ANDNML $X, YZ and-not medium low wyde
ANDNL ANDNL $X, YZ and-not low wyde
LDB LDB $X, $Y, $Z load byte signed
LDBI LDB $X, $Y, Z load byte signed (immediate)
LDBU LDBU $X, $Y, $Z load byte unsigned
LDBUI LDBU $X, $Y, Z load byte unsigned (immediate)
LDW LDW $X, $Y, $Z load wyde signed
LDWI LDW $X, $Y, Z load wyde signed (immediate)
LDWU LDWU $X, $Y, $Z load wyde unsigned
LDWUI LDWU $X, $Y, Z load wyde unsigned (immediate)
LDT LDT $X, $Y, $Z load tetra signed
LDTI LDT $X, $Y, Z load tetra signed (immediate)
LDTU LDTU $X, $Y, $Z load tetra unsigned
LDTUI LDTU $X, $Y, Z load tetra unsigned (immediate)
LDO LDO $X, $Y, $Z load octa
LDOI LDO $X, $Y, Z load octa (immediate)
LDOU LDOU $X, $Y, $Z load octa unsigned
LDOUI LDOU $X, $Y, Z load octa unsigned (immediate)
LDUNC LDUNC $X, $Y, $Z load octa uncached
LDUNCI LDUNC $X, $Y, Z load octa uncached (immediate)
LDHT LDHT $X, $Y, $Z load high tetra
LDHTI LDHT $X, $Y, Z load high tetra (immediate)
LDSF LDSF $X, $Y, $Z load short float
LDSFI LDSF $X, $Y, Z load short float (immediate)
LDVTS LDVTS $X, $Y, $Z load virtual translation status
LDVTSI LDVTS $X, $Y, Z load virtual translation status (immediate)
CSWAP CSWAP $X, $Y, $Z compare and swap
CSWAPI CSWAP $X, $Y, Z compare and swap (immediate)
LDA LDA $X, $Y, $Z load address (ADDU)
LDAI LDA $X, $Y, Z load address (immediate)
STB STB $X, $Y, $Z store byte signed
STBI STB $X, $Y, Z store byte signed (immediate)
STBU STBU $X, $Y, $Z store byte unsigned
STBUI STBU $X, $Y, Z store byte unsigned (immediate)
STW STW $X, $Y, $Z store wyde signed
STWI STW $X, $Y, Z store wyde signed (immediate)
STWU STWU $X, $Y, $Z store wyde unsigned
STWUI STWU $X, $Y, Z store wyde unsigned (immediate)
STT STT $X, $Y, $Z store tetra signed
STTI STT $X, $Y, Z store tetra signed (immediate)
STTU STTU $X, $Y, $Z store tetra unsigned
STTUI STTU $X, $Y, Z store tetra unsigned (immediate)
STO STO $X, $Y, $Z store octa
STOI STO $X, $Y, Z store octa (immediate)
STOU STOU $X, $Y, $Z store octa unsigned
STOUI STOU $X, $Y, Z store octa unsigned (immediate)
STUNC STUNC $X, $Y, $Z store octa uncached
STUNCI STUNC $X, $Y, Z store octa uncached (immediate)
STCO STCO X, $Y, $Z store constant octabyte
STCOI STCO X, $Y, Z store constant octabyte (immediate)
STHT STHT $X, $Y, $Z store high tetra
STHTI STHT $X, $Y, Z store high tetra (immediate)
STSF STSF $X, $Y, $Z store short float
STSFI STSF $X, $Y, Z store short float (immediate)
ADD ADD $X, $Y, $Z add with overflow
ADDI ADD $X, $Y, Z add immediate with overflow
ADDU ADDU $X, $Y, $Z add unsigned (same as LDA)
ADDUI ADDU $X, $Y, Z add unsigned immediate
ADDU2 2ADDU $X, $Y, $Z times 2 and add unsigned
ADDU2I 2ADDU $X, $Y, Z times 2 and add unsigned immediate
ADDU4 4ADDU $X, $Y, $Z times 4 and add unsigned
ADDU4I 4ADDU $X, $Y, Z times 4 and add unsigned immediate
ADDU8 8ADDU $X, $Y, $Z times 8 and add unsigned
ADDU8I 8ADDU $X, $Y, Z times 8 and add unsigned immediate
ADDU16 16ADDU $X, $Y, $Z times 16 and add unsigned
ADDU16I 16ADDU $X, $Y, Z times 16 and add unsigned immediate
SUB SUB $X, $Y, $Z subtract with overflow
SUBI SUB $X, $Y, Z subtract immediate with overflow
SUBU SUBU $X, $Y, $Z subtract unsigned
SUBUI SUBU $X, $Y, Z subtract unsigned immediate
NEG NEG $X, Y, $Z negate with overflow (Y is immediate)
NEGI NEG $X, Y, Z negate immediate with overflow
NEGU NEGU $X, Y, $Z negate unsigned
NEGUI NEGU $X, Y, Z negate unsigned immediate
MUL MUL $X, $Y, $Z multiply
MULI MUL $X, $Y, Z multiply immediate
MULU MULU $X, $Y, $Z multiply unsigned
MULUI MULU $X, $Y, Z multiply unsigned immediate
DIV DIV $X, $Y, $Z divide
DIVI DIV $X, $Y, Z divide immediate
DIVU DIVU $X, $Y, $Z divide unsigned
DIVUI DIVU $X, $Y, Z divide unsigned immediate
FCMP FCMP $X, $Y, $Z floating compare
FUN FUN $X, $Y, $Z floating unordered
FEQL FEQL $X, $Y, $Z floating equal
FADD FADD $X, $Y, $Z floating add
FIX FIX $X, $Y, $Z convert float to fixed
FSUB FSUB $X, $Y, $Z floating subtract
FIXU FIXU $X, $Y, $Z convert float to fixed unsigned
FLOT FLOT $X, $Y, $Z convert fixed to float
FLOTI FLOTI $X, $Y, Z convert fixed to float immediate
FLOTU FLOTU $X, $Y, $Z convert fixed unsigned to float
FLOTUI FLOTUI $X, $Y, Z convert fixed unsigned to float immediate
SFLOT SFLOT $X, $Y, $Z convert fixed to short float
SFLOTI SFLOTI $X, $Y, Z convert fixed to short float immediate
SFLOTU SFLOTU $X, $Y, $Z convert fixed unsigned to short float
SFLOTUI SFLOTUI $X, $Y, Z convert fixed unsigned to short float immediate
FMUL FMUL $X, $Y, $Z floating multiply
FDIV FDIV $X, $Y, $Z floating divide
FREM FREM $X, $Y, $Z floating remainder
FSQRT FSQRT $X, $Y, $Z floating square root
FINT FINT $X, $Y, $Z floating round to integer
CMP CMP $X, $Y, $Z compare signed
CMPI CMP $X, $Y, Z compare signed immediate
CMPU CMPU $X, $Y, $Z compare unsigned
CMPUI CMPU $X, $Y, Z compare unsigned immediate
INCL INCL $X, $Y, $Z
AND AND $X, $Y, $Z bitwise and
ANDI AND $X, $Y, Z bitwise and immediate
OR OR $X, $Y, $Z bitwise or
ORI OR $X, $Y, Z bitwise or immediate
XOR XOR $X, $Y, $Z bitwise exclusive-or
XORI XOR $X, $Y, Z bitwise exclusive-or immediate
ANDN ANDN $X, $Y, $Z bitwise and-not
ANDNI ANDN $X, $Y, Z bitwise and-not immediate
ORN ORN $X, $Y, $Z bitwise or-not
ORNI ORN $X, $Y, Z bitwise or-not immediate
NAND NAND $X, $Y, $Z bitwise not-and
NANDI NAND $X, $Y, Z bitwise not-and immediate
NOR NOR $X, $Y, $Z bitwise not-or
NORI NOR $X, $Y, Z bitwise not-or immediate
NXOR NXOR $X, $Y, $Z bitwise not-exclusive-or
NXORI NXOR $X, $Y, Z bitwise not-exclusive-or immediate
MUX MUX $X, $Y, $Z bitwise multiplex
MUXI MUX $X, $Y, Z bitwise multiplex immediate
BDIF BDIF $X, $Y, $Z byte difference
BDIFI BDIF $X, $Y, Z byte difference immediate
WDIF WDIF $X, $Y, $Z wyde difference
WDIFI WDIF $X, $Y, Z wyde difference immediate
TDIF TDIF $X, $Y, $Z tetra difference
TDIFI TDIF $X, $Y, Z tetra difference immediate
ODIF ODIF $X, $Y, $Z octa difference
ODIFI ODIF $X, $Y, Z octa difference immediate
SADD SADD $X, $Y, $Z sideways add
SADDI SADD $X, $Y, Z sideways add immediate
MOR MOR $X, $Y, $Z multiple or
MORI MOR $X, $Y, Z multiple or immediate
MXOR MXOR $X, $Y, $Z multiple exclusive-or
MXORI MXOR $X, $Y, Z multiple exclusive-or immediate
SL SL $X, $Y, $Z shift left
SLI SL $X, $Y, Z shift left immediate
SLU SLU $X, $Y, $Z shift left unsigned
SLUI SLU $X, $Y, Z shift left unsigned immediate
SR SR $X, $Y, $Z shift right
SRI SR $X, $Y, Z shift right immediate
SRU SRU $X, $Y, $Z shift right unsigned
SRUI SRU $X, $Y, Z shift right unsigned immediate
JMP JMP offset (24-bit)
JE JE $X, offset
JNE JNE $X, offset
JL JL $X, offset
JG JG $X, offset
BN BN $X, offset branch if negative
BNB BNB $X, offset branch if negative backward
BZ BZ $X, offset branch if zero
BZB BZB $X, offset branch if zero backward
BP BP $X, offset branch if positive
BPB BPB $X, offset branch if positive backward
BOD BOD $X, offset branch if odd
BODB BODB $X, offset branch if odd backward
BNN BNN $X, offset branch if non-negative
BNNB BNNB $X, offset branch if non-negative backward
BNZ BNZ $X, offset branch if non-zero
BNZB BNZB $X, offset branch if non-zero backward
BNP BNP $X, offset branch if non-positive
BNPB BNPB $X, offset branch if non-positive backward
BEV BEV $X, offset branch if even
BEVB BEVB $X, offset branch if even backward
PBN PBN $X, Y, Z probable branch negative (Y,Z = offset)
PBNB PBNB $X, Y, Z probable branch negative backward
PBZ PBZ $X, Y, Z probable branch zero
PBZB PBZB $X, Y, Z probable branch zero backward
PBP PBP $X, Y, Z probable branch positive
PBPB PBPB $X, Y, Z probable branch positive backward
PBOD PBOD $X, Y, Z probable branch odd
PBODB PBODB $X, Y, Z probable branch odd backward
PBNN PBNN $X, Y, Z probable branch nonnegative
PBNNB PBNNB $X, Y, Z probable branch nonnegative backward
PBNZ PBNZ $X, Y, Z probable branch nonzero
PBNZB PBNZB $X, Y, Z probable branch nonzero backward
PBNP PBNP $X, Y, Z probable branch nonpositive
PBNPB PBNPB $X, Y, Z probable branch nonpositive backward
PBEV PBEV $X, Y, Z probable branch even
PBEVB PBEVB $X, Y, Z probable branch even backward
CSN CSN $X, $Y, $Z conditional set if negative
CSNI CSNI $X, $Y, Z conditional set if negative immediate
CSZ CSZ $X, $Y, $Z conditional set if zero
CSZI CSZI $X, $Y, Z conditional set if zero immediate
CSP CSP $X, $Y, $Z conditional set if positive
CSPI CSPI $X, $Y, Z conditional set if positive immediate
CSOD CSOD $X, $Y, $Z conditional set if odd
CSODI CSODI $X, $Y, Z conditional set if odd immediate
CSNN CSNN $X, $Y, $Z conditional set if non-negative
CSNNI CSNNI $X, $Y, Z conditional set if non-negative immediate
CSNZ CSNZ $X, $Y, $Z conditional set if non-zero
CSNZI CSNZI $X, $Y, Z conditional set if non-zero immediate
CSNP CSNP $X, $Y, $Z conditional set if non-positive
CSNPI CSNPI $X, $Y, Z conditional set if non-positive immediate
CSEV CSEV $X, $Y, $Z conditional set if even
CSEVI CSEVI $X, $Y, Z conditional set if even immediate
ZSN ZSN $X, $Y, $Z zero or set if negative
ZSNI ZSNI $X, $Y, Z zero or set if negative immediate
ZSZ ZSZ $X, $Y, $Z zero or set if zero
ZSZI ZSZI $X, $Y, Z zero or set if zero immediate
ZSP ZSP $X, $Y, $Z zero or set if positive
ZSPI ZSPI $X, $Y, Z zero or set if positive immediate
ZSOD ZSOD $X, $Y, $Z zero or set if odd
ZSODI ZSODI $X, $Y, Z zero or set if odd immediate
ZSNN ZSNN $X, $Y, $Z zero or set if non-negative
ZSNNI ZSNNI $X, $Y, Z zero or set if non-negative immediate
ZSNZ ZSNZ $X, $Y, $Z zero or set if non-zero
ZSNZI ZSNZI $X, $Y, Z zero or set if non-zero immediate
ZSNP ZSNP $X, $Y, $Z zero or set if non-positive
ZSNPI ZSNPI $X, $Y, Z zero or set if non-positive immediate
ZSEV ZSEV $X, $Y, $Z zero or set if even
ZSEVI ZSEVI $X, $Y, Z zero or set if even immediate
TRAP TRAP X, Y, Z trap/system call
TRIP TRIP X, Y, Z trip (forced trap)
PUSHJ PUSHJ $X, YZ push registers and jump
PUSHJB PUSHJB $X, YZ push registers and jump backward
PUSHGO PUSHGO $X, $Y, $Z push registers and go
PUSHGOI PUSHGOI $X, $Y, Z push registers and go (immediate)
POP POP X, YZ pop registers and return
GO GO $X, $Y, $Z go to location
GOI GOI $X, $Y, Z go to location (immediate)
GET GET $X, Z get from special register
PUT PUT X, $Z put into special register
PUTI PUTI X, Z put immediate into special register
SAVE SAVE $X, 0 save context
UNSAVE UNSAVE 0, $Z unsave/restore context
RESUME RESUME XYZ resume after interrupt
SYNC SYNC XYZ synchronize
PRELD PRELD X, $Y, $Z preload data
PRELDI PRELDI X, $Y, Z preload data (immediate)
PREGO PREGO X, $Y, $Z prefetch to go
PREGOI PREGOI X, $Y, Z prefetch to go (immediate)
PREST PREST X, $Y, $Z prestore data
PRESTI PRESTI X, $Y, Z prestore data (immediate)
SYNCD SYNCD X, $Y, $Z synchronize data
SYNCDI SYNCDI X, $Y, Z synchronize data (immediate)
SYNCID SYNCID X, $Y, $Z synchronize instructions and data
SYNCIDI SYNCIDI X, $Y, Z synchronize instructions and data (immediate)
GETA GETA $X, $Y, $Z or GETA $X, addr get address
GETAB GETAB $X, $Y, $Z or GETAB $X, addr get address backward
BYTE BYTE 1 byte of data
WYDE WYDE 2 bytes of data
TETRA TETRA 4 bytes of data
OCTA OCTA 8 bytes of data