From 070874461c3bf8397e61e4dced5ebbd8db5c5528 Mon Sep 17 00:00:00 2001 From: florian Date: Wed, 11 Apr 2007 19:38:04 +0000 Subject: [PATCH] * fix for tcnvint5 on sparc git-svn-id: trunk@7088 - --- compiler/sparc/cgcpu.pas | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/compiler/sparc/cgcpu.pas b/compiler/sparc/cgcpu.pas index 49d13ad058..1e1b3324e7 100644 --- a/compiler/sparc/cgcpu.pas +++ b/compiler/sparc/cgcpu.pas @@ -54,6 +54,7 @@ interface procedure a_call_name(list:TAsmList;const s:string);override; procedure a_call_reg(list:TAsmList;Reg:TRegister);override; { General purpose instructions } + procedure maybeadjustresult(list: TAsmList; op: TOpCg; size: tcgsize; dst: tregister); procedure a_op_const_reg(list:TAsmList;Op:TOpCG;size:tcgsize;a:aint;reg:TRegister);override; procedure a_op_reg_reg(list:TAsmList;Op:TOpCG;size:TCGSize;src, dst:TRegister);override; procedure a_op_const_reg_reg(list:TAsmList;op:TOpCg;size:tcgsize;a:aint;src, dst:tregister);override; @@ -739,6 +740,16 @@ implementation end; + procedure tcgsparc.maybeadjustresult(list: TAsmList; op: TOpCg; size: tcgsize; dst: tregister); + const + overflowops = [OP_MUL,OP_SHL,OP_ADD,OP_SUB,OP_NOT,OP_NEG]; + begin + if (op in overflowops) and + (size in [OS_8,OS_S8,OS_16,OS_S16]) then + a_load_reg_reg(list,OS_32,size,dst,dst); + end; + + procedure TCgSparc.a_op_const_reg(list:TAsmList;Op:TOpCG;size:tcgsize;a:aint;reg:TRegister); begin if Op in [OP_NEG,OP_NOT] then @@ -747,6 +758,7 @@ implementation list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],reg,NR_G0,reg)) else handle_reg_const_reg(list,TOpCG2AsmOp[op],reg,a,reg); + maybeadjustresult(list,op,size,reg); end; @@ -772,6 +784,7 @@ implementation else list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],dst,src,dst)); end; + maybeadjustresult(list,op,size,dst); end; @@ -801,12 +814,14 @@ implementation end; end; handle_reg_const_reg(list,TOpCG2AsmOp[op],src,a,dst); + maybeadjustresult(list,op,size,dst); end; procedure TCgSparc.a_op_reg_reg_reg(list:TAsmList;op:TOpCg;size:tcgsize;src1, src2, dst:tregister); begin list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],src2,src1,dst)); + maybeadjustresult(list,op,size,dst); end; @@ -852,7 +867,8 @@ implementation end; end else - handle_reg_const_reg(list,TOpCG2AsmOp[op],src,a,dst) + handle_reg_const_reg(list,TOpCG2AsmOp[op],src,a,dst); + maybeadjustresult(list,op,size,dst); end; @@ -886,7 +902,8 @@ implementation end; end else - list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],src2,src1,dst)) + list.concat(taicpu.op_reg_reg_reg(TOpCG2AsmOp[op],src2,src1,dst)); + maybeadjustresult(list,op,size,dst); end;