[openfirmware] [commit] r2108 - cpu/arm
repository service
svn at openfirmware.info
Fri Jan 14 01:10:41 CET 2011
Author: wmb
Date: Fri Jan 14 01:10:40 2011
New Revision: 2108
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/2108
Log:
ARM assembler enhancements and bug fixes, thanks to Mike Tuciarone.
Modified:
cpu/arm/assem.fth
Modified: cpu/arm/assem.fth
==============================================================================
--- cpu/arm/assem.fth Sat Jan 8 11:23:43 2011 (r2107)
+++ cpu/arm/assem.fth Fri Jan 14 01:10:40 2011 (r2108)
@@ -548,16 +548,18 @@
: amode-rdop2 ( -- ) init-operands get-r12 get-opr2 !op ;
: amode-rev ( -- ) init-operands get-r12 get-r00 !op ;
-: amode-lsm ( -- )
+: amode-lsm ( need-r16? -- )
init-operands
- get-r16 ( )
- adr-delim ascii ! = if ( )
- flip-w ( )
- require-field " ," ?expecting drop ( )
- then ( )
+ if
+ get-r16 ( )
+ adr-delim ascii ! = if ( )
+ flip-w ( )
+ require-field " ," ?expecting drop ( )
+ then ( )
- \ There should be a comma on the end of the register.
- adr-delim ascii , <> " ," ?expecting
+ \ There should be a comma on the end of the register.
+ adr-delim ascii , <> " ," ?expecting
+ then
\ The next thing up should be an open brace for the register list.
get-whatever adt-delimiter <> " {" ?expecting
@@ -583,7 +585,6 @@
\ We've finished the register list, is there a ^ hanging on the end?
ascii ^ parse-1 if flip-b then
-
!op
;
@@ -713,6 +714,9 @@
: amode-swp ( -- )
init-operands get-r12 get-r00 ['] get-off0 get-ea !op
;
+: amode-ldrex ( -- )
+ init-operands get-r12 ['] get-off0 get-ea !op
+;
: amode-copr ( -- ) \ Co-processors: mcr, mrc
\ p, #, r, c, c, #
@@ -769,6 +773,9 @@
\ This word looks for [|b] on swp commands.
: {b} ( -- ) ascii b parse-1 if flip-b then ;
+\ This word looks for [|bh] on ld/strex commands.
+: {bh} ( -- ) ascii h parse-1 if flip-b flip-w else {b} then ;
+
\ If the s flag is found, set bit 20 for alu commmands.
: {s} ( -- ) ascii s parse-1 if 0010.0000 iop then ;
@@ -913,6 +920,7 @@
: orr 0180.0000 {cond/s} amode-rrop2 ;
: bic 01c0.0000 {cond/s} amode-rrop2 ;
+: clz 016f.0f10 {cond/s} amode-rdop2 ;
: mov 01a0.0000 {cond/s} amode-rdop2 ;
: mvn 01e0.0000 {cond/s} amode-rdop2 ;
@@ -944,10 +952,14 @@
: bx 012f.ff10 {cond} amode-bx ;
-: swp 0100.0090 {cond} {b} amode-swp ;
-
-: ldm 0810.0000 {cond} 1 parse-inc amode-lsm ;
-: stm 0800.0000 {cond} 0 parse-inc amode-lsm ;
+: swp 0100.0090 {cond} {b} amode-swp ;
+: strex 0180.0f90 {cond} {bh} amode-swp ;
+: ldrex 0190.0f9f {cond} {bh} amode-ldrex ;
+
+: ldm 0810.0000 {cond} 1 parse-inc 1 amode-lsm ;
+: popm 08bd.0000 {cond} 0 amode-lsm ;
+: stm 0800.0000 {cond} 0 parse-inc 1 amode-lsm ;
+: pushm 092d.0000 {cond} 0 amode-lsm ;
: ldr ( -- ) 0410.0000 {cond} {shbt} ;
: str ( -- ) 0400.0000 {cond} {hbt} ;
@@ -959,33 +971,42 @@
: rd-field ( reg# -- ) d# 12 set-field ;
: rb-field ( reg# -- ) d# 16 set-field ;
-\ XXX need ADR, SET
\ adr{cond} rN,<address>
+\ set{cond} rN,<imm>
+: asm-const ( const adr? -- op )
+ ea00.0000 asm, \ b here+8
+ if here asm-set-relocation-bit drop then
+ asm, \ const
+ 051f.000c \ ldr rN,[pc,#-12]
+;
: (set) ( address? -- )
>r
0000.0000 {cond} init-operands
\ Put the register number on the return stack so it won't interfere
\ with the stack items used by any "*" operands there may be.
get-register >r ( r: adr? reg# )
- get-immediate ( address r: adr? reg# )
- dup here >offset ( address offset r: adr? reg# )
- dup fits? if ( address offset r: adr? reg# )
- nip nip 028f.0000 ( op r: adr? reg# ) \ add rN,pc,#<offset>
- else ( address offset r: adr? reg# )
- negate fits? if ( address r: adr? reg# )
- drop 024f.0000 ( op r: adr? reg# ) \ sub rN,pc,#<offset>
- else ( address r: adr? reg# )
- ea00.0000 asm, ( address r: adr? reg# ) \ b here+8
- r> r@ swap >r if ( address r: adr? reg# )
- here asm-set-relocation-bit drop
+ get-immediate r> r> rot ( reg# adr? addr|imm )
+ 2dup swap if ( reg# adr? addr|imm addr|imm )
+ here >offset ( reg# adr? addr|imm offset|imm )
+ then
+ dup fits? if ( reg# adr? addr|imm offset|imm )
+ 2drop if
+ 028f.0000 ( reg# op ) \ add rN,pc,#<offset>
+ else
+ 03a0.0000 ( reg# op ) \ mov rN,#<imm>
+ then
+ else ( reg# adr? addr|imm offset|imm )
+ rot if ( reg# addr offset )
+ negate fits? if ( reg# addr )
+ drop 024f.0000 ( reg# op ) \ sub rN,pc,#<offset>
+ else ( reg# addr )
+ true asm-const ( reg# op )
then
- asm, ( r: adr? reg# ) \ adr
- 051f.000c ( op r: adr? reg# ) \ ldr rN,[pc,#-12]
- then ( op r: adr? reg# )
- then ( op r: adr? reg# )
- iop r> rd-field ( )
- r> drop
- !op
+ else ( reg# imm imm )
+ drop false asm-const ( reg# op )
+ then ( reg# op )
+ then ( reg# op )
+ iop rd-field !op
;
: adr ( -- ) true (set) ;
: set ( -- ) false (set) ;
@@ -1000,6 +1021,9 @@
: sev ( -- ) h# 0320f004 {cond} !op ;
: nop ( -- ) h# e1a00000 asm, ; \ mov r0,r0
+: dsb ( -- ) h# f57ff040 asm, ;
+: dmb ( -- ) h# f57ff050 asm, ;
+: isb ( -- ) h# f57ff060 asm, ;
: # ( -- adt-immed ) adt-immed ;
: reg ( -- adt-reg ) adt-reg ;
More information about the openfirmware
mailing list