Changeset 1955


Ignore:
Timestamp:
Mar 7, 2012, 6:04:18 PM (7 years ago)
Author:
shermer
Message:

started work on a facility for compile-time evaluation of instructions (presumably for constant folding).

Location:
proto/pebble/trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • proto/pebble/trunk/.settings/org.eclipse.core.resources.prefs

    r1287 r1955  
    1 #Fri Aug 05 15:46:40 PDT 2011
     1#Sun Aug 14 01:01:56 PDT 2011
    22eclipse.preferences.version=1
    33encoding//inputs/parabix2.py=utf-8
    44encoding//inputs/parabix2_pablo.py=utf-8
    55encoding//inputs/xmlwf2.pbl=utf-8
     6encoding//src/main/Main.java=UTF-8
  • proto/pebble/trunk/src/incode/Instruction.java

    r1284 r1955  
    205205                operand[2] = temp;
    206206        }
     207
     208        ///////////////////////////////////////////////////////////////////////////
     209        // compile-time expression evaluation for assignment instructions
     210        ///////////////////////////////////////////////////////////////////////////
     211        public class EvaluateResult {
     212                boolean wasEvaluated=true;
     213                int value;
     214        }
     215        public EvaluateResult evaluate() {
     216                EvaluateResult result = new EvaluateResult();
     217                if(getOperation().isAssignment()) {
     218                        int operands[] = new int[3];
     219                        int operandi=0;
     220                        for(int oprIndex: useOprIndices()) {
     221                                if(!isConstant(operand[oprIndex])) {
     222                                        result.wasEvaluated = false;
     223                                        return result;
     224                                }
     225                                else {
     226                                        operands[operandi++] = Integer.parseInt(operand[oprIndex]);
     227                                }
     228                        }
     229                        result.value = getOperation().simulate(operands);
     230                        return result;
     231                       
     232                }
     233                result.wasEvaluated = false;
     234                return result;
     235        }
     236        private boolean isConstant(String string) {     //TODO: finish this
     237                if(string == null || string.length() == 0)
     238                        return false;
     239               
     240                if(string.startsWith("smallConstant(")) {
     241                       
     242                }
     243               
     244                for(char c: string.toCharArray()) {
     245                        if(!(Character.isDigit(c) || c==' ' || c=='-'))
     246                                return false;
     247                }
     248                return true;
     249        }
    207250       
    208251       
  • proto/pebble/trunk/src/incode/Op.java

    r1307 r1955  
    252252                }
    253253        }
     254
     255        public int simulate(int... oprs) {
     256                switch(this) {
     257                case AND:      return oprs[0] & oprs[1];
     258                case OR:       return oprs[0] | oprs[1];
     259                case XOR:      return oprs[0] ^ oprs[1];
     260                case NOT:          return ~oprs[0];
     261                case COPY:         return oprs[0];
     262                case SEL:          return (oprs[0] & oprs[1]) | (~oprs[0] & oprs[2]);
     263                case ANDNOT:   return oprs[0] &~ oprs[1];
     264                case SHIFT:    return oprs[0]<<oprs[1];
     265                case SCAN:     return oprs[0]+oprs[1];
     266                case SHIFTSCAN:
     267                                           return oprs[0]+oprs[0]+oprs[1];
     268                case SPAN:     return oprs[1]-oprs[0];
     269                case NOP:          return 0;
     270                case COMMENT:  return 0;
     271                case INVALID:  return 0;
     272                case INSTANTIATE:
     273                                           return 0;
     274                case PARAM:        return 0;
     275                case TEST:     return 0;
     276                case WHILE:    return 0;
     277                case JUMP:     return 0;
     278                case ITER:         return 0;
     279                case JOIN:         return 0;
     280                case ERROR:    return 0;
     281                default: return 0;
     282                }
     283        }
    254284}
Note: See TracChangeset for help on using the changeset viewer.