From 4141df7fe6b1eabd4727d02d7d025c4a62cc0d64 Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 11 Apr 2020 14:58:58 +0000 Subject: [PATCH] * Xtensa: patch by Christo Crause to handle the sign extension architecture option, resolves #36885 git-svn-id: trunk@44689 - --- compiler/xtensa/cgcpu.pas | 24 +++++++++++++++++++++--- compiler/xtensa/cpuinfo.pas | 5 +++-- compiler/xtensa/xtensaatt.inc | 1 + compiler/xtensa/xtensaop.inc | 1 + 4 files changed, 26 insertions(+), 5 deletions(-) diff --git a/compiler/xtensa/cgcpu.pas b/compiler/xtensa/cgcpu.pas index 373d0eca02..9e4aa4ae1c 100644 --- a/compiler/xtensa/cgcpu.pas +++ b/compiler/xtensa/cgcpu.pas @@ -179,14 +179,26 @@ implementation list.concat(taicpu.op_reg_reg_const_const(A_EXTUI,reg2,reg1,0,8)); OS_S8: begin - list.concat(taicpu.op_reg_reg_const(A_SEXT,reg2,reg1,7)); + if CPUXTENSA_HAS_SEXT in cpu_capabilities[current_settings.cputype] then + list.concat(taicpu.op_reg_reg_const(A_SEXT,reg2,reg1,7)) + else + begin + list.concat(taicpu.op_reg_reg_const(A_SLLI,reg2,reg1,24)); + list.concat(taicpu.op_reg_reg_const(A_SRAI,reg2,reg2,24)); + end; if tosize=OS_16 then list.concat(taicpu.op_reg_reg_const_const(A_EXTUI,reg2,reg2,0,16)); end; OS_16: list.concat(taicpu.op_reg_reg_const_const(A_EXTUI,reg2,reg1,0,16)); OS_S16: - list.concat(taicpu.op_reg_reg_const(A_SEXT,reg2,reg1,15)); + if CPUXTENSA_HAS_SEXT in cpu_capabilities[current_settings.cputype] then + list.concat(taicpu.op_reg_reg_const(A_SEXT,reg2,reg1,15)) + else + begin + list.concat(taicpu.op_reg_reg_const(A_SLLI,reg2,reg1,16)); + list.concat(taicpu.op_reg_reg_const(A_SRAI,reg2,reg2,16)); + end; else conv_done:=false; end; @@ -270,7 +282,13 @@ implementation list.concat(taicpu.op_reg_ref(op,reg,href)); if (fromsize=OS_S8) and not(tosize in [OS_S8,OS_8]) then - list.concat(taicpu.op_reg_reg_const(A_SEXT,reg,reg,7)); + if CPUXTENSA_HAS_SEXT in cpu_capabilities[current_settings.cputype] then + list.concat(taicpu.op_reg_reg_const(A_SEXT,reg,reg,7)) + else + begin + list.concat(taicpu.op_reg_reg_const(A_SLLI,reg,reg,24)); + list.concat(taicpu.op_reg_reg_const(A_SRAI,reg,reg,24)); + end; if (fromsize<>tosize) and (not (tosize in [OS_SINT,OS_INT])) then a_load_reg_reg(list,fromsize,tosize,reg,reg); end; diff --git a/compiler/xtensa/cpuinfo.pas b/compiler/xtensa/cpuinfo.pas index c5aabd72f3..57c73f1af7 100644 --- a/compiler/xtensa/cpuinfo.pas +++ b/compiler/xtensa/cpuinfo.pas @@ -135,7 +135,8 @@ Const type tcpuflags = ( - CPUXTENSA_REGWINDOW + CPUXTENSA_REGWINDOW, + CPUXTENSA_HAS_SEXT ); tfpuflags = @@ -149,7 +150,7 @@ Const ( { cpu_none } [], { cpu_lx106 } [], - { cpu_lx6 } [CPUXTENSA_REGWINDOW] + { cpu_lx6 } [CPUXTENSA_REGWINDOW, CPUXTENSA_HAS_SEXT] ); fpu_capabilities : array[tfputype] of set of tfpuflags = diff --git a/compiler/xtensa/xtensaatt.inc b/compiler/xtensa/xtensaatt.inc index 58ef29eb49..26d9784717 100644 --- a/compiler/xtensa/xtensaatt.inc +++ b/compiler/xtensa/xtensaatt.inc @@ -48,6 +48,7 @@ 'sll', 'slli', 'sra', +'srai', 'srl', 'srli', 'ssi', diff --git a/compiler/xtensa/xtensaop.inc b/compiler/xtensa/xtensaop.inc index c1da8025b9..b7e2430a34 100644 --- a/compiler/xtensa/xtensaop.inc +++ b/compiler/xtensa/xtensaop.inc @@ -48,6 +48,7 @@ A_SEXT, A_SLL, A_SLLI, A_SRA, +A_SRAI, A_SRL, A_SRLI, A_SSI,