various PowerPC generator fixes

cvs
Slava Pestov 2005-06-07 07:44:34 +00:00
parent 200540e266
commit 2fae4a59a9
9 changed files with 96 additions and 43 deletions

View File

@ -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();

View File

@ -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.

View File

@ -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 ;

View File

@ -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 <vreg> 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 <vreg> 0 <vreg> 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 ;
[

View File

@ -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) ;

View File

@ -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
<label> "end" set
"end" get BNO
dup >3-vop< v>operand 3dup swapd r> execute
dup >3-vop< 3dup r> execute
2dup
dup tag-bits SRAWI
dup tag-bits SRAWI
drop
3 -rot r> execute
drop
"s48_long_to_bignum" f compile-c-call
! An untagged pointer to the bignum is now in r3; tag it
3 swap vop-out-1 v>operand bignum-tag ORI
@ -33,20 +29,33 @@ namespaces words ;
M: %fixnum+ generate-node ( vop -- )
0 MTXER
dup \ ADDI \ ADDO. maybe-immediate
dup >3-vop< ADDO.
\ SUBF \ ADD simple-overflow ;
M: %fixnum- generate-node ( vop -- )
0 MTXER
dup \ SUBI \ SUBFO. maybe-immediate
dup >3-vop< SUBFO.
\ ADD \ SUBF simple-overflow ;
M: %fixnum* generate-node ( vop -- )
dup \ MULLI \ MULLW maybe-immediate
vop-out-1 v>operand dup tag-bits SRAWI ;
dup >3-vop< dup dup tag-bits SRAWI
0 MTXER
[ >r >r drop 4 r> r> MULLWO. 3 ] 2keep
<label> "end" set
"end" get BNO
MULHW
"s48_long_long_to_bignum" f compile-c-call
! now we have to shift it by three bits to remove the second
! tag
tag-bits neg 4 LI
"s48_bignum_arithmetic_shift" f compile-c-call
! An untagged pointer to the bignum is now in r3; tag it
3 4 bignum-tag ORI
"end" get save-xt
vop-out-1 v>operand 4 MR ;
M: %fixnum/i generate-node ( vop -- )
dup >3-vop< v>operand DIVW
dup >3-vop< swap DIVW
vop-out-1 v>operand dup tag-fixnum ;
: generate-fixnum/mod ( -- )
@ -69,23 +78,43 @@ M: %fixnum/mod generate-node ( vop -- )
17 17 tag-fixnum ;
M: %fixnum-bitand generate-node ( vop -- )
\ ANDI \ AND maybe-immediate ;
>3-vop< AND ;
M: %fixnum-bitor generate-node ( vop -- )
\ ORI \ OR maybe-immediate ;
>3-vop< OR ;
M: %fixnum-bitxor generate-node ( vop -- )
\ XORI \ XOR maybe-immediate ;
>3-vop< XOR ;
M: %fixnum-bitnot generate-node ( vop -- )
dest/src dupd NOT dup untag ;
M: %fixnum<< generate-node ( vop -- )
dup vop-in-1 20 LI
dup vop-out-1 v>operand swap vop-in-2 v>operand 20 SLW ;
! This has specific register requirements.
<label> "no-overflow" set
<label> "end" set
vop-in-1
! check for potential overflow
dup shift-add dup 19 LOAD
18 17 19 ADD
0 18 rot 2 * 1 - CMPLI
! is there going to be an overflow?
"no-overflow" get BGE
! there is going to be an overflow, make a bignum
3 17 tag-bits SRAWI
"s48_long_to_bignum" f compile-c-call
dup 4 LI
"s48_bignum_arithmetic_shift" f compile-c-call
! tag the result
3 17 bignum-tag ORI
"end" get B
! there is not going to be an overflow
"no-overflow" get save-xt
17 17 rot SLWI
"end" get save-xt ;
M: %fixnum>> generate-node ( vop -- )
>3-vop< >r dupd r> SRAWI dup untag ;
>3-imm< pick >r SRAWI r> dup untag ;
M: %fixnum-sgn generate-node ( vop -- )
dest/src dupd 31 SRAWI dup untag ;

View File

@ -129,15 +129,16 @@ M: %arithmetic-type generate-node ( vop -- )
0 <vreg> check-dest
<label> "end" set
! Load top two stack values
17 14 -4 LWZ
18 14 0 LWZ
3 14 -4 LWZ
4 14 0 LWZ
! Compute their tags
17 17 tag-mask ANDI
18 18 tag-mask ANDI
3 3 tag-mask ANDI
4 4 tag-mask ANDI
! Are the tags equal?
0 17 18 CMPL
0 3 3 CMPL
"end" get BEQ
! No, they are not equal. Call a runtime function to
! coerce the integers to a higher type.
"arithmetic_type" f compile-c-call
"end" get save-xt ;
"end" get save-xt
17 3 MR ;

View File

@ -124,7 +124,7 @@ M: %fixnum<< generate-node
ECX EAX MOV
vop-in-1
! check for potential overflow
1 over cell 8 * swap 1 - - shift ECX over ADD
dup shift-add ECX over ADD
2 * 1 - ECX swap CMP
! is there going to be an overflow?
"no-overflow" get JBE

View File

@ -134,7 +134,13 @@ M: absolute-16/16 fixup ( absolute -- ) >absolute fixup-16/16 ;
deferred-xts get [ fixup ] each deferred-xts off ;
: with-compiler ( quot -- )
[ call fixup-xts commit-xts ] with-scope ;
[
deferred-xts off
compiled-xts off
call
fixup-xts
commit-xts
] with-scope ;
: postpone-word ( word -- )
dup compiling? [