From e5066a5f438bed923d363c50b15bf4713234e168 Mon Sep 17 00:00:00 2001 From: Jeppe Johansen Date: Thu, 30 May 2013 12:06:30 +0000 Subject: [PATCH] Update jumptabel generation for ARM Thumb git-svn-id: trunk@24636 - --- compiler/arm/narmset.pas | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/compiler/arm/narmset.pas b/compiler/arm/narmset.pas index 4228d77848..a8f5167614 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; + basereg, indexreg : tregister; href : treference; tablelabel: TAsmLabel; @@ -208,6 +209,26 @@ implementation last:=min_; genitem_thumb2(current_asmdata.CurrAsmList,hp); end + else if current_settings.cputype in cpu_thumb then + begin + cg.a_op_const_reg_reg(current_asmdata.CurrAsmList,OP_SUB,OS_ADDR,min_+1,indexreg,indexreg); + current_asmdata.getaddrlabel(tablelabel); + + cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SHL,OS_ADDR,2,indexreg); + + basereg:=cg.getintregister(current_asmdata.CurrAsmList, OS_ADDR); + 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)); + + cg.a_label(current_asmdata.CurrAsmList,tablelabel); + { generate jump table } + last:=min_; + genitem(current_asmdata.CurrAsmList,hp); + end else begin { adjust index }