From 2fae4a59a96662e8738a9a46d3d5a393d3baef12 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Tue, 7 Jun 2005 07:44:34 +0000 Subject: [PATCH] various PowerPC generator fixes --- factor/jedit/FactorPlugin.java | 10 ++-- library/collections/lists.factor | 2 +- library/compiler/generator.factor | 4 ++ library/compiler/intrinsics.factor | 25 +++++++--- library/compiler/ppc/assembler.factor | 6 +-- library/compiler/ppc/fixnum.factor | 69 +++++++++++++++++++-------- library/compiler/ppc/generator.factor | 13 ++--- library/compiler/x86/fixnum.factor | 2 +- library/compiler/xt.factor | 8 +++- 9 files changed, 96 insertions(+), 43 deletions(-) diff --git a/factor/jedit/FactorPlugin.java b/factor/jedit/FactorPlugin.java index 80ff5bf16d..002bcd69f4 100644 --- a/factor/jedit/FactorPlugin.java +++ b/factor/jedit/FactorPlugin.java @@ -114,11 +114,13 @@ public class FactorPlugin extends EditPlugin "factor.external.args") .split(" "); addNonEmpty(extraArgs,args); + String[] argsArray = (String[])args.toArray( + new String[args.size()]); + for(int i = 0; i < argsArray.length; i++) + System.out.println(argsArray[i]); + process = Runtime.getRuntime().exec( - (String[])args.toArray( - new String[args.size()]), - null, - new File(MiscUtilities + argsArray, null, new File(MiscUtilities .getParentOfPath(imagePath))); process.getOutputStream().close(); diff --git a/library/collections/lists.factor b/library/collections/lists.factor index eb1da32e09..319748d36e 100644 --- a/library/collections/lists.factor +++ b/library/collections/lists.factor @@ -126,7 +126,7 @@ M: general-list tail ( n list -- tail ) swap [ cdr ] times ; M: general-list nth ( n list -- element ) - over 0 = [ nip car ] [ >r 1 - r> cdr nth ] ifte ; + over 0 number= [ nip car ] [ >r 1 - r> cdr nth ] ifte ; : intersection ( list list -- list ) #! Make a list of elements that occur in both lists. diff --git a/library/compiler/generator.factor b/library/compiler/generator.factor index b23bea0e75..2ad15605a9 100644 --- a/library/compiler/generator.factor +++ b/library/compiler/generator.factor @@ -65,3 +65,7 @@ GENERIC: v>operand ! These constants must match native/card.h : card-bits 7 ; : card-mark HEX: 80 ; + +: shift-add ( by -- n ) + #! Used in fixnum-shift overflow check. + 1 swap cell 8 * swap 1 - - shift ; diff --git a/library/compiler/intrinsics.factor b/library/compiler/intrinsics.factor index 9e61e42fe5..dd3250f512 100644 --- a/library/compiler/intrinsics.factor +++ b/library/compiler/intrinsics.factor @@ -5,6 +5,11 @@ USING: assembler compiler-backend generic hashtables inference kernel kernel-internals lists math math-internals namespaces sequences words ; +! Architecture description +: fixnum-imm? + #! Can fixnum operations take immediate operands? + cpu "x86" = ; + \ dup [ drop in-1 @@ -138,16 +143,22 @@ sequences words ; : literal-fixnum? ( value -- ? ) dup literal? [ literal-value fixnum? ] [ drop f ] ifte ; +: binary-op-imm ( node imm op out -- ) + >r >r 1 %dec-d , + in-1 + 0 dup r> execute , + r> 0 %replace-d , ; + : binary-op ( node op out -- ) #! out is a vreg where the vop stores the result. - >r >r node-peek dup literal-fixnum? [ - 1 %dec-d , - in-1 - literal-value 0 0 r> execute , - r> 0 %replace-d , + fixnum-imm? [ + >r >r node-peek dup literal-fixnum? [ + literal-value r> r> binary-op-imm + ] [ + drop r> r> binary-op-reg + ] ifte ] [ - drop - r> r> binary-op-reg + binary-op-reg drop ] ifte ; [ diff --git a/library/compiler/ppc/assembler.factor b/library/compiler/ppc/assembler.factor index 9a3a9311f7..52cd095467 100644 --- a/library/compiler/ppc/assembler.factor +++ b/library/compiler/ppc/assembler.factor @@ -38,7 +38,7 @@ USING: compiler errors kernel math memory words ; : xfx-form ( d spr xo -- n ) 1 shift >r 11 shift >r 21 shift r> bitor r> bitor ; -: xo-form ( d a b oe xo rc -- n ) +: xo-form ( d a b oe rc xo -- n ) swap >r 1 shift >r 10 shift >r 11 shift >r 16 shift >r 21 shift r> bitor r> bitor r> bitor r> bitor r> bitor ; @@ -129,8 +129,8 @@ USING: compiler errors kernel math memory words ; : (MULLW) 235 xo-form 31 insn ; : MULLW 0 0 (MULLW) ; : MULLW. 0 1 (MULLW) ; -: MULLWC 1 0 (MULLW) ; -: MULLWC. 1 1 (MULLW) ; +: MULLWO 1 0 (MULLW) ; +: MULLWO. 1 1 (MULLW) ; : (SLW) 24 x-form 31 insn ; : SLW 0 (SLW) ; diff --git a/library/compiler/ppc/fixnum.factor b/library/compiler/ppc/fixnum.factor index 42ea912f24..78963aa90f 100644 --- a/library/compiler/ppc/fixnum.factor +++ b/library/compiler/ppc/fixnum.factor @@ -4,28 +4,24 @@ IN: compiler-backend USING: assembler compiler kernel math math-internals memory namespaces words ; -: >3-vop< ( vop -- out1 in2 in1 ) +: >3-imm< ( vop -- out1 in2 in1 ) [ vop-out-1 v>operand ] keep [ vop-in-2 v>operand ] keep vop-in-1 ; -: maybe-immediate ( vop imm comp -- ) - pick vop-in-1 integer? [ - >r >r >3-vop< v>operand r> execute r> drop - ] [ - >r >r >3-vop< v>operand swap r> drop r> execute - ] ifte ; inline +: >3-vop< ( vop -- out1 in1 in2 ) + >3-imm< v>operand swap ; : simple-overflow ( vop inv word -- ) >r >r