Machine-Independent MDL for TOPS-20 and VAX.
[pdp10-muddle.git] / mim / development / mim / vaxc / logicgen.mud
diff --git a/mim/development/mim/vaxc/logicgen.mud b/mim/development/mim/vaxc/logicgen.mud
new file mode 100644 (file)
index 0000000..ab1ddee
--- /dev/null
@@ -0,0 +1,115 @@
+<DEFINE AND-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
+       #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
+       <ANDOR-GEN .OP1 .OP2 .DEST AND>>
+
+<DEFINE OR-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
+       #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
+       <ANDOR-GEN .OP1 .OP2 .DEST OR>>
+
+<DEFINE EOR-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
+       #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
+       <ANDOR-GEN .OP1 .OP2 .DEST EOR>>
+
+<DEFINE EQV-GEN (OP1 OP2 DEST "OPTIONAL" HINT) 
+       #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM>)
+       <ANDOR-GEN .OP1 .OP2 .DEST EQV>>
+
+<DEFINE ANDOR-GEN (OP1 OP2 DEST OPC "AUX" (VAC <>) TMP LVAR) 
+       #DECL ((OP1 OP2) <OR FIX VARTBL> (DEST) <OR VARTBL ATOM> (OPC) ATOM)
+       <COND (<TYPE? <SET TMP .OP1> FIX> <SET OP1 .OP2> <SET OP2 .TMP>)>
+       <COND (<AND <SET LVAR <FIND-CACHE-VAR .OP1>>
+                   <SET VAC <LINKVAR-VALUE-AC .LVAR>>
+                   <AVAILABLE? .VAC>>)
+             (<AND <TYPE? .OP2 VARTBL>
+                   <SET LVAR <FIND-CACHE-VAR <SET TMP .OP2>>>
+                   <SET VAC <LINKVAR-VALUE-AC .LVAR>>
+                   <AVAILABLE? .VAC>>
+              <SET OP2 .OP1>
+              <SET OP1 .TMP>)
+             (ELSE <SET VAC <>>)>
+       <COND (.VAC <MUNG-AC .VAC>)>
+       <COND (<TYPE? .OP2 FIX>
+              <COND (<==? .OPC EQV>
+                     <SET OP2 <CHTYPE <XORB .OP2 -1> FIX>>
+                     <SET OPC EOR>)
+                    (<==? .OPC AND> <SET OP2 <CHTYPE <XORB .OP2 -1> FIX>>)>)
+             (<OR <==? .OPC EQV> <==? .OPC AND>>
+              <COND (.VAC <EMIT ,INST-MCOML <MA-REG .VAC> <MA-REG .VAC>>)
+                    (ELSE
+                     <EMIT ,INST-MCOML
+                           <VAR-VALUE-ADDRESS .OP1>
+                           <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>)>
+              <COND (<==? .OPC EQV> <SET OPC EOR>)>)>
+       <COND (<AND .VAC
+                   <OR <N==? .OPC AND>
+                       <TYPE? .OP2 FIX>>>
+              <EMIT <COND (<==? .OPC AND> ,INST-BICL2)
+                          (<==? .OPC EOR> ,INST-XORL2)
+                          (ELSE ,INST-BISL2)>
+                    <COND (<TYPE? .OP2 FIX> <MA-IMM .OP2>)
+                          (ELSE <VAR-VALUE-ADDRESS .OP2>)>
+                    <MA-REG .VAC>>)
+             (<TYPE? .OP2 FIX>
+              <EMIT <COND (<==? .OPC AND> ,INST-BICL3)
+                          (<==? .OPC EOR> ,INST-XORL3)
+                          (ELSE ,INST-BISL3)>
+                    <MA-IMM .OP2>
+                    <VAR-VALUE-ADDRESS .OP1>
+                    <MA-REG <SET VAC <GET-AC PREF-VAL T>>>>)
+             (ELSE
+              <EMIT <COND (<==? .OPC AND> ,INST-BICL3)
+                          (<==? .OPC EOR> ,INST-XORL3)
+                          (ELSE ,INST-BISL3)>
+                    <COND (<TYPE? .OP1 FIX> <MA-IMM .OP1>)
+                          (.VAC <MA-REG .VAC>)
+                          (ELSE <VAR-VALUE-ADDRESS .OP1>)>
+                    <VAR-VALUE-ADDRESS .OP2>
+                    <MA-REG <COND (.VAC)
+                                  (ELSE <SET VAC <GET-AC PREF-VAL T>>)>>>)>
+       <DEST-DECL .VAC .DEST FIX>
+       NORMAL>
+
+<DEFINE ASH-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
+       #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
+       <SHIFT-GEN .VAL1 .VAL2 .DEST ASH>>
+
+<DEFINE LSH-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
+       #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
+       <SHIFT-GEN .VAL1 .VAL2 .DEST LSH>>
+
+<DEFINE ROT-GEN (VAL1 VAL2 DEST "OPTIONAL" HINT) 
+       #DECL ((VAL1 VAL2) <OR FIX VARTBL> (DEST) <OR ATOM VARTBL>)
+       <SHIFT-GEN .VAL1 .VAL2 .DEST ROT>>
+
+<DEFINE SHIFT-GEN (VAL1 VAL2 DEST OPC "AUX" (VAC <>) (USE-LONG <>) LVAR) 
+       #DECL ((VAL1 VAL2) <OR VARTBL FIX> (DEST) <OR VARTBL ATOM> (OPC) ATOM)
+       <COND (<AND <==? .OPC LSH>
+                   <OR <TYPE? .VAL1 VARTBL> <L? .VAL1 0>>
+                   <OR <TYPE? .VAL2 VARTBL> <L? .VAL2 0>>>
+              <SET VAC <GET-AC PREF-VAL T>>
+              <GET-AC <NEXT-AC .VAC> T>
+              <SET USE-LONG T>
+              <COND (<TYPE? .VAL1 VARTBL>
+                     <LOAD-VAR .VAL1 VALUE T .VAC>)
+                    (ELSE <LOAD-CONSTANT .VAC .VAL1>)>
+              <EMIT ,INST-CLRL <MA-REG <NEXT-AC .VAC>>>)
+             (<OR <TYPE? .VAL1 FIX>
+                  <NOT <AND <SET LVAR <FIND-CACHE-VAR .VAL1>>
+                            <SET VAC <LINKVAR-VALUE-AC .LVAR>>
+                            <AVAILABLE? .VAC>>>>
+              <SET VAC <>>)>
+       <COND (<AND .VAC <N==? .VAL1 .DEST>>
+              <MUNG-AC .VAC>)>
+       <EMIT <COND (<==? .OPC ROT> ,INST-ROTL)
+                   (.USE-LONG ,INST-ASHQ)
+                   (ELSE ,INST-ASHL)>
+             <COND (<TYPE? .VAL2 FIX> <MA-IMM .VAL2>)
+                   (ELSE <VAR-VALUE-ADDRESS .VAL2>)>
+             <COND (.VAC <MA-REG .VAC>)
+                   (<TYPE? .VAL1 FIX> <MA-IMM .VAL1>)
+                   (ELSE <VAR-VALUE-ADDRESS .VAL1>)>
+             <COND (.USE-LONG <MA-REG .VAC>)
+                   (.VAC <MA-REG .VAC>)
+                   (ELSE <MA-REG <SET VAC <GET-AC PREF-VAL>>>)>>
+       <DEST-DECL .VAC .DEST FIX>
+       NORMAL>
\ No newline at end of file