アセンブラファイルの整理
[YACASL2.git] / as / fe_tests / 2010_04 / Q12 / fadd.casl
1 FADD    START              ; Z ← X + Y
2         RPUSH
3         PUSH  0,GR3        ; 結果 Z の格納領域の先頭番地を退避
4         LD    GR4,0,GR1
5         AND   GR4,=#00FF   ; Ex: X の指数
6         LD    GR5,0,GR2
7         AND   GR5,=#00FF   ; Ey: Y の指数
8         LD    GR6,1,GR1    ; Mx: X の仮数
9         LD    GR7,1,GR2    ; My: Y の仮数
10 ; 加算前の準備 (指数をそろえる)
11 ; GR4 ← max(Ex,Ey) , GR6 ← 調整済 Mx , GR7 ← 調整済 My
12         LD    GR3,GR4
13         CPL   GR4,GR5
14         JZE   MADD         ; Ex = Ey の場合
15         JMI   BIGEY        ; Ex < Ey の場合
16         SUBL  GR3,GR5
17         SRL   GR7,0,GR3    ; My を調整
18         JUMP  MADD
19 BIGEY   LD    GR4,GR5
20         SUBL  GR5,GR3
21         SRL   GR6,0,GR5    ; Mx を調整
22 ; 符号を考慮した仮数の加算
23 ; Sz: Z の符号 , Ez: Z の指数 , Mz: Z の仮数
24 ; GR4 ← (Sz,Ez) , GR5 ← Mz
25 MADD    LD    GR1,0,GR1    ; X の符号の検査
26         JMI   XMINUS       ;   負の場合
27         LD    GR2,0,GR2    ; Y の符号の検査
28         
29         LD    GR5,GR6      ; X ≧ 0 , Y ≦ 0 の場合
30         SUBL  GR5,GR7      ; Mz ← 調整済 Mx − 調整済 My
31         JUMP  SCHECK
32 XMINUS  LD    GR2,0,GR2
33         JMI   YMINUS
34         LD    GR5,GR7
35         SUBL  GR5,GR6
36         
37 YMINUS  OR    GR4,=#8000   ; Z に負符号を設定
38 ADDMXY  LD    GR5,GR6
39         ADDL  GR5,GR7      ; Mz ← 調整済 Mx + 調整済 My
40         JOV   ADJST        ; けた上がりがある場合の正規化
41         JUMP  NORM
42 SCHECK  JOV   NEGMZ        ; Mz の符号を検査
43         JUMP  NORM
44 NEGMZ   OR    GR4,=#8000   ; Sz に負符号を設定
45         XOR   GR5,=#FFFF   ; Mz ← −Mz
46         ADDL  GR5,=1
47 ;加算結果の正規化 
48 NORM    LD    GR5,GR5      ; ゼロチェック
49         JNZ   LOOP
50         LD    GR4,=0
51         JUMP  FIN
52 LOOP    LD    GR5,GR5      ; 正規化完了?
53         JMI   FIN
54         
55         SUBL  GR4,=1
56         JUMP  LOOP
57 ADJST   SRL   GR5,1
58         OR    GR5,=#8000   ; Mz の最上位ビットを 1 に設定
59         
60 FIN     POP   GR3
61         ST    GR4,0,GR3    ; 結果 Z の格納
62         ST    GR5,1,GR3
63         RPOP
64         RET
65         END