X-Git-Url: http://j8takagi.net/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=as%2Ffe_tests%2F2010_04%2FQ12%2Ffadd.casl;fp=as%2Ffe_tests%2F2010_04%2FQ12%2Ffadd.casl;h=fdf1eb5c8175e66d95bdd6834fbbb2d12f182930;hb=424f582a6be629ccdbf605a53ae22f5ce60a41f7;hp=0000000000000000000000000000000000000000;hpb=d1f82970bf7d41db2fea11b08cd8e308f6cb8138;p=YACASL2.git diff --git a/as/fe_tests/2010_04/Q12/fadd.casl b/as/fe_tests/2010_04/Q12/fadd.casl new file mode 100644 index 0000000..fdf1eb5 --- /dev/null +++ b/as/fe_tests/2010_04/Q12/fadd.casl @@ -0,0 +1,65 @@ +FADD START ; Z ← X + Y + RPUSH + PUSH 0,GR3 ; 結果 Z の格納領域の先頭番地を退避 + LD GR4,0,GR1 + AND GR4,=#00FF ; Ex: X の指数 + LD GR5,0,GR2 + AND GR5,=#00FF ; Ey: Y の指数 + LD GR6,1,GR1 ; Mx: X の仮数 + LD GR7,1,GR2 ; My: Y の仮数 +; 加算前の準備 (指数をそろえる) +; GR4 ← max(Ex,Ey) , GR6 ← 調整済 Mx , GR7 ← 調整済 My + LD GR3,GR4 + CPL GR4,GR5 + JZE MADD ; Ex = Ey の場合 + JMI BIGEY ; Ex < Ey の場合 + SUBL GR3,GR5 + SRL GR7,0,GR3 ; My を調整 + JUMP MADD +BIGEY LD GR4,GR5 + SUBL GR5,GR3 + SRL GR6,0,GR5 ; Mx を調整 +; 符号を考慮した仮数の加算 +; Sz: Z の符号 , Ez: Z の指数 , Mz: Z の仮数 +; GR4 ← (Sz,Ez) , GR5 ← Mz +MADD LD GR1,0,GR1 ; X の符号の検査 + JMI XMINUS ; 負の場合 + LD GR2,0,GR2 ; Y の符号の検査 + + LD GR5,GR6 ; X ≧ 0 , Y ≦ 0 の場合 + SUBL GR5,GR7 ; Mz ← 調整済 Mx − 調整済 My + JUMP SCHECK +XMINUS LD GR2,0,GR2 + JMI YMINUS + LD GR5,GR7 + SUBL GR5,GR6 + +YMINUS OR GR4,=#8000 ; Z に負符号を設定 +ADDMXY LD GR5,GR6 + ADDL GR5,GR7 ; Mz ← 調整済 Mx + 調整済 My + JOV ADJST ; けた上がりがある場合の正規化 + JUMP NORM +SCHECK JOV NEGMZ ; Mz の符号を検査 + JUMP NORM +NEGMZ OR GR4,=#8000 ; Sz に負符号を設定 + XOR GR5,=#FFFF ; Mz ← −Mz + ADDL GR5,=1 +;加算結果の正規化 +NORM LD GR5,GR5 ; ゼロチェック + JNZ LOOP + LD GR4,=0 + JUMP FIN +LOOP LD GR5,GR5 ; 正規化完了? + JMI FIN + + SUBL GR4,=1 + JUMP LOOP +ADJST SRL GR5,1 + OR GR5,=#8000 ; Mz の最上位ビットを 1 に設定 + +FIN POP GR3 + ST GR4,0,GR3 ; 結果 Z の格納 + ST GR5,1,GR3 + RPOP + RET + END