summaryrefslogtreecommitdiff
path: root/compiler/arm/narmset.pas
diff options
context:
space:
mode:
authorjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-01-21 23:28:34 +0000
committerjonas <jonas@3ad0048d-3df7-0310-abae-a5850022a9f2>2015-01-21 23:28:34 +0000
commit1903b037de2fb3e75826406b46f055acb70963fa (patch)
tree604cd8b790fe14e5fbe441d4cd647c80d2a36a9a /compiler/arm/narmset.pas
parentad1141d52f8353457053b925cd674fe1d5c4eafc (diff)
parent953d907e4d6c3a5c2f8aaee6e5e4f73c55ce5985 (diff)
downloadfpc-blocks.tar.gz
* synchronised with trunk till r29513blocks
git-svn-id: http://svn.freepascal.org/svn/fpc/branches/blocks@29516 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/arm/narmset.pas')
-rw-r--r--compiler/arm/narmset.pas15
1 files changed, 11 insertions, 4 deletions
diff --git a/compiler/arm/narmset.pas b/compiler/arm/narmset.pas
index 35b34321a3..e1a99f2dbb 100644
--- a/compiler/arm/narmset.pas
+++ b/compiler/arm/narmset.pas
@@ -141,6 +141,7 @@ implementation
procedure tarmcasenode.genjumptable(hp : pcaselabel;min_,max_ : aint);
var
last : TConstExprInt;
+ tmpreg,
basereg,
indexreg : tregister;
href : treference;
@@ -222,7 +223,7 @@ implementation
begin
if cs_create_pic in current_settings.moduleswitches then
internalerror(2013082102);
- cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg);
+ cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_,indexreg,indexreg);
current_asmdata.getaddrlabel(tablelabel);
cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,indexreg);
@@ -231,9 +232,15 @@ implementation
reference_reset_symbol(href,tablelabel,0,4);
cg.a_loadaddr_ref_reg(current_asmdata.CurrAsmList, href, basereg);
- cg.a_op_reg_reg(current_asmdata.CurrAsmList, OP_ADD, OS_ADDr, indexreg, basereg);
-
- current_asmdata.CurrAsmList.Concat(taicpu.op_reg(A_BX, basereg));
+ reference_reset(href,0);
+ href.base:=basereg;
+ href.index:=indexreg;
+
+ tmpreg:=cg.getintregister(current_asmdata.CurrAsmList, OS_ADDR);
+ cg.a_load_ref_reg(current_asmdata.CurrAsmList, OS_ADDR, OS_ADDR, href, tmpreg);
+
+ { do not use BX here to avoid switching into arm mode }
+ current_asmdata.CurrAsmList.Concat(taicpu.op_reg_reg(A_MOV, NR_PC, tmpreg));
cg.a_label(current_asmdata.CurrAsmList,tablelabel);
{ generate jump table }