|
|
1.1 ! root 1: #! /bin/sh ! 2: ! 3: # $Id: sparc-misc-auto.sh,v 1.2 2007/02/12 23:49:21 fredette Exp $ ! 4: ! 5: # ic/sparc/sparc-misc-auto.sh - automatically generates C code ! 6: # for miscellaneous SPARC emulation support: ! 7: ! 8: # ! 9: # Copyright (c) 2005 Matt Fredette ! 10: # All rights reserved. ! 11: # ! 12: # Redistribution and use in source and binary forms, with or without ! 13: # modification, are permitted provided that the following conditions ! 14: # are met: ! 15: # 1. Redistributions of source code must retain the above copyright ! 16: # notice, this list of conditions and the following disclaimer. ! 17: # 2. Redistributions in binary form must reproduce the above copyright ! 18: # notice, this list of conditions and the following disclaimer in the ! 19: # documentation and/or other materials provided with the distribution. ! 20: # 3. All advertising materials mentioning features or use of this software ! 21: # must display the following acknowledgement: ! 22: # This product includes software developed by Matt Fredette. ! 23: # 4. The name of the author may not be used to endorse or promote products ! 24: # derived from this software without specific prior written permission. ! 25: # ! 26: # THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR ! 27: # IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED ! 28: # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ! 29: # DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, ! 30: # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES ! 31: # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ! 32: # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) ! 33: # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, ! 34: # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ! 35: # ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE ! 36: # POSSIBILITY OF SUCH DAMAGE. ! 37: # ! 38: ! 39: header=false ! 40: ! 41: for option ! 42: do ! 43: case $option in ! 44: --header) header=true ;; ! 45: esac ! 46: done ! 47: ! 48: PROG=`basename $0` ! 49: cat <<EOF ! 50: /* automatically generated by $PROG, do not edit! */ ! 51: EOF ! 52: ! 53: # emit the register mapping macros: ! 54: if $header; then ! 55: ! 56: echo "" ! 57: echo "/* the register mapping: */" ! 58: echo "#define TME_SPARC_IREG_UNDEF (-1)" ! 59: ireg_next=0 ! 60: ! 61: # all integer registers start from register number zero: ! 62: # ! 63: for regnum in 0 1 2 3 4 5 6 7; do ! 64: echo "#define TME_SPARC_IREG_G${regnum} (${ireg_next})" ! 65: ireg_next=`expr ${ireg_next} + 1` ! 66: done ! 67: ! 68: # all other registers start after the last register in the last ! 69: # possible register window, plus the eight sparc64 alternate ! 70: # globals: ! 71: # ! 72: ireg_base='((TME_SPARC_WINDOWS_MAX * 16) + 8)' ! 73: ! 74: # the current, next, and next-next program counter: ! 75: # ! 76: echo "#define TME_SPARC_IREG_PC (${ireg_base} + ${ireg_next})" ! 77: ireg_next=`expr ${ireg_next} + 1` ! 78: echo "#define TME_SPARC_IREG_PC_NEXT (${ireg_base} + ${ireg_next})" ! 79: ireg_next=`expr ${ireg_next} + 1` ! 80: echo "#define TME_SPARC_IREG_PC_NEXT_NEXT (${ireg_base} + ${ireg_next})" ! 81: ireg_next=`expr ${ireg_next} + 1` ! 82: ! 83: # the immediate register: ! 84: # ! 85: echo "#define TME_SPARC_IREG_IMM (${ireg_base} + ${ireg_next})" ! 86: ireg_next=`expr ${ireg_next} + 3` ! 87: ! 88: # the Y multiply/divide register: ! 89: # ! 90: echo "#define TME_SPARC_IREG_Y (${ireg_base} + ${ireg_next})" ! 91: ireg_next=`expr ${ireg_next} + 1` ! 92: ! 93: # the floating-point transfer registers. since these are often ! 94: # treated as 32-bit parts used to transfer 64- and 128-bit values, ! 95: # this block of registers must be aligned to four. NB that we ! 96: # assume that ${ireg_base} is aligned to at least four: ! 97: # ! 98: while test `expr ${ireg_next} % 4` != 0; do ireg_next=`expr ${ireg_next} + 1`; done ! 99: echo "#define TME_SPARC_IREG_FPX (${ireg_base} + ${ireg_next})" ! 100: ireg_next=`expr ${ireg_next} + 4` ! 101: ! 102: # the sparc32 PSR and WIM: ! 103: # ! 104: echo "#define tme_sparc32_ireg_psr tme_sparc_ireg_uint32(${ireg_base} + ${ireg_next})" ! 105: ireg_next=`expr ${ireg_next} + 1` ! 106: echo "#define tme_sparc32_ireg_wim tme_sparc_ireg_uint32(${ireg_base} + ${ireg_next})" ! 107: ireg_next=`expr ${ireg_next} + 1` ! 108: ! 109: # the sparc32 TBR register, and the sparc64 TBA register: ! 110: # ! 111: echo "#define tme_sparc32_ireg_tbr tme_sparc_ireg_uint32(${ireg_base} + ${ireg_next})" ! 112: echo "#define tme_sparc64_ireg_tba tme_sparc_ireg_uint64(${ireg_base} + ${ireg_next})" ! 113: ireg_next=`expr ${ireg_next} + 1` ! 114: ! 115: # the sparc64 PSTATE register: ! 116: # ! 117: echo "#define tme_sparc64_ireg_pstate tme_sparc_ireg_uint32((${ireg_base} + ${ireg_next}) << 1)" ! 118: ireg_next=`expr ${ireg_next} + 1` ! 119: ! 120: # the sparc64 CCR and ASI registers: ! 121: # ! 122: echo "#define tme_sparc64_ireg_ccr tme_sparc_ireg_uint8(((${ireg_base} + ${ireg_next}) << 3) + 0)" ! 123: echo "#define tme_sparc64_ireg_asi tme_sparc_ireg_uint8(((${ireg_base} + ${ireg_next}) << 3) + 1)" ! 124: ireg_next=`expr ${ireg_next} + 1` ! 125: fi ! 126: ! 127: # emit the integer condition codes->conditions mapping. note that the ! 128: # nesting of the flag variables is deliberate, to make this array ! 129: # indexable with the condition codes value: ! 130: # ! 131: if $header; then :; else ! 132: echo "" ! 133: echo "/* the icc->conditions mapping: */" ! 134: echo "const tme_uint8_t _tme_sparc_conds_icc[16] = {" ! 135: for nflag in 0 1; do ! 136: for zflag in 0 1; do ! 137: for vflag in 0 1; do ! 138: for cflag in 0 1; do ! 139: ! 140: # the Never condition: ! 141: # ! 142: echo -n " 0" ! 143: ! 144: # the Equal condition: ! 145: # ! 146: if test $zflag = 1; then ! 147: echo -n " | TME_BIT(1)" ! 148: fi ! 149: ! 150: # the Less or Equal condition: ! 151: # ! 152: if test $zflag = 1 || test $nflag != $vflag; then ! 153: echo -n " | TME_BIT(2)" ! 154: fi ! 155: ! 156: # the Less condition: ! 157: # ! 158: if test $nflag != $vflag; then ! 159: echo -n " | TME_BIT(3)" ! 160: fi ! 161: ! 162: # the Less or Equal Unsigned condition: ! 163: # ! 164: if test $cflag = 1 || test $zflag = 1; then ! 165: echo -n " | TME_BIT(4)" ! 166: fi ! 167: ! 168: # the Carry Set condition: ! 169: # ! 170: if test $cflag = 1; then ! 171: echo -n " | TME_BIT(5)" ! 172: fi ! 173: ! 174: # the Negative condition: ! 175: # ! 176: if test $nflag = 1; then ! 177: echo -n " | TME_BIT(6)" ! 178: fi ! 179: ! 180: # the Overflow Set condition: ! 181: # ! 182: if test $vflag = 1; then ! 183: echo -n " | TME_BIT(7)" ! 184: fi ! 185: ! 186: echo "," ! 187: done ! 188: done ! 189: done ! 190: done ! 191: echo "};" ! 192: fi ! 193: ! 194: # done: ! 195: # ! 196: exit 0
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.