factor/library/compiler/ppc/assembler.factor

75 lines
2.0 KiB
Factor

! Copyright (C) 2005 Slava Pestov.
! See http://factor.sf.net/license.txt for BSD license.
IN: assembler
USING: errors kernel math memory words ;
! See the Motorola or IBM documentation for details. The opcode
! names are standard, and the operand order is the same as in
! the docs, except a few differences, namely, in IBM/Motorola
! assembler syntax, loads and stores are written like:
!
! stw r14,10(r15)
!
! In Factor, we write:
!
! 14 15 10 STW
: insn ( operand opcode -- ) 26 shift bitor compile-cell ;
: b-form ( bo bi bd aa lk -- n )
>r 1 shift >r 2 shift >r 16 shift >r 21 shift
r> bitor r> bitor r> bitor r> bitor ;
: d-form ( d a simm -- n )
HEX: ffff bitand >r 16 shift >r 21 shift r> bitor r> bitor ;
: i-form ( li aa lk -- n )
>r 1 shift bitor r> bitor ;
: x-form ( s a b xo rc -- n )
>r 1 shift >r 11 shift >r 16 shift >r 21 shift
r> bitor r> bitor r> bitor r> bitor ;
: 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 )
>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 ;
: ADDI d-form 14 insn ;
: LI 0 rot ADDI ;
: ADDIS d-form 15 insn ;
: LIS 0 rot ADDIS ;
: ADD 0 266 0 xo-form 31 insn ;
: SUBI neg ADDI ;
: ORI d-form 24 insn ;
: SRAWI 824 0 x-form 31 insn ;
: BL 0 1 i-form 18 insn ;
: B 0 0 i-form 18 insn ;
: BC 0 0 b-form 16 insn ;
: BEQ 12 2 rot BC ;
: BNE 4 2 rot BC ;
: BCLR 0 8 0 0 b-form 19 insn ;
: BLR 20 BCLR ;
: BCLRL 0 8 0 1 b-form 19 insn ;
: BLRL 20 BCLRL ;
: BCCTR 0 264 0 0 b-form 19 insn ;
: BCTR 20 BCCTR ;
: MFSPR 5 shift 339 xfx-form 31 insn ;
: MFLR 8 MFSPR ;
: MFCTR 9 MFSPR ;
: MTSPR 5 shift 467 xfx-form 31 insn ;
: MTLR 8 MTSPR ;
: MTCTR 9 MTSPR ;
: LWZ d-form 32 insn ;
: STW d-form 36 insn ;
: STWU d-form 37 insn ;
: CMPI d-form 11 insn ;
: LOAD32 >r w>h/h r> tuck LIS dup rot ORI ;
: LOAD ( n r -- )
#! PowerPC cannot load a 32 bit literal in one instruction.
>r dup dup HEX: ffff bitand = [ r> LI ] [ r> LOAD32 ] ifte ;