Instructions for MMIX: A RISC Computer for the New Millennium
Loading and storing
- 80 LDB $X,$Y,$Z (load byte): s($X) ⟵ s(M1[A]).
- 84 LDW $X,$Y,$Z (load wyde): s($X) ⟵ s(M2[A]).
- 88 LDT $X,$Y,$Z (load tetra): s($X) ⟵ s(M4[A]).
- 8C LDO $X,$Y,$Z (load octa): s($X) ⟵ s(M8[A]).
- 82 LDBU $X,$Y,$Z (load byte unsigned): u($X) ⟵ u(M1[A]).
- 86 LDWU $X,$Y,$Z (load wyde unsigned): u($X) ⟵ u(M2[A]).
- 8A LDTU $X,$Y,$Z (load tetra unsigned): u($X) ⟵ u(M4[A]).
- 8E LDOU $X,$Y,$Z (load octa unsigned): u($X) ⟵ u(M8[A]).
- 92 LDHT $X,$Y,$Z (load high tetra): u($X) ⟵ u(M4[A]) × 232.
- 22 LDA $X,$Y,$Z (load address): u($X) ⟵ A.
- A0 STB $X,$Y,$Z (store byte, rA): s(M1[A]) ⟵ s($X).
- A4 STW $X,$Y,$Z (store wyde, rA): s(M2[A]) ⟵ s($X).
- A8 STT $X,$Y,$Z (store tetra, rA): s(M4[A]) ⟵ s($X).
- AC STO $X,$Y,$Z (store octa): s(M8[A]) ⟵ s($X).
- A2 STBU $X,$Y,$Z (store byte unsigned): u(M1[A]) ⟵ u($X) mod 28.
- A6 STWU $X,$Y,$Z (store wyde unsigned): u(M2[A]) ⟵ u($X) mod 216.
- AA STTU $X,$Y,$Z (store tetra unsigned): u(M4[A]) ⟵ u($X) mod 232.
- AE STOU $X,$Y,$Z (store octa unsigned): u(M8[A]) ⟵ u($X).
- B2 STHT $X,$Y,$Z (store high tetra): u(M4[A]) ⟵ ⎣u($X) / 232⎦.
- B4 STCO X,$Y,$Z (store constant octabyte): u(M8[A]) ⟵ X.
Arithmetic operators
- 20 ADD $X,$Y,$Z (add, rA): s($X) ⟵ s($Y) + s($Z).
- 24 SUB $X,$Y,$Z (subtract, rA): s($X) ⟵ s($Y) - s($Z).
- 18 MUL $X,$Y,$Z (multiply, rA): s($X) ⟵ s($Y) × s($Z).
- 1C DIV $X,$Y,$Z (divide, rA rR): s($X) ⟵ ⎣s($Y) / s($Z)⎦[$Z ≠ 0], and s(rR) ⟵ s($Y) mod s($Z).
- 22 ADDU $X,$Y,$Z (add unsigned): u($X) ⟵ (u($Y) + u($Z)) mod 264.
- 26 SUBU $X,$Y,$Z (subtract unsigned):u($X) ⟵ (u($Y) - u($Z)) mod 264.
- 1A MULU $X,$Y,$Z (multiply unsigned, rH): u(rH$X) ⟵ u($Y) × u($Z).
- 1E DIVU $X,$Y,$Z (divide unsigned, rD rR): u($X) ⟵ ⎣u(rD$Y) / u($Z)⎦, u(rR) ⟵ u(rD$Y) mod u($Z), if u($Z) > u(rD); otherwise $X ⟵ rD, rR ⟵ $Y.
- 28 2ADDU $X,$Y,$Z (times 2 and add unsigned): u($X) ⟵ (u($Y) × 2 + u($Z)) mod 264.
- 2A 4ADDU $X,$Y,$Z (times 4 and add unsigned): u($X) ⟵ (u($Y) × 4 + u($Z)) mod 264.
- 2C 8ADDU $X,$Y,$Z (times 8 and add unsigned): u($X) ⟵ (u($Y) × 8 + u($Z)) mod 264.
- 2E 16ADDU $X,$Y,$Z (times 16 and add unsigned): u($X) ⟵ (u($Y) × 16 + u($Z)) mod 264.
- 34 NEG $X,Y,$Z (negate, rA): s($X) ⟵ Y - s($Z).
- 36 NEGU $X,Y,$Z (negate unsigned): u($X) ⟵ (Y - u($Z)) mod 264.
- 38 SL $X,$Y,$Z (shift left, rA): s($X) ⟵ s($Y) × 2u($Z).
- 3A SLU $X,$Y,$Z (shift left unsigned): u($X) ⟵ (u($Y) × 2u($Z)) mod 264.
- 3C SR $X,$Y,$Z (shift right, rA): s($X) ⟵ ⎣s($Y) / 2u($Z)⎦.
- 3E SRU $X,$Y,$Z (shift right unsigned): u($X) ⟵ ⎣u($Y) / 2u($Z)⎦.
- 30 CMP $X,$Y,$Z (compare): s($X) ⟵ [s($Y) > s($Z)] - [s($Y) < s($Z)].
- 32 CMPU $X,$Y,$Z (compare unsigned): s($X) ⟵ [u($Y) > u($Z)] - [u($Y) < u($Z)].
Conditional instructions
- 60 CSN $X,$Y,$Z (conditional set if negative): if s($Y) < 0, set $X ⟵ $Z.
- 62 CSZ $X,$Y,$Z (conditional set if zero): if $Y = 0, set $X ⟵ $Z.
- 64 CSP $X,$Y,$Z (conditional set if positive): if s($Y) > 0, set $X ⟵ $Z.
- 66 CSOD $X,$Y,$Z (conditional set if odd): if $Y mod 2 = 1, set $X ⟵ $Z.
- 68 CSNN $X,$Y,$Z (conditional set if nonnegative): if s($Y) ≥ 0, set $X ⟵ $Z.
- 6A CSNZ $X,$Y,$Z (conditional set if nonzero): if $Y ≠ 0, set $X ⟵ $Z.
- 6C CSNP $X,$Y,$Z (conditional set if nonpositive): if s($Y) ≤ 0, set $X ⟵ $Z.
- 6E CSEV $X,$Y,$Z (conditional set if even): if $Y mod 2 = 0, set $X ⟵ $Z.
- 70 ZSN $X,$Y,$Z (zero or set if negative): s($X) ⟵ $Z[s($Y) < 0].
- 72 ZSZ $X,$Y,$Z (zero or set if zero): s($X) ⟵ $Z[$Y = 0].
- 74 ZSP $X,$Y,$Z (zero or set if positive): s($X) ⟵ $Z[s($Y) > 0].
- 76 ZSOD $X,$Y,$Z (zero or set if odd): s($X) ⟵ $Z[$Y mod 2 = 1].
- 78 ZSNN $X,$Y,$Z (zero or set if nonnegative): s($X) ⟵ $Z[s($Y) ≥ 0].
- 7A ZSNZ $X,$Y,$Z (zero or set if nonzero): s($X) ⟵ $Z[$Y ≠ 0].
- 7C ZSNP $X,$Y,$Z (zero or set if nonpositive): s($X) ⟵ $Z[s($Y) ≤ 0].
- 7E ZSEV $X,$Y,$Z (zero or set if even): s($X) ⟵ $Z[$Y mod 2 = 0].
Bitwise operations
- C8 AND $X,$Y,$Z (bitwise and): v($X) ⟵ v($Y) & v($Z).
- C0 OR $X,$Y,$Z (bitwise or): v($X) ⟵ v($Y) | v($Z).
- C6 XOR $X,$Y,$Z (bitwise exclusive-or): v($X) ⟵ v($Y) ⨁ v($Z).
- CA ANDN $X,$Y,$Z (bitwise and-not): v($X) ⟵ v($Y) & ⊽($Z).
- C2 ORN $X,$Y,$Z (bitwise or-not): v($X) ⟵ v($Y) | ⊽($Z).
- CC NAND $X,$Y,$Z (bitwise not-and): ⊽($X) ⟵ v($Y) & v($Z).
- C4 NOR $X,$Y,$Z (bitwise not-or): ⊽($X) ⟵ v($Y) | v($Z).
- CE NXOR $X,$Y,$Z (bitwise not-exclusive-or): ⊽($X) ⟵ v($Y) ⨁ v($Z).
- D8 MUX $X,$Y,$Z (bitwise multiplex, rM): v($X) ⟵ (v($Y) & v(rM)) | (v($Z) & ⊽(rM)).
- DA SADD $X,$Y,$Z (sideways add): s($X) ⟵ s(∑(v($Y) & ⊽($Z))).
Bytewise operations
- D0 BDIF $X,$Y,$Z (byte difference): b($X) ⟵ b($Y) ∸ b($Z).
- D2 WDIF $X,$Y,$Z (wyde difference): w($X) ⟵ w($Y) ∸ w($Z).
- D4 TDIF $X,$Y,$Z (tetra difference): t($X) ⟵ t($Y) ∸ t($Z).
- D6 ODIF $X,$Y,$Z (octa difference): u($X) ⟵ u($Y) ∸ u($Z).
- DC MOR $X,$Y,$Z (multiple or): mT($X) ⟵ mT($Y) |× mT($Z).
- DE MXOR $X,$Y,$Z (multiple exclusive-or): mT($X) ⟵ mT($Y) ⨂× mT($Z).
Floating point operators
- 04:FADD $X,$Y,$Z (floating add, rA): f($X) ⟵ f($Y) + f($Z).
- 06:FSUB $X,$Y,$Z (floating subtract, rA): f($X) ⟵ f($Y) - f($Z).
- 10:FMUL $X,$Y,$Z (floating multiply, rA): f($X) ⟵ f($Y) × f($Z).
- 14:FDIV $X,$Y,$Z (floating divide, rA rR): f($X) ⟵ f($Y) / f($Z).
- 16:FREM $X,$Y,$Z (floating remainder, rA): f($X) ⟵ f($Y) rem f($Z).
- 15:FSQRT $X,$Z or FSQRT $X,Y,$Z (floating square root, rA): f($X) ⟵ f($Z)1/2.
- 17:FINT $X,$Z or FINT $X,Y,$Z (floating integer, rA): f($X) ⟵ int f($Z).
- 01:FCMP $X,$Y,$Z (floating compare, rA): s($X) ⟵ [f($Y) > f($Z)] - [f($Y) < f($Z)].
- 03:FEQL $X,$Y,$Z (floating equal to, rA): s($X) ⟵ [f($Y) = f($Z)].
- 02:FUN $X,$Y,$Z (floating unordered): s($X) ⟵ [f($Y) ‖ f($Z)].
- 11:FCMPE $X,$Y,$Z (floating compare with respect to epsilon, rA rE): s($X) ⟵ [f($Y) ≻ f($Z)(f(rE))] - [f($Y) ≺ f($Z)(f(rE))].
- 13:FEQLE $X,$Y,$Z (floating equivalent with respect to epsilon, rA rE): s($X) ⟵ [f($Y) ≈ f($Z)(f(rE))].
- 12:FUNE $X,$Y,$Z (floating unordered with respect to epsilon, rE): s($X) ⟵ [f($Y) ‖ f($Z)(f(rE))].
- 05:FIX $X,$Z or FIX $X,Y,$Z (convert floating to fixed, rA): s($X) ⟵ int f($Z).
- 07:FIXU $X,$Z or FIXU $X,Y,$Z (convert floating to fixed unsigned, rA): u($X) ⟵ (int f($Z))mod 264.
- 08 FLOT $X,$Z or FLOT $X,Y,$Z (convert fixed to floating, rA): f($X) ⟵ s($Z).
- 0A FLOTU $X,$Z or FLOTU $X,Y,$Z (convert fixed to floating unsigned, rA): f($X) ⟵ u($Z).
- 0C SFLOT $X,$Z or SFLOT $X,Y,$Z (convert fixed to short float, rA): f($X) ⟵ f(T) ⟵ s($Z).
- 0E SFLOTU $X,$Z or SFLOTU $X,Y,$Z (convert fixed to short float unsigned, rA): f($X) ⟵ f(T) ⟵ u($Z).
- 90 LDSF $X,$Z or LDSF $X,Y,$Z (load short float): f($X) ⟵ f(M4[A]).
- B0 STSF $X,$Z or STSF $X,Y,$Z (store short float, rA): f(M4[A]) ⟵ f($X).
Immediate constants
- E0:SETH $X,YZ (set high wyde): u($X) ⟵ YZ × 248.
- E1:SETMH $X,YZ (set medium high wyde): u($X) ⟵ YZ × 232.
- E2:SETML $X,YZ (set medium low wyde): u($X) ⟵ YZ × 216.
- E3:SETL $X,YZ (set low wyde): u($X) ⟵ YZ.
- E4:INCH $X,YZ (increase by high wyde): u($X) ⟵ (u($X) + YZ × 248) mod 264.
- E5:INCMH $X,YZ (increase by medium high wyde): u($X) ⟵ (u($X) + YZ × 232) mod 264.
- E6:INCML $X,YZ (increase by medium low wyde): u($X) ⟵ (u($X) + YZ × 216) mod 264.
- E7:INCL $X,YZ (increase by low wyde): u($X) ⟵ (u($X) + YZ) mod 264.
- E8:ORH $X,YZ (bitwise or with high wyde): v($X) ⟵ v($X) | v(YZ ≪ 48).
- E9:ORMH $X,YZ (bitwise or with medium high wyde): v($X) ⟵ v($X) | v(YZ ≪ 32).
- EA:ORML $X,YZ (bitwise or with medium low wyde): v($X) ⟵ v($X) | v(YZ ≪ 16).
- EB:ORL $X,YZ (bitwise or with low wyde): v($X) ⟵ v($X) | v(YZ).
- EC:ANDNH $X,YZ (bitwise and-not with high wyde): v($X) ⟵ v($X) & ⊽(YZ ≪ 48).
- ED:ANDNMH $X,YZ (bitwise and-not with medium high wyde): v($X) ⟵ v($X) & ⊽(YZ ≪ 32).
- EE:ANDNML $X,YZ (bitwise and-not with medium low wyde): v($X) ⟵ v($X) & ⊽(YZ ≪ 16).
- EF:ANDNL $X,YZ (bitwise and-not with low wyde): v($X) ⟵ v($X) & ⊽(YZ).
Jumps and branches
- F0 JMP RA (jump): @ ⟵ RA.
- 9E GO $X,$Y,$Z (go): u($X) ⟵ @ + 4, then @ ⟵ A.
- 40 BN $X,RA (branch if negative): if s($X) < 0, set @ ⟵ RA.
- 42 BZ $X,RA (branch if zero): if $X = 0, set @ ⟵ RA.
- 44 BP $X,RA (branch if positive): if s($X) > 0, set @ ⟵ RA.
- 46 BOD $X,RA (branch if odd): if $X mod 2 = 1, set @ ⟵ RA.
- 48 BNN $X,RA (branch if nonnegative): if s($X) ≥ 0, set @ ⟵ RA.
- 4A BNZ $X,RA (branch if nonnzero): if $X ≠ 0, set @ ⟵ RA.
- 4C BNP $X,RA (branch if nonpositive): if s($X) ≤ 0, set @ ⟵ RA.
- 4E BEV $X,RA (branch if even): if $X mod 2 = 0, set @ ⟵ RA.
- 50 PBN $X,RA (probable branch if negative): if s($X) < 0, set @ ⟵ RA.
- 52 PBZ $X,RA (probable branch if zero): if $X = 0, set @ ⟵ RA.
- 54 PBP $X,RA (probable branch if positive): if s($X) > 0, set @ ⟵ RA.
- 56 PBOD $X,RA (probable branch if odd): if $X mod 2 = 1, set @ ⟵ RA.
- 58 PBNN $X,RA (probable branch if nonnegative): if s($X) ≥ 0, set @ ⟵ RA.
- 5A PBNZ $X,RA (probable branch if nonnzero): if $X ≠ 0, set @ ⟵ RA.
- 5C PBNP $X,RA (probable branch if nonpositive): if s($X) ≤ 0, set @ ⟵ RA.
- 5E PBEV $X,RA (probable branch if even): if $X mod 2 = 0, set @ ⟵ RA.
Subroutine calls
- F2 PUSHJ $X,RA (push registers and jump, rJ rL): push(X) and set rJ ⟵ @ + 4, then set @ ⟵ RA.
- BE PUSHGO $X,$Y,$Z (push registers and go, rJ rL): push(X) and set rJ ⟵ @ + 4, then set @ ⟵ A.
- F8:POP X,YZ (pop registers and return, rJ rL): pop(X), then set @ ⟵ rJ + 4 * YZ.
- FA:SAVE $X,0 (save process state, rA rB rD rE rG rH rJ rL rM rO rP rR rS rW rX rY rZ): u($X) ⟵ context.
- FB:UNSAVE $Z (restore process state, rA rB rD rE rG rH rJ rL rM rO rP rR rS rW rX rY rZ): context ⟵ u($Z).
System considerations
- 96 LDUNC $X,$Y,$Z (load octa uncached): s($X) ⟵ s(M8[A]).
- B6 STUNC $X,$Y,$Z (store octa uncached): s(M8[A]) ⟵ s($X).
- 9A PRELD X,$Y,$Z (preload data).
- BA PREST X,$Y,$Z (prestore data).
- 9C PREGO X,$Y,$Z (prestore to go).
- BC SYNCID X,$Y,$Z (synchronize instructions and data).
- B8 SYNCD X,$Y,$Z (synchronize data).
- FC:SYNC XYZ (synchronize).
- 94 CSWAP $X,$Y,$Z (compare and swap octabytes, rP).
- 98 LDVTS $X,$Y,$Z (load virtual translation status).
Interrupts
- FF:TRIP X,Y,Z or TRIP X,YZ or TRIP XYZ (trip, rB rW rX rY rZ).
- 00:TRAP X,Y,Z or TRAP X,YZ or TRAP XYZ (trap, rBB rWW rXX rYY rZZ).
- F9:RESUME 0 (resume after interrupt, rW rX rY rZ).
Straggly instructions
- FE:GET $X,Z (get from special register, rA-rZZ): u($X) ⟵ u(g(Z)), where 0 ≤ Z ≤ 32.
- F6 PUT X,$Z (put into special register, rA-rZZ): u(g(X)) ⟵ u($Z), where 0 ≤ X ≤ 32.
- F4 GETA $X,RA (get address): u($X) ⟵ RA.
- FD:SWYM X,Y,Z or SWYM X,YZ or SWYM XYZ (sympathize with your machinery).
- A = (u($Y) + u($Z)) mod 264.
- RA = @ + 4 * XYZ or @ + 4 * YZ.
- RA = @ - 4 * (224 - XYZ) or @ - 4 * (216 - YZ).
Knuth: MMIX op codes
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· [AI/GPT/综述] AI Agent的设计模式综述