]> pd.if.org Git - mmurtl/commitdiff
autocommit for file dated 1995-01-17 09:02:22
authorRichard Burgess <>
Tue, 17 Jan 1995 09:02:22 +0000 (09:02 +0000)
committerNathan Wagner <nw@hydaspes.if.org>
Mon, 17 Oct 2016 14:03:47 +0000 (14:03 +0000)
msamples/cm32m/optimize.h [new file with mode: 0644]

diff --git a/msamples/cm32m/optimize.h b/msamples/cm32m/optimize.h
new file mode 100644 (file)
index 0000000..e1b4259
--- /dev/null
@@ -0,0 +1,236 @@
+/*\r
+ * Peephole Optimizer for the C Minus32 386 compiler.\r
+ *\r
+ * The strategy behind the peephole optimizer is to keep the peephole\r
+ * buffer completly filled.  The list of optimizations is in priority order\r
+ * in the table below. Each buffer full is checked against each entry\r
+ * in the table.  Even after a substitution is made, the new substituted\r
+ * code is left in the buffer to check for further optimization.\r
+ * See the rules for table entries\r
+ * just prior to the table below.  All entries are searched even after\r
+ * new code is inserted to ensure all optimization sequences used.\r
+ *\r
+ * Copyright 1990 Dave Dunfield\r
+ * Copyright 1992 R.A. Burgess\r
+ */\r
+#include <ctype.h>\r
+#include <stdio.h>\r
+#include <string.h>\r
+#include <stdlib.h>\r
+\r
+#define        OBUF_SIZE               10              /* number of entries in peephole buffer */\r
+#define        OLINE_SIZE              100             /* maximum size of input line */\r
+#define OSYMBOLS               8               /* maximum # symbols per peep */\r
+#define OSYMBOL_SIZE   25              /* maximum size of symbol */\r
+\r
+/*\r
+ * Peephole optimization table:\r
+ *\r
+ * Each two entries represent the instruction sequences:\r
+ * The first is the string of instructions to SEARCH for,\r
+ * the second is the optimized REPLACEMENT string.\r
+ *\r
+ * 1) The REPLACEMENT instructions are in reverse order!\r
+ * 2) The highest priority entries should be entered first in the table.\r
+ * 3) Tabs (\t) should begin each entry.\r
+ * 4) Linefeeds (\n) should end each except for the last entry of a line.\r
+ *\r
+ */\r
+\r
+char *peep_table[] = {\r
+\r
+/* 80386/80486 Optimizations */\r
+\r
+/* data movement & register usage optimizations */\r
+\r
+"\tMOV \200,\201\n\tMOV \201,\200",\r
+"\tMOV \200,\201",\r
+\r
+"\tMOV \200,\201\n\tMOV \200,\202",\r
+"\tMOV \200,\202",\r
+\r
+"\tMOV \200,\201\n\tMOV \202,\200\n\tMOV \201,\200",\r
+"\tMOV \202,\200\n\tMOV \200,\201",\r
+\r
+"\tMOV EAX,\200\n\tMOV ECX,EAX",\r
+"\tMOV ECX,\200",\r
+\r
+"\tMOV ESI,\200\n\tMOV EAX,ESI",\r
+"\tMOV EAX,\200",\r
+\r
+"\tLEA ESI,\200\n\tMOV EAX,ESI",\r
+"\tLEA EAX,\200",\r
+\r
+"\tPUSH EAX\n\tLEA ESI,\200\n\tMOV EAX,ESI\n\tPOP EBX\n\tADD EAX,EBX",\r
+"\tADD EAX,ESI\n\tLEA ESI,\200",\r
+\r
+"\tPOP EBX\n\tMOV EAX,EBX",\r
+"\tPOP EAX",\r
+\r
+/* indexing operations */\r
+\r
+"\tMOV ECX,32\n\tMUL ECX",\r
+"\tSHL EAX,5",\r
+\r
+"\tMOV ECX,32\n\tIMUL ECX",\r
+"\tSHL EAX,5",\r
+\r
+"\tMOV ECX,16\n\tMUL ECX",\r
+"\tSHL EAX,4",\r
+\r
+"\tMOV ECX,16\n\tIMUL ECX",\r
+"\tSHL EAX,4",\r
+\r
+"\tMOV ECX,8\n\tMUL ECX",\r
+"\tSHL EAX,3",\r
+\r
+"\tMOV ECX,8\n\tIMUL ECX",\r
+"\tSHL EAX,3",\r
+\r
+"\tMOV ECX,4\n\tMUL ECX",\r
+"\tSHL EAX,2",\r
+\r
+"\tMOV ECX,4\n\tIMUL ECX",\r
+"\tSHL EAX,2",\r
+\r
+"\tMOV ECX,2\n\tMUL ECX",\r
+"\tSHL EAX,1",\r
+\r
+"\tMOV ECX,2\n\tIMUL ECX",\r
+"\tSHL EAX,1",\r
+\r
+/* jump optimizations */\r
+\r
+"\tJMP \200\n\200:",\r
+"\200:",\r
+\r
+"\tJMP \200\n\201:\n\200:",\r
+"\200:\n\201:",\r
+\r
+"\tJMP \200\n\tJMP \201",\r
+"\tJMP \200",\r
+\r
+"\tJNZ \200\n\tJMP \201\n\200:\n\tJMP \202\n\201:",\r
+"\201:\n\tJMP \202\n\tJZ \201",\r
+\r
+"\tJZ \200\n\tJMP \201\n\200:\n\tJMP \202\n\201:",\r
+"\201:\n\tJMP \202\n\tJNZ \201",\r
+\r
+"\tJNZ \200\n\tJMP \201\n\200:\n\tJMP SHORT \202",\r
+"\tJMP \201\n\tJNZ \202",\r
+\r
+"\tJZ \200\n\tJMP \201\n\200:\n\tJMP SHORT \202",\r
+"\tJMP \201\n\tJZ \202",\r
+\r
+/* conversion optimizations */\r
+\r
+"\tMOV AL,\200\n\tMOVSX EAX,AL",\r
+"\tMOVSX EAX,BYTE PTR \200",\r
+\r
+"\tMOV AL,\200\n\tMOVZX EAX,AL",\r
+"\tMOVZX EAX,BYTE PTR \200",\r
+\r
+"\tMOV AX,\200\n\tMOVSX EAX,AX",\r
+"\tMOVSX EAX,WORD PTR \200",\r
+\r
+"\tMOV AX,\200\n\tMOVZX EAX,AX",\r
+"\tMOVZX EAX,WORD PTR \200",\r
+\r
+/* comparisons to ECX, or MOV into EAX for compare (when not needed) */\r
+\r
+"\tMOV ECX,\200\n\tCMP EAX,ECX",\r
+"\tCMP EAX,\200",\r
+\r
+"\tMOVSX ECX,BYTE PTR\200\n\tCMP EAX,ECX",\r
+"\tCMP AL,BYTE PTR\200",\r
+\r
+"\tMOVZX ECX,BYTE PTR\200\n\tCMP EAX,ECX",\r
+"\tCMP AL,BYTE PTR\200",\r
+\r
+/* stack/parameters */\r
+\r
+"\tMOV EAX,[\200\n\tPUSH EAX",\r
+"\tPUSH DWORD PTR [\200",\r
+\r
+"\tMOV EAX,\200\n\tPUSH EAX",\r
+"\tPUSH \200",\r
+\r
+/* more simple optimizations */\r
+\r
+"\tMOV EAX,0",\r
+"\tXOR EAX,EAX",\r
+\r
+"\tMOV AX,0",\r
+"\tXOR AX,AX",\r
+\r
+"\tMOV AL,0",\r
+"\tXOR AL,AL",\r
+\r
+"\tMOV AL,0",\r
+"\tXOR AL,AL",\r
+\r
+0 };\r
+\r
+/* circular peep hole buffer & read/write pointers */\r
+\r
+       char peep_buffer[OBUF_SIZE][OLINE_SIZE];\r
+\r
+       unsigned peep_top = 0,          /* first entry in circular buffer */\r
+                        peep_next = 0;         /* Next place to put new entry    */\r
+\r
+       /* If ((next+1) mod n entries) == top then buffer is full */\r
+       /* If next == top then buffer is empty */\r
+\r
+/* Symbol table */\r
+\r
+       char symbols[OSYMBOLS][OSYMBOL_SIZE];\r
+\r
+/* End of Optimize.h */\r
+\r
+/* candidates\r
+OLD:\r
+       SHL EAX,2\r\r
+       MOV ESI,OFFSET xxxx\r\r
+       ADD ESI,EAX\r\r
+       MOV EAX,[ESI]\r\r
+NEW:\r
+       MOV ESI,OFFSET xxxx\r\r
+       MOV EAX, [ESI+EAX*2]\r
+\r
+OLD:\r
+       ADD ESI,xx\r
+       MOV rr,nnn\r
+       MOV [ESI],rr\r
+NEW\r
+       MOV rr,nnn\r
+       MOV [ESI+xx],rr\r
+\r
+OLD\r
+       ADD ESI,xx\r
+       MOV rr, [ESI]\r
+NEW\r
+       MOV rr, [ESI+xx]\r
+\r
+\r
+OLD (candidates):\r
+       ADD ESI,EAX\r
+       ADD ESI,4\r
+       MOVZX EAX,WORD PTR _CrntStrucDef\r
+       MOV [ESI],AX\r
+\r
+       ADD ESI,EAX\r
+       MOV EAX,[EBP-16]\r
+       MOV [ESI],EAX\r
+\r
+       ADD ESI,EAX\r
+       ADD ESI,10\r
+       MOVZX EAX,WORD PTR [ESI]\r
+\r
+       ADD ESI,EAX\r
+       ADD ESI,8\r
+       MOV EAX,DWORD PTR [ESI]\r
+\r
+       ADD ESI,EAX\r
+       MOV EAX,DWORD PTR [ESI]\r
+\r
+*/\r