Fix ARM backend problem with large words

release
Slava Pestov 2007-10-25 18:09:54 -04:00
parent c1295a9737
commit 55ecc4b2bc
1 changed files with 16 additions and 12 deletions

View File

@ -34,8 +34,22 @@ GENERIC: loc>operand ( loc -- reg addressing )
M: ds-loc loc>operand ds-loc-n cells neg ds-reg swap <+/-> ;
M: rs-loc loc>operand rs-loc-n cells neg rs-reg swap <+/-> ;
: load-cell ( reg -- )
[
"end" define-label
! Load target address
PC 0 <+> LDR
! Skip an instruction
"end" get B
! The target address
0 ,
! Continue here
"end" resolve-label
] with-scope ;
M: arm-backend load-indirect ( obj reg -- )
PC 0 <+> LDR rc-indirect-arm-pc rel-literal ;
tuck load-cell rc-absolute-cell rel-literal
dup 0 <+> LDR ;
M: immediate load-literal
over v>operand small-enough? [
@ -67,17 +81,7 @@ M: arm-backend %epilogue ( n -- )
SP SP rot ADD ;
: compile-dlsym ( symbol dll reg -- )
[
"end" define-label
! Load target address
PC 0 <+> LDR
! Skip an instruction
"end" get B
! The target address
0 , rc-absolute rel-dlsym
! Continue here
"end" resolve-label
] with-scope ;
load-cell rc-absolute rel-dlsym ;
: %alien-global ( symbol dll reg -- )
[ compile-dlsym ] keep dup 0 <+> LDR ;