こんにちは、よろしくお願いします。
私の質問は、あるレジスタ($ t0)にポインタを置き、別のレジスタ($ t1)にポインタを移動するようなレジスタを通過できるかどうかです。
私が実際にやりたいのは、1つのループで8つの整数を読み取り、それらを($ s0- $ s7)に格納することです。
こんにちは、よろしくお願いします。
私の質問は、あるレジスタ($ t0)にポインタを置き、別のレジスタ($ t1)にポインタを移動するようなレジスタを通過できるかどうかです。
私が実際にやりたいのは、1つのループで8つの整数を読み取り、それらを($ s0- $ s7)に格納することです。
レジスタ番号を可変にしたいですか?私は MIPS の内外を知りませんが、それが可能であるとは思えません。私が知っている唯一のISAは、SPARC(レジスタウィンドウ、必要なものには使用できません)とIA64(「回転レジスタ」、必要なものに使用できますが、浮動小数点でのみ使用できます)です。
オペコードのビットを変更sw
してレジスタの増加を指すようにすることもできますが、それはひどい考えです。あなたの最善の策は、展開されたループを自分で書くことだと思います:
lw $s0, $t0
addi $t0, $t0, 4
lw $s1, $t0
...
失速を最小限に抑えるために物事を再配置しますが、それはあなたが得ようとしているのと同じくらい良いです.
レジスタの内容によるレジスタの参照をサポートする既存の MIPS アーキテクチャを認識していません。これにより、次のような提案が可能になります。
move $t0, $zero
mover $t0, $s0 # $s0 = register($t0) = register(0)
addi $t0, 1
mover $t0, $s1 # $s1 = register($t0) = register(1)
addi $t0, 1
...
いずれにせよ、私の意見では、いくつかの理由から、それは良い考えではありません。まず、とにかく非常に少数のレジスタを扱っているため、いずれにせよループに小さな上限があり、直接的なアプローチの柔軟性がそれほど低下しません。
さらに重要なことに、そのようなループは恐ろしく非効率的です。反復ごとに、初期化、インクリメント、move
および分岐チェック(少なくとも)を実行します。ブランチ ストールを考慮に入れなくても、単純な場合よりも少なくとも 3 倍遅くなります。
move $t0, $s0
move $t1, $s1
...
move $t8, $s8