MMIX विधानसभा (28 बाइट्स)
64 बिट संख्या
rbit:
SETH $1,#0102 # load matrix in 16-byte steps
ORMH $1,#0408
ORML $1,#1020
ORL $1,#4080
MOR $0,$1,$0 # multiplication 1
MOR $0,$0,$1 # multiplication 2
POP 1,0 # return
यह असेंबल करता है:
rbit:
E0010102 # SETH $1,#0102
E9010408 # ORMH $1,#0408
EA011020 # ORML $1,#1020
EB014080 # ORL $1,#4080
DC000100 # MOR $0,$1,$0
DC000001 # MOR $0,$0,$1
F8010000 # POP 1,0
यह कैसे काम करता है?
MOR
अनुदेश दो 64-बिट बूलियन्स के दो 8x8 मैट्रिक्स के रूप में इस्तेमाल मात्रा पर एक आव्यूह गुणन प्रदर्शन करती है। अंकों के साथ एक बूलियन संख्या abcdefghklmnopqr 2इस तरह के एक मैट्रिक्स के रूप में का उपयोग किया जाता है:
/ abcd \
| efgh |
| klmn |
\ opqr /
MOR
अनुदेश गुणा मैट्रिक्स उनके तर्कों जहां गुणा है द्वारा प्रतिनिधित्व किया and
और इसके अलावा है or
। यह है:
/ 0001 \ / abcd \ / opqr \
| 0010 | \/ | efgh | -- | klmn |
| 0100 | /\ | klmn | -- | efgh |
\ 1000 / \ opqr / \ abcd /
और इसके अलावा:
/ opqr \ / 0001 \ / rqpo \
| klmn | \/ | 0010 | -- | nmlk |
| efgh | /\ | 0100 | -- | hgfe |
\ abcd / \ 1000 / \ dcba /
जो मूल संख्या के बिट्स का रिवर्स ऑर्डर है।
32 बिट संख्या
यदि आप 64 बिट संख्या के बजाय 32 बिट संख्या के विपरीत चाहते हैं, तो आप इस संशोधित विधि का उपयोग कर सकते हैं:
rbit:
SETL $1,#0408 # load first matrix in two steps
ORML $1,#0102
MOR $1,$1,$0 # apply first matrix
SLU $2,$1,32 # compile second matrix
16ADDU $1,$2,$1
MOR $1,$0,$1 # apply second matrix
POP 1,0 # return
इकट्ठे:
rbit:
E3010408 # SETL $1,#0408
EA010102 # ORML $1,#0102
DC010001 # MOR $1,$1,$0
3B020120 # SLU $2,$1,32
2E010201 # 16ADDU $1,$2,$1
DC010001 # MOR $1,$0,$1
F8010000 # POP 1,0
पहला मैट्रिक्स गुणन मूल रूप से इस तरह काम करता है:
/ 0000 \ / 0000 \ / 0000 \
| 0000 | \/ | 0000 | -- | 0000 |
| 0001 | /\ | abcd | -- | efgh |
\ 0010 / \ efgh / \ abcd /
संबंधित ऑक्टाबाइट वह है #0000000001020408
जिसे हम पहले दो निर्देशों में लोड करते हैं। दूसरा गुणा इस तरह दिखता है:
/ 0000 \ / 0001 \ / 0000 \
| 0000 | \/ | 0010 | -- | 0000 |
| efgh | /\ | 0100 | -- | hgfe |
\ abcd / \ 1000 / \ dcba /
संबंधित ऑक्टाबाइट है #0102040810204080
जिसे हम इस तरह से पहले मैट्रिक्स से बनाते हैं:
SLU $2,$1,#32 # $2 = #0102040800000000
16ADDU $1,$2,$1 # $2 = $2 + $1 << 4
= $2 + #0000000010204080
# = #0102040810204080
दूसरा गुणन हमेशा की तरह व्यवसाय है, जिसके परिणामस्वरूप कोड की लंबाई समान है (28 बाइट्स)।