MN-Core Challenge メモ
s は 16bit
i は 32bit
l は 64bit
ll は 128bit
ll が使える場面は非常に少ない。
Plus 2
imm は、32bit値しか設定できず、さらに、ALU の64bit の上下32bitを両方とも同じ値に設定してしまう。
imm i"2" $r1v とすると $r[1,2,3,4]にそれぞれ0x00000002が設定されるが、ALUには0x00000002_00000002_00000002_00000002 が設定されることになる。このため $aluf を使いたくてもそのままでは使えない。
immu i"2" $r1vとすると、0x00000002, 0x00000000, 0x00000002, 0x00000000, が設定される。(要するに上位ワードのみの設定)
この時 ALU には 0x00000002_00000000_00000002_00000000 が設定されることになる。
ladd は a + b → c をしてくれるが、b は 64bit しか受け付けない。
ipassa だと、$ll* を使えば値が入るが、ladd $llm0v $llr0 $lln0v としても、なぜか 0, 2, 4, 8 しか計算してくれない。
code:txt
# 全部に2が設定される。
imm i"2" $r1v2
nop
ipassa $llr0 $lln0v
ipassa $llr0 $lln16v
ipassa $lr0 $ln32v
A+B
ipass 命令とlpass 命令は区別が付かない。(ALUが絡まないため)
計算幅(?ALUの計算単位)を決めるのはオペコードの方
転送幅を決めるのはオペランドの方
説明には $i* 32bitと $l* 64bit(32*2)しか出てこないが、$ll* で 128bit (32*4)として扱える。