diff options
Diffstat (limited to 'misc/pascal/insn32/plopt/psopt.c')
-rw-r--r-- | misc/pascal/insn32/plopt/psopt.c | 384 |
1 files changed, 0 insertions, 384 deletions
diff --git a/misc/pascal/insn32/plopt/psopt.c b/misc/pascal/insn32/plopt/psopt.c deleted file mode 100644 index 6794115c8..000000000 --- a/misc/pascal/insn32/plopt/psopt.c +++ /dev/null @@ -1,384 +0,0 @@ -/********************************************************************** - * psopt.c - * String Stack Optimizaitons - * - * Copyright (C) 2008 Gregory Nutt. All rights reserved. - * Author: Gregory Nutt <spudmonkey@racsa.co.cr> - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * 1. Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * 2. Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * 3. Neither the name NuttX nor the names of its contributors may be - * used to endorse or promote products derived from this software - * without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS - * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, - * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, - * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS - * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED - * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT - * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN - * ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - * POSSIBILITY OF SUCH DAMAGE. - * - **********************************************************************/ - -/* The statement generation logic generates a PUSHS and POPS around - * every statement. These instructions save and restore the string - * stack pointer registers. However, only some statements actually - * modify the string stack. So the first major step in the optimatization - * process is to retain only PUSHS and POPS statements that are - * actually required. - */ - -/********************************************************************** - * Included Files - **********************************************************************/ - -#include <stdio.h> -#include <stdlib.h> -#include <string.h> - -#include "keywords.h" -#include "pdefs.h" -#include "pedefs.h" -#include "pinsn32.h" -#include "pxdefs.h" - -#include "popt.h" -#include "psopt.h" - -/********************************************************************** - * Definitions - **********************************************************************/ - -#define PBUFFER_SIZE 1024 -#define NPBUFFERS 8 - -/********************************************************************** - * Private Data - **********************************************************************/ - -static ubyte *pbuffer[NPBUFFERS]; -static int nbytes_in_pbuffer[NPBUFFERS]; -static int current_level = -1; -static int inch; - -/********************************************************************** - * Private Function Prototypes - **********************************************************************/ - -static inline void putbuf(int c, poffProgHandle_t poffProgHandle); -static inline void flushc(int c, poffProgHandle_t poffProgHandle); -static inline void flushbuf(poffProgHandle_t poffProgHandle); -static void dopush(poffHandle_t poffHandle, poffProgHandle_t poffProgHandle); -static void dopop(poffHandle_t poffHandle, poffProgHandle_t poffProgHandle); - -/********************************************************************** - * Private Inline Functions - **********************************************************************/ - -static inline void putbuf(int c, poffProgHandle_t poffProgHandle) -{ - int dlvl = current_level; - - if (dlvl < 0) - { - /* No PUSHS encountered. Write byte directly to output */ - - poffAddTmpProgByte(poffProgHandle, (ubyte)c); - } - else - { - /* PUSHS encountered. Write byte into buffer associated with - * nesting level. - */ - - int idx = nbytes_in_pbuffer[dlvl]; - ubyte *dest = pbuffer[dlvl] + idx; - *dest = c; - nbytes_in_pbuffer[dlvl] = idx + 1; - } -} - -static inline void flushc(int c, poffProgHandle_t poffProgHandle) -{ - if (current_level > 0) - { - /* Nested PUSHS encountered. Write byte into buffer associated - * with the previous nesting level. - */ - - int dlvl = current_level - 1; - int idx = nbytes_in_pbuffer[dlvl]; - ubyte *dest = pbuffer[dlvl] + idx; - *dest = c; - nbytes_in_pbuffer[dlvl] = idx + 1; - } - else - { - /* Only one PUSHS encountered. Write directly to the output - * buffer - */ - - poffAddTmpProgByte(poffProgHandle, (ubyte)c); - } -} - -static inline void flushbuf(poffProgHandle_t poffProgHandle) -{ - int errCode; - int slvl = current_level; - - if (nbytes_in_pbuffer[slvl] > 0) - { - if (current_level > 0) - { - /* Nested PUSHS encountered. Flush buffer into buffer associated - * with the previous nesting level. - */ - - int dlvl = slvl - 1; - ubyte *src = pbuffer[slvl]; - ubyte *dest = pbuffer[dlvl] + nbytes_in_pbuffer[dlvl]; - - memcpy(dest, src, nbytes_in_pbuffer[slvl]); - nbytes_in_pbuffer[dlvl] += nbytes_in_pbuffer[slvl]; - } - else - { - /* Only one PUSHS encountered. Flush directly to the output - * buffer - */ - - errCode = poffWriteTmpProgBytes(pbuffer[0], nbytes_in_pbuffer[0], - poffProgHandle); - - if (errCode != eNOERROR) - { - printf("Error writing to file: %d\n", errCode); - exit(1); - } - } - } - nbytes_in_pbuffer[slvl] = 0; -} - -/********************************************************************** - * Private Functions - **********************************************************************/ - -static void dopush(poffHandle_t poffHandle, poffProgHandle_t poffProgHandle) -{ - int opcode; - - while (inch != EOF) - { - /* Search for a PUSHS opcode */ - - if (inch != oPUSHS) - { - /* Its not PUSHS, just echo to the output file/buffer */ - - putbuf(inch, poffProgHandle); - - /* Get the next byte from the input stream */ - - opcode = inch; - inch = poffGetProgByte(poffHandle); - - /* Check for a 32-bit argument */ - - if ((opcode & o32) != 0) - { - /* Echo the 32-bits of the argument */ - - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - } - } - else - { - /* We have found PUSHS. No search for the next occurrence - * of either and instruction that increments the string - * stack or for the matching POPS - */ - - current_level++; - dopop(poffHandle, poffProgHandle); - current_level--; - } - } -} - -static void dopop(poffHandle_t poffHandle, poffProgHandle_t poffProgHandle) -{ - /* We have found PUSHS. No search for the next occurrence - * of either and instruction that increments the string - * stack or for the matching POPS - */ - - /* Skip over the PUSHS for now */ - - inch = poffGetProgByte(poffHandle); - - while (inch != EOF) - { - /* Did we encounter another PUSHS? */ - - if (inch == oPUSHS) - { - /* Yes... recurse to handle it */ - - current_level++; - dopop(poffHandle, poffProgHandle); - current_level--; - } - - else if (inch == oPOPS) - { - /* Flush the buffered data without the PUSHS */ - - flushbuf(poffProgHandle); - - /* And discard the matching POPS */ - - inch = poffGetProgByte(poffHandle); - break; - } - else if (inch == oLIB) - { - uint32 arg32; - unsigned int tmp; - - /* Get the 32-bit argument from the big endian data stream */ - - tmp = poffGetProgByte(poffHandle); - arg32 = tmp << 24; - putbuf(tmp, poffProgHandle); - - tmp = poffGetProgByte(poffHandle); - arg32 |= tmp << 16; - putbuf(tmp, poffProgHandle); - - tmp = poffGetProgByte(poffHandle); - arg32 |= tmp << 8; - putbuf(tmp, poffProgHandle); - - tmp = poffGetProgByte(poffHandle); - arg32 |= tmp; - putbuf(tmp, poffProgHandle); - - inch = poffGetProgByte(poffHandle); - - /* Is it LIB MKSTK? MKSTKSTR? or MKSTKC? */ - - if ((arg32 == lbMKSTK) || - (arg32 == lbMKSTKSTR) || - (arg32 == lbMKSTKC)) - { - /* Flush the buffered data with the PUSHS */ - - flushc(oPUSHS, poffProgHandle); - flushbuf(poffProgHandle); - - /* And break out of the loop to search for - * the next PUSHS - */ - - break; - } - } - else - { - int opcode; - - /* Something else. Put it in the buffer */ - - putbuf(inch, poffProgHandle); - - /* Get the next byte from the input stream */ - - opcode = inch; - inch = poffGetProgByte(poffHandle); - - /* Check for a 32-bit argument */ - - if (opcode & o32 != 0) - { - /* Buffer the remaining 24-bits of the argument */ - - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - putbuf(inch, poffProgHandle); - inch = poffGetProgByte(poffHandle); - } - } - } -} - -/********************************************************************** - * Global Functions - **********************************************************************/ - -void stringStackOptimize(poffHandle_t poffHandle, - poffProgHandle_t poffProgHandle) -{ - int i; - - /* Allocate an array of buffers to hold pcode data */ - - for (i = 0; i < NPBUFFERS; i++) - { - pbuffer[i] = (ubyte*)malloc(PBUFFER_SIZE); - if (pbuffer[i] == NULL) - { - printf("Failed to allocate pcode buffer\n"); - exit(1); - } - nbytes_in_pbuffer[i] = 0; - } - - /* Prime the search logic */ - - inch = poffGetProgByte(poffHandle); - current_level = -1; - - /* And parse the input file to the output file, removing unnecessary string - * stack operations. - */ - - dopush(poffHandle, poffProgHandle); - - /* Release the buffers */ - - for (i = 0; i < NPBUFFERS; i++) - { - free(pbuffer[i]); - pbuffer[i] = NULL; - nbytes_in_pbuffer[i] = 0; - } -} - -/**********************************************************************/ |