Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / double.mud
1 <DEFINE DOUBLE-ADDR (FROB "AUX" AC)
2   <COND (<TYPE? .FROB VARTBL>
3          <COND (<SET AC <VAR-VALUE-IN-AC? .FROB>>
4                 <MA-REGD .AC>)
5                (T
6                 <GEN-LOC .FROB 4 T>)>)
7         (T
8          <MA-DEF-DISP ,AC-M <+ <ADD-MVEC .FROB> 4>>)>>
9
10 <DEFINE DOUBLE-GEN (OPER "TUPLE" ARGS "AUX" (RES ,HAS-RESULT)
11                     RRES TLAB (TAC <>) (VAC <>))
12   <SET OPER <SPNAME .OPER>>
13   <COND (<MEMBER .OPER '["ADD" "SUB" "MUL" "DIV"]>
14          <SET RRES <3 .ARGS>>
15          <EMIT <COND (<=? .OPER "ADD"> ,INST-ADDD3)
16                      (<=? .OPER "SUB"> ,INST-SUBD3)
17                      (<=? .OPER "MUL"> ,INST-MULD3)
18                      (<=? .OPER "DIV"> ,INST-DIVD3)>
19                <DOUBLE-ADDR <1 .ARGS>>
20                <DOUBLE-ADDR <2 .ARGS>>
21                <DOUBLE-ADDR <3 .ARGS>>>)
22         (<MEMBER .OPER '["G?" "=?" "L?"]>
23          <COND (<TYPE? .RES VARTBL>
24                 <COND (<SET TAC <VAR-TYPE-WORD-IN-AC? .RES>>
25                        <PROTECT .TAC>)>
26                 <COND (<SET VAC <VAR-VALUE-IN-AC? .RES>>
27                        <PROTECT .VAC>)>
28                 <DEAD-VAR .RES>)>
29          <SET TLAB <MAKE-LABEL>>
30          <COND (<==? .RES STACK>
31                 <EMIT-PUSH <TYPE-WORD FALSE> LONG>)
32                (.TAC
33                 <EMIT-MOVE <TYPE-WORD FALSE> <MA-REG .TAC> LONG>)
34                (T
35                 <EMIT-MOVE <TYPE-WORD FALSE> <VAR-TYPE-ADDRESS .RES> LONG>)>
36          <EMIT ,INST-CMPD
37                <DOUBLE-ADDR <1 .ARGS>>
38                <DOUBLE-ADDR <2 .ARGS>>>
39          <GEN-BRANCH <COND (<=? .OPER "G?">
40                             ,INST-BLEQ)
41                            (<=? .OPER "=?">
42                             ,INST-BNEQ)
43                            (<=? .OPER "L?">
44                             ,INST-BGEQ)>
45                      .TLAB <>>
46          <COND (<==? .RES STACK>
47                 <EMIT-MOVE <TYPE-WORD FIX> <MA-DISP ,AC-TP -4> LONG>)
48                (.TAC
49                 <EMIT-MOVE <TYPE-WORD FIX> <MA-REG .TAC> LONG>)
50                (T
51                 <EMIT-MOVE <TYPE-WORD FIX> <VAR-TYPE-ADDRESS .RES> LONG>)>
52          <EMIT-LABEL .TLAB <>>
53          <COND (<==? .RES STACK>
54                 <EMIT-PUSH <MA-IMM 0> LONG>)
55                (.VAC
56                 <EMIT-MOVE <MA-IMM 0> <MA-REG .VAC> LONG>)
57                (T
58                 <EMIT-MOVE <MA-IMM 0> <VAR-VALUE-ADDRESS .RES> LONG>)>
59          <COND (.TAC
60                 <LINK-VAR-TO-AC .RES .TAC TYPE-WORD>)>
61          <COND (.VAC
62                 <LINK-VAR-TO-AC .RES .VAC VALUE>)>)
63         (<=? .OPER "DOUBLE-TO-SINGLE">
64          <COND (<TYPE? .RES VARTBL>
65                 <COND (<SET VAC <VAR-VALUE-IN-AC? .RES>>
66                        <PROTET .VAC>)
67                       (T
68                        <SET VAC <GET-AC PREF-VAL T>>)>
69                 <DEAD-VAR .RES>)
70                (T
71                 <EMIT-PUSH <TYPE-WORD FLOAT> LONG>)>
72          <EMIT ,INST-CVTDF <DOUBLE-ADDR <1 .ARGS>>
73                <COND (.VAC <MA-REG .VAC>)
74                      (T
75                       <MA-AINC ,AC-TP>)>>
76          <COND (.VAC
77                 <DEST-DECL .VAC .RES FLOAT>)>)
78         (<=? .OPER "SINGLE-TO-DOUBLE">
79          <SET VAC <LOAD-VAR <2 .ARGS> VALUE T PREF-VAL>>
80          <SET TAC <LOAD-VAR <2 .ARGS> TYPE <> <PREV-AC .VAC>>>
81          <EMIT ,INST-CVTFD
82                <VAR-VALUE-ADDRESS <1 .ARGS>>
83                <MA-REGD .VAC>>
84          <COND (.RES <DEST-PAIR .VAC .TAC .RES>)>)>
85   NORMAL>