From 1abf62487d71a2eea968922f3715bc97efc6a832 Mon Sep 17 00:00:00 2001 From: Slava Pestov Date: Wed, 1 Jun 2005 18:06:25 +0000 Subject: [PATCH] working on conditional fixnum vops for powerpc --- library/bootstrap/boot-stage2.factor | 1 + library/compiler/ppc/assembler.factor | 30 +++++++++-- library/compiler/ppc/fixnum.factor | 69 +++++++++++++++++++++++++ library/compiler/ppc/generator.factor | 4 +- library/compiler/ppc/stack.factor | 6 ++- library/test/compiler/intrinsics.factor | 50 +++++++++--------- native/cards.h | 13 +++-- 7 files changed, 135 insertions(+), 38 deletions(-) create mode 100644 library/compiler/ppc/fixnum.factor diff --git a/library/bootstrap/boot-stage2.factor b/library/bootstrap/boot-stage2.factor index 5220c94100..88fff4f63d 100644 --- a/library/bootstrap/boot-stage2.factor +++ b/library/bootstrap/boot-stage2.factor @@ -69,6 +69,7 @@ cpu "ppc" = [ "/library/compiler/ppc/generator.factor" "/library/compiler/ppc/slots.factor" "/library/compiler/ppc/stack.factor" + "/library/compiler/ppc/fixnum.factor" "/library/compiler/ppc/alien.factor" ] pull-in diff --git a/library/compiler/ppc/assembler.factor b/library/compiler/ppc/assembler.factor index cebc93e086..0a43f981ae 100644 --- a/library/compiler/ppc/assembler.factor +++ b/library/compiler/ppc/assembler.factor @@ -30,8 +30,8 @@ USING: compiler errors kernel math memory words ; >r 1 shift >r 6 shift >r 11 shift >r 16 shift >r 21 shift r> bitor r> bitor r> bitor r> bitor r> bitor ; -: x-form ( s a b xo rc -- n ) - >r 1 shift >r 11 shift >r 16 shift >r 21 shift +: x-form ( a s b xo rc -- n ) + >r 1 shift >r 11 shift >r swap 16 shift >r 21 shift r> bitor r> bitor r> bitor r> bitor ; : xfx-form ( d spr xo -- n ) @@ -69,7 +69,7 @@ USING: compiler errors kernel math memory words ; : ANDI d-form 28 insn ; : ANDIS d-form 29 insn ; -: (AND) 31 swap x-form 31 insn ; +: (AND) 28 swap x-form 31 insn ; : AND 0 (AND) ; : AND. 0 (AND) ; @@ -97,6 +97,9 @@ USING: compiler errors kernel math memory words ; : NOR 0 (NOR) ; : NOR. 1 (NOR) ; +: NOT over NOR ; +: NOT. over NOR. ; + : ORI d-form 24 insn ; : ORIS d-form 25 insn ; @@ -125,6 +128,24 @@ USING: compiler errors kernel math memory words ; : SRAWI 824 0 x-form 31 insn ; +: (SUBF) 40 swap xo-form 31 insn ; +: SUBF 0 0 (SUBF) ; +: SUBF. 0 1 (SUBF) ; +: SUBFO 1 0 (SUBF) ; +: SUBFO. 1 1 (SUBF) ; + +: (SUBFC) 8 swap xo-form 31 insn ; +: SUBFC 0 0 (SUBFC) ; +: SUBFC. 0 1 (SUBFC) ; +: SUBFCO 1 0 (SUBFC) ; +: SUBFCO. 1 1 (SUBFC) ; + +: (SUBFE) 136 swap xo-form 31 insn ; +: SUBFE 0 0 (SUBFE) ; +: SUBFE. 0 1 (SUBFE) ; +: SUBFEO 1 0 (SUBFE) ; +: SUBFEO. 1 1 (SUBFE) ; + : XORI d-form 26 insn ; : XORIS d-form 27 insn ; @@ -161,7 +182,10 @@ GENERIC: BC M: integer BC 0 0 b-form 16 insn ; M: word BC >r 0 BC r> relative-14 ; +: BLT 12 0 rot BC ; : BGE 4 0 rot BC ; +: BGT 12 1 rot BC ; : BLE 4 1 rot BC ; : BEQ 12 2 rot BC ; : BNE 4 2 rot BC ; +: BO 12 3 rot BC ; : BNO 4 3 rot BC ; : BCLR 0 8 0 0 b-form 19 insn ; : BLR 20 BCLR ; diff --git a/library/compiler/ppc/fixnum.factor b/library/compiler/ppc/fixnum.factor new file mode 100644 index 0000000000..d3729e28f0 --- /dev/null +++ b/library/compiler/ppc/fixnum.factor @@ -0,0 +1,69 @@ +! Copyright (C) 2005 Slava Pestov. +! See http://factor.sf.net/license.txt for BSD license. +IN: compiler-backend +USING: assembler compiler kernel math memory namespaces words ; + +: maybe-immediate ( vop imm comp -- ) + pick vop-in-1 integer? [ + >r >r dest/src dupd r> execute r> drop + ] [ + >r >r dest/src over r> drop r> execute + ] ifte ; inline + +M: %fixnum+ generate-node ( vop -- ) + \ ADDI \ ADD maybe-immediate ; + +M: %fixnum- generate-node ( vop -- ) + \ SUBI \ SUBF maybe-immediate ; + +M: %fixnum-bitand generate-node ( vop -- ) + \ ANDI \ AND maybe-immediate ; + +M: %fixnum-bitor generate-node ( vop -- ) + \ ORI \ OR maybe-immediate ; + +M: %fixnum-bitxor generate-node ( vop -- ) + \ XORI \ XOR maybe-immediate ; + +M: %fixnum-bitnot generate-node ( vop -- ) + dup vop-in-1 swap vop-out-1 NOT ; + +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 ; + +M: %fixnum>> generate-node ( vop -- ) + dup vop-out-1 v>operand over vop-in-2 v>operand + rot vop-in-1 >r 2dup r> SRAWI untag ; + +: load-boolean ( dest cond -- ) + #! Compile this after a conditional jump to store f or t + #! in dest depending on the jump being taken or not. +