Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / logicgen.mud
1 <DEFINE AND-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
2         #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
3         <ANDOR-GEN .OP1 .OP2 .DEST AND>>
4
5 <DEFINE OR-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
6         #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
7         <ANDOR-GEN .OP1 .OP2 .DEST OR>>
8
9 <DEFINE EOR-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
10         #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
11         <ANDOR-GEN .OP1 .OP2 .DEST EOR>>
12
13 <DEFINE EQV-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
14         #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
15         <ANDOR-GEN .OP1 .OP2 .DEST EQV>>
16
17 <DEFINE ANDOR-GEN (OP1 OP2 DEST OPC "AUX" (VAC <>) TMP LVAR) 
18         #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM> (OPC) ATOM)
19         <COND (<TYPE? <SET TMP .OP1> FIX> <SET OP1 .OP2> <SET OP2 .TMP>)>
20         <COND (<AND <SET LVAR <FIND-CACHE-VAR .OP1>>
21                     <SET VAC <LINKVAR-VALUE-AC .LVAR>>
22                     <AVAILABLE? .VAC>>)
23               (<AND <TYPE? .OP2 VARTBL>
24                     <SET LVAR <FIND-CACHE-VAR <SET TMP .OP2>>>
25                     <SET VAC <LINKVAR-VALUE-AC .LVAR>>
26                     <AVAILABLE? .VAC>>
27                <SET OP2 .OP1>
28                <SET OP1 .TMP>)
29               (ELSE <SET VAC <>>)>
30         <COND (.VAC <MUNG-AC .VAC>)>
31         <COND (<TYPE? .OP2 FIX>
32                <COND (<==? .OPC EQV>
33                       <SET OP2 <CHTYPE <XORB .OP2 -1> FIX>>
34                       <SET OPC EOR>)
35                      (<==? .OPC AND> <SET OP2 <CHTYPE <XORB .OP2 -1> FIX>>)>)
36               (<OR <==? .OPC EQV> <==? .OPC AND>>
37                <COND (.VAC <EMIT ,INST-MCOML <MA-REG .VAC> <MA-REG .VAC>>)
38                      (ELSE
39                       <EMIT ,INST-MCOML
40                             <VAR-VALUE-ADDRESS .OP1>
41                             <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>)>
42                <COND (<==? .OPC EQV> <SET OPC EOR>)>)>
43         <COND (<AND .VAC
44                     <OR <N==? .OPC AND>
45                         <TYPE? .OP2 FIX>>>
46                <EMIT <COND (<==? .OPC AND> ,INST-BICL2)
47                            (<==? .OPC EOR> ,INST-XORL2)
48                            (ELSE ,INST-BISL2)>
49                      <COND (<TYPE? .OP2 FIX> <MA-IMM .OP2>)
50                            (ELSE <VAR-VALUE-ADDRESS .OP2>)>
51                      <MA-REG .VAC>>)
52               (<TYPE? .OP2 FIX>
53                <EMIT <COND (<==? .OPC AND> ,INST-BICL3)
54                            (<==? .OPC EOR> ,INST-XORL3)
55                            (ELSE ,INST-BISL3)>
56                      <MA-IMM .OP2>
57                      <VAR-VALUE-ADDRESS .OP1>
58                      <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>)
59               (ELSE
60                <EMIT <COND (<==? .OPC AND> ,INST-BICL3)
61                            (<==? .OPC EOR> ,INST-XORL3)
62                            (ELSE ,INST-BISL3)>
63                      <COND (<TYPE? .OP1 FIX> <MA-IMM .OP1>)
64                            (.VAC <MA-REG .VAC>)
65                            (ELSE <VAR-VALUE-ADDRESS .OP1>)>
66                      <VAR-VALUE-ADDRESS .OP2>
67                      <MA-REG <COND (.VAC)
68                                    (ELSE <SET VAC <GET-AC PREF-VAL T>>)>>>)>
69         <DEST-DECL .VAC .DEST FIX>
70         NORMAL>
71
72 <DEFINE ASH-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
73         #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
74         <SHIFT-GEN .VAL1 .VAL2 .DEST ASH>>
75
76 <DEFINE LSH-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
77         #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
78         <SHIFT-GEN .VAL1 .VAL2 .DEST LSH>>
79
80 <DEFINE ROT-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
81         #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
82         <SHIFT-GEN .VAL1 .VAL2 .DEST ROT>>
83
84 <DEFINE SHIFT-GEN (VAL1 VAL2 DEST OPC "AUX" (VAC <>) (USE-LONG <>) LVAR) 
85         #DECL ((VAL1 VAL2) <OR VARTBL FIX> (DEST) <OR VARTBL ATOM> (OPC) ATOM)
86         <COND (<AND <==? .OPC LSH>
87                     <OR <TYPE? .VAL1 VARTBL> <L? .VAL1 0>>
88                     <OR <TYPE? .VAL2 VARTBL> <L? .VAL2 0>>>
89                <SET VAC <GET-AC PREF-VAL T>>
90                <GET-AC <NEXT-AC .VAC> T>
91                <SET USE-LONG T>
92                <COND (<TYPE? .VAL1 VARTBL>
93                       <LOAD-VAR .VAL1 VALUE T .VAC>)
94                      (ELSE <LOAD-CONSTANT .VAC .VAL1>)>
95                <EMIT ,INST-CLRL <MA-REG <NEXT-AC .VAC>>>)
96               (<OR <TYPE? .VAL1 FIX>
97                    <NOT <AND <SET LVAR <FIND-CACHE-VAR .VAL1>>
98                              <SET VAC <LINKVAR-VALUE-AC .LVAR>>
99                              <AVAILABLE? .VAC>>>>
100                <SET VAC <>>)>
101         <COND (<AND .VAC <N==? .VAL1 .DEST>>
102                <MUNG-AC .VAC>)>
103         <EMIT <COND (<==? .OPC ROT> ,INST-ROTL)
104                     (.USE-LONG ,INST-ASHQ)
105                     (ELSE ,INST-ASHL)>
106               <COND (<TYPE? .VAL2 FIX> <MA-IMM .VAL2>)
107                     (ELSE <VAR-VALUE-ADDRESS .VAL2>)>
108               <COND (.VAC <MA-REG .VAC>)
109                     (<TYPE? .VAL1 FIX> <MA-IMM .VAL1>)
110                     (ELSE <VAR-VALUE-ADDRESS .VAL1>)>
111               <COND (.USE-LONG <MA-REG .VAC>)
112                     (.VAC <MA-REG .VAC>)
113                     (ELSE <MA-REG <SET VAC <GET-AC PREF-VAL>>>)>>
114         <DEST-DECL .VAC .DEST FIX>
115         NORMAL>