--- nono/exp/optestm88k/optestm88k_code.s 2026/04/29 17:04:57 1.1.1.1 +++ nono/exp/optestm88k/optestm88k_code.s 2026/04/29 17:05:00 1.1.1.2 @@ -17,21 +17,21 @@ test_generic: st %r0, %r2, 4 | r1 を退避してテストコードへジャンプ - or %r9, %r0, %r1 + or %r5, %r0, %r1 addu %r12, %r3, 4 jsr %r12 | test - or %r1, %r0, %r9 + or %r1, %r0, %r5 | r2[0] の指す先(exception_occurred) は例外が起きたら 1、起きなければ 0。 | これを最後に r2 はつぶして、戻り値として使う。 ld %r2, %r2, 0 | rD をチェック。 - | 実行結果は r11 に、期待値は r3[0] に入っている。 + | 実行結果は r8 に、期待値は r3[0] に入っている。 | cmp 結果の bit0 は %0 なので直前の例外結果と OR できる。 - ld %r10, %r3, 0 - cmp %r10, %r10, %r11 - or %r2, %r2, %r10 + ld %r6, %r3, 0 + cmp %r6, %r6, %r8 + or %r2, %r2, %r6 | ここで r2 は | 例外の期待と結果が異なれば bit0(0x01) がセットされている、 @@ -61,10 +61,10 @@ test_addsub: addu.co %r0, %r12, %r13 | r1 を退避してテストコードへジャンプ - or %r9, %r0, %r1 + or %r5, %r0, %r1 addu %r12, %r3, 8 jsr %r12 | test - or %r1, %r0, %r9 + or %r1, %r0, %r5 | r2[0] の指す先(exception_occurred) は例外が起きたら 1、起きなければ 0。 | r3.b[6] は例外期待なら 1、例外が起きないことを期待なら 0。 @@ -75,10 +75,10 @@ test_addsub: xor %r2, %r2, %r13 | rD をチェック。 - | 実行結果は r11 に、期待値は r10 に入っている。 + | 実行結果は r8 に、期待値は r6 に入っている。 | cmp 結果の bit0 は %0 なので直前の例外結果と OR できる。 - cmp %r11, %r11, %r10 - or %r2, %r2, %r11 + cmp %r8, %r8, %r6 + or %r2, %r2, %r8 | Cy をチェック。 | 実行結果は Cy に、期待値は r3.b[5] にある。 @@ -107,10 +107,10 @@ test_div: st %r12, %r2, 4 | r1 を退避してテストコードへジャンプ - or %r9, %r0, %r1 + or %r5, %r0, %r1 addu %r12, %r3, 8 jsr %r12 | test - or %r1, %r0, %r9 + or %r1, %r0, %r5 | r2[0] の指す先(exception_occurred) は IntDiv 例外が起きたら 2。 | r3[1] は IntDiv 例外期待なら 2、起きないことを期待なら 0。 @@ -121,10 +121,10 @@ test_div: xor %r2, %r2, %r13 | rD をチェック。 - | 実行結果は r11 に、期待値は r10 に入っている。 + | 実行結果は r8 に、期待値は r6 に入っている。 | cmp 結果の bit0-1 は %0 なので直前の例外結果と OR できる。 - cmp %r11, %r11, %r10 - or %r2, %r2, %r11 + cmp %r8, %r8, %r6 + or %r2, %r2, %r8 | ここで r2 は | 例外の期待と結果が異なれば bit0-1(0x03) がセットされている、 @@ -132,3 +132,42 @@ test_div: | 0x0b で AND すると、全部成功すれば 0、そうでなければ非 0 になる。 and %r2, %r2, 0xb jmp %r1 + +| flt 命令のテストベース +| +| r3 の指す先は +| +0 [0] = exp_ex (例外を期待するなら 0x1000) +| +4 ここからテストコード +.globl test_flt +test_flt: + | 例外期待の有無を _main.c の exception_expected に書き戻す + ld %r12, %r3, 0 + st %r12, %r2, 4 + + | r1 を退避してテストコードへジャンプ + or %r5, %r0, %r1 + addu %r12, %r3, 4 + jsr %r12 | test + or %r1, %r0, %r5 + + | r2[0] の指す先(exception_occurred) は FltInv 例外が起きたら 8。 + | r3[0] は FltInv 例外期待なら 0x1000、起きないことを期待なら 0。 + | よって r2[0] と r3[0] を XOR して 0 になれば成功。 + | これを最後に r2 はつぶして戻り値として使う。 + ld %r2, %r2, 0 + ld %r13, %r3, 0 + xor %r2, %r2, %r13 + + | rD, rD+1 をチェック。 + | 実行結果は r8(,r9) に、期待値は r6(,r7) に入っている。 + cmp %r6, %r6, %r8 + cmp %r7, %r7, %r9 + or %r2, %r2, %r6 + or %r2, %r2, %r7 + + | ここで r2 は + | 例外の期待と結果が異なれば bit12(0x1000) がセットされている、 + | 演算の期待と結果が異なれば bit3(0x08) がセットされているので + | 0x1008 で AND すると、全部成功すれば 0、そうでなければ非 0 になる。 + and %r2, %r2, 0x1008 + jmp %r1