53579ce777f94e5ab3a96ad621c4a4c9c8ea8358
[YACASL2.git] / as / casl2lib / mull.casl
1 ;;; 0〜65535の範囲にある正数のかけ算(筆算方式)を行う
2 ;;; 入力 GR1:被乗数 GR2:乗数
3 ;;; 出力 GR3:積
4 ;;; 積が65535より大きい場合は、オーバーフロー
5 MULL    START
6         XOR     GR3,GR3         ; GR3の初期化
7         AND     GR1,GR1         ; GR1 = 0 の場合、FINへジャンプ
8         JZE     FIN             ; ↓
9         AND     GR2,GR2         ; GR2 = 0 の場合、FINへジャンプ
10         JZE     FIN             ; ↓
11         PUSH    0,GR1           ; GR1の退避
12         PUSH    0,GR2           ; GR2の退避
13 LOOP    SRL     GR2,1           ; ループ開始。SRLを1つ右シフト
14         JOV     ON              ; 乗数の最下位ビットが1の場合、ONへジャンプ
15         JUMP    NEXT            ; NEXTへジャンプ
16 ON      ADDL    GR3,GR1         ; GR3 <- GR3 + GR1
17         JOV     POST            ; GR3がオーバーフローした場合、POSTへジャンプ
18 NEXT    AND     GR2,GR2         ; GR2 = 0 の場合、POSTへジャンプ
19         JZE     POST            ; ↓
20         SLL     GR1,1           ; GR1を1つ左シフト
21         JOV     POST            ; GR1がオーバーフローした場合、POSTへジャンプ
22         JUMP    LOOP            ; ループ終端
23 POST    POP     GR2             ; GR2の復元
24         POP     GR1             ; GR1の復元
25 FIN     RET
26         END