ブランチ「label-local」をマージ
[YACASL2.git] / as / FUNC / mull1.casl
1 ;;; GR1の値とGR2の値の積をGR0に格納
2 MULL    START
3         RPUSH
4         XOR     GR0,GR0         ; 積
5         LAD     GR4,1           ; 対象ビット
6 LOOP    PUSH    0,GR4           ; ループ先頭。GR2の、GR4が示したビットが0の場合、NEXTへジャンプ
7         AND     GR4,GR2         ; ↓
8         POP     GR4             ; ↓
9         JZE     NEXT            ; ↓
10         ADDL    GR0,GR1         ; GR0 <- GR0 + GR1
11         JOV     FIN             ; オーバーフローした場合、OVPへジャンプ
12 NEXT    SLL     GR4,1           ; GR4を1回左シフト
13         AND     GR4,GR4         ; (GR4 = 0)の場合、ループ脱出
14         JZE     FIN             ; ↓
15         CPL     GR4,GR2         ; (GR4 > GR2)の場合、ループ脱出
16         JPL     FIN             ; ↓
17         SLL     GR1,1           ; GR1を1回左シフト
18         JOV     FIN             ; オーバーフローした場合、ループ脱出
19         JUMP    LOOP            ; ループ終端
20 OVP     ADDL    GR3,=1
21         JUMP    NEXT
22 FIN     RPOP
23         RET
24         END