Annotation of nono/exp/optestm88k/optestm88k_code.s, revision 1.1.1.1

1.1       root        1: |
                      2: | nono
                      3: | Copyright (C) 2021 nono project
                      4: | Licensed under nono-license.txt
                      5: |
                      6: 
                      7: | アセンブラのテストコードのうち固定部分
                      8: 
                      9: | 汎用演算命令のテストベース
                     10: |
                     11: | r3 の指す先は
                     12: |  +0   = exp_rd
                     13: |  +4   ここからテストコード(可変長)
                     14: .globl test_generic
                     15: test_generic:
                     16:        | 例外は起きない
                     17:        st      %r0, %r2, 4
                     18: 
                     19:        | r1 を退避してテストコードへジャンプ
                     20:        or      %r9, %r0, %r1
                     21:        addu    %r12, %r3, 4
                     22:        jsr     %r12            | test
                     23:        or      %r1, %r0, %r9
                     24: 
                     25:        | r2[0] の指す先(exception_occurred) は例外が起きたら 1、起きなければ 0。
                     26:        | これを最後に r2 はつぶして、戻り値として使う。
                     27:        ld      %r2, %r2, 0
                     28: 
                     29:        | rD をチェック。
                     30:        | 実行結果は r11 に、期待値は r3[0] に入っている。
                     31:        | cmp 結果の bit0 は %0 なので直前の例外結果と OR できる。
                     32:        ld      %r10, %r3, 0
                     33:        cmp     %r10, %r10, %r11
                     34:        or      %r2, %r2, %r10
                     35: 
                     36:        | ここで r2 は
                     37:        | 例外の期待と結果が異なれば bit0(0x01) がセットされている、
                     38:        | 演算の期待と結果が異なれば bit3(0x08) がセットされているので
                     39:        | 0x09 で AND すると、全部成功すれば 0、そうでなければ非 0 になる。
                     40:        and     %r2, %r2, 0x9
                     41:        jmp     %r1
                     42: 
                     43: | add/sub 命令のテストベース
                     44: |
                     45: | r3 の指す先は
                     46: |  +0   [0] = exp_rd (rD の期待値)
                     47: |  +4.b [4] = cin    (Cy の入力値)
                     48: |  +5.b [5] = exp_cy (Cy の期待値)
                     49: |  +6.b [6] = exp_ex (例外を期待するなら 1)
                     50: |  +8   [2] ここからテストコード(可変長)
                     51: .globl test_addsub
                     52: test_addsub:
                     53:        | 例外期待の有無を _main.c の exception_expected に書き戻す
                     54:        ld.bu   %r12, %r3, 6
                     55:        st      %r12, %r2, 4
                     56: 
                     57:        | Cy の初期値をセット
                     58:        | cin == 1 ならセット、cin == 0 ならクリア
                     59:        ld.bu   %r12, %r3, 4
                     60:        or.c    %r13, %r0, %r0
                     61:        addu.co %r0, %r12, %r13
                     62: 
                     63:        | r1 を退避してテストコードへジャンプ
                     64:        or      %r9, %r0, %r1
                     65:        addu    %r12, %r3, 8
                     66:        jsr     %r12            | test
                     67:        or      %r1, %r0, %r9
                     68: 
                     69:        | r2[0] の指す先(exception_occurred) は例外が起きたら 1、起きなければ 0。
                     70:        | r3.b[6] は例外期待なら 1、例外が起きないことを期待なら 0。
                     71:        | よって r2[0] と r3[2] を XOR して 0 になれば成功。
                     72:        | これを最後に r2 はつぶして、戻り値として使う。
                     73:        ld      %r2, %r2, 0
                     74:        ld.bu   %r13, %r3, 6
                     75:        xor     %r2, %r2, %r13
                     76: 
                     77:        | rD をチェック。
                     78:        | 実行結果は r11 に、期待値は r10 に入っている。
                     79:        | cmp 結果の bit0 は %0 なので直前の例外結果と OR できる。
                     80:        cmp     %r11, %r11, %r10
                     81:        or      %r2, %r2, %r11
                     82: 
                     83:        | Cy をチェック。
                     84:        | 実行結果は Cy に、期待値は r3.b[5] にある。
                     85:        ld.bu   %r12, %r3, 5
                     86:        add.ci  %r13, %r0, %r0  | Get Cy
                     87:        cmp     %r13, %r13, %r12
                     88:        or      %r2, %r2, %r13
                     89: 
                     90:        | ここで r2 は
                     91:        | 例外の期待と結果が異なれば bit0(0x01) がセットされている、
                     92:        | 演算の期待と結果が異なれば bit3(0x08) がセットされているので
                     93:        | 0x09 で AND すると、全部成功すれば 0、そうでなければ非 0 になる。
                     94:        and     %r2, %r2, 0x9
                     95:        jmp     %r1
                     96: 
                     97: | div 命令のテストベース
                     98: |
                     99: | r3 の指す先は
                    100: |  +0   [0] = exp_rd (rD の期待値)
                    101: |  +4   [1] = exp_ex (Integer Divide 例外を期待するなら 2)
                    102: |  +8   [3] ここからテストコード (可変長)
                    103: .globl test_div
                    104: test_div:
                    105:        | 例外期待の有無を _main.c の exception_expected に書き戻す
                    106:        ld      %r12, %r3, 4
                    107:        st      %r12, %r2, 4
                    108: 
                    109:        | r1 を退避してテストコードへジャンプ
                    110:        or      %r9, %r0, %r1
                    111:        addu    %r12, %r3, 8
                    112:        jsr     %r12            | test
                    113:        or      %r1, %r0, %r9
                    114: 
                    115:        | r2[0] の指す先(exception_occurred) は IntDiv 例外が起きたら 2。
                    116:        | r3[1] は IntDiv 例外期待なら 2、起きないことを期待なら 0。
                    117:        | よって r2[0] と r3[1] を XOR して 0 になれば成功。
                    118:        | これを最後に r2 はつぶして戻り値として使う。
                    119:        ld      %r2, %r2, 0
                    120:        ld      %r13, %r3, 4
                    121:        xor     %r2, %r2, %r13
                    122: 
                    123:        | rD をチェック。
                    124:        | 実行結果は r11 に、期待値は r10 に入っている。
                    125:        | cmp 結果の bit0-1 は %0 なので直前の例外結果と OR できる。
                    126:        cmp     %r11, %r11, %r10
                    127:        or      %r2, %r2, %r11
                    128: 
                    129:        | ここで r2 は
                    130:        | 例外の期待と結果が異なれば bit0-1(0x03) がセットされている、
                    131:        | 演算の期待と結果が異なれば bit3(0x08) がセットされているので
                    132:        | 0x0b で AND すると、全部成功すれば 0、そうでなければ非 0 になる。
                    133:        and     %r2, %r2, 0xb
                    134:        jmp     %r1

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.