diff options
Diffstat (limited to 'src/interp')
-rw-r--r-- | src/interp/define.boot | 2 | ||||
-rw-r--r-- | src/interp/g-opt.boot | 33 | ||||
-rw-r--r-- | src/interp/g-timer.boot | 4 | ||||
-rw-r--r-- | src/interp/g-util.boot | 9 | ||||
-rw-r--r-- | src/interp/nruncomp.boot | 2 |
5 files changed, 42 insertions, 8 deletions
diff --git a/src/interp/define.boot b/src/interp/define.boot index dbd8bfc7..c2f08f1d 100644 --- a/src/interp/define.boot +++ b/src/interp/define.boot @@ -1414,7 +1414,7 @@ compSubDomain1(domainForm,predicate,m,e) == compCompilerPredicate(predicate,e) or stackSemanticError(["predicate: ",predicate, " cannot be interpreted with #1: ",domainForm],nil) - pred := lispize u.expr + pred := simplifyVMForm u.expr -- For now, reject predicates that directly reference domains CONTAINED("$",pred) => stackAndThrow('"predicate %1pb is not simple enough",[predicate]) diff --git a/src/interp/g-opt.boot b/src/interp/g-opt.boot index b29d9034..1c8964f6 100644 --- a/src/interp/g-opt.boot +++ b/src/interp/g-opt.boot @@ -694,6 +694,12 @@ optOr(x is ['%or,a,b]) == a = '%true => '%true x +optIeq(x is ['%ieq,a,b]) == + integer? a and integer? b => + a = b => '%true + '%false + x + optIlt(x is ['%ilt,a,b]) == integer? a and integer? b => a < b => '%true @@ -709,11 +715,27 @@ optIgt x == optIge x == optNot ['%not,optIlt ['%ilt,second x,third x]] ---% +--% Integer operations -lispize x == simplifyVMForm x - +optIadd(x is ['%iadd,a,b]) == + integer? a and integer? b => a + b + x + +optIsub(x is ['%isub,a,b]) == + integer? a and integer? b => a - b + x + +optImul(x is ['%imul,a,b]) == + integer? a and integer? b => a * b + x + +optIneg(x is ['%ineg,a]) == + integer? a => -a + x + +--% --% optimizer hash table +--% for x in '( (%call optCall) _ (SEQ optSEQ)_ @@ -723,10 +745,15 @@ for x in '( (%call optCall) _ (%not optNot)_ (%and optAnd)_ (%or optOr)_ + (%ieq optIeq)_ (%ilt optIlt)_ (%ile optIle)_ (%igt optIgt)_ (%ige optIge)_ + (%ineg optIneg)_ + (%iadd optIadd)_ + (%isub optIsub)_ + (%imul optImul)_ (LIST optLIST)_ (MINUS optMINUS)_ (QSMINUS optQSMINUS)_ diff --git a/src/interp/g-timer.boot b/src/interp/g-timer.boot index edd7020d..9f1fd02f 100644 --- a/src/interp/g-timer.boot +++ b/src/interp/g-timer.boot @@ -246,9 +246,9 @@ timedAlgebraEvaluation(code) == timedOptimization(code) == startTimingProcess 'optimization $getDomainCode : local := NIL - r := lispize code + r := simplifyVMForm code if $reportOptimization then - sayBrightlyI bright '"Optimized LISP code:" + sayBrightlyI bright '"Optimized intermediate code:" pp r stopTimingProcess 'optimization r diff --git a/src/interp/g-util.boot b/src/interp/g-util.boot index 012a9ccc..669998cd 100644 --- a/src/interp/g-util.boot +++ b/src/interp/g-util.boot @@ -250,6 +250,13 @@ expandIneg ['%ineg,x] == integer? x => -x ['_-,x] +expandIeq ['%ieq,a,b] == + a := expandToVMForm a + integer? a and a = 0 => ['ZEROP,expandToVMForm b] + b := expandToVMForm b + integer? b and b = 0 => ['ZEROP,a] + ['EQL,a,b] + expandIlt ['%ilt,x,y] == integer? x and x = 0 => integer? y => y > 0 @@ -358,7 +365,6 @@ for x in [ ['%ismall?, :'FIXNUMP], -- binary integer operations. ['%iadd,:"+"], - ['%ieq, :"EQL"], ['%igcd,:'GCD], ['%ige, :">="], ['%iinc,:"1+"], @@ -437,6 +443,7 @@ for x in [ ['%bge, :function expandBge], ['%bcompl, :function expandBcompl], + ['%ieq, :function expandIeq], ['%igt, :function expandIgt], ['%ilt, :function expandIlt], ['%ineg, :function expandIneg], diff --git a/src/interp/nruncomp.boot b/src/interp/nruncomp.boot index 4c5c3b11..965c851f 100644 --- a/src/interp/nruncomp.boot +++ b/src/interp/nruncomp.boot @@ -129,7 +129,7 @@ NRTencode(x,y) == encode(x,y,true) where encode(x,compForm,firstTime) == -- enumeration constants are like field names, they do not need -- to be encoded. op = "Enumeration" => x - ["NRTEVAL",NRTreplaceAllLocalReferences COPY_-TREE lispize compForm] + ["NRTEVAL",NRTreplaceAllLocalReferences COPY_-TREE simplifyVMForm compForm] MEMQ(x,$formalArgList) => v := $FormalMapVariableList.(POSN1(x,$formalArgList)) firstTime => ["local",v] |