From d57d982be7e3e2a12fde25c643c2623ad82a5d24 Mon Sep 17 00:00:00 2001 From: nickysn Date: Tue, 31 Dec 2013 00:33:37 +0000 Subject: [PATCH] * simpler handling of moves from a smaller to a larger cgsize in tcg8086.a_load_reg_ref, which additionally fixes the following issues: o The higher parts of the source register is no longer modified. o The source register's size is no longer modified with makeregsize. o Conversion from OS_S8 to a larger size is now supported. git-svn-id: trunk@26335 - --- compiler/i8086/cgcpu.pas | 28 ++++++++-------------------- 1 file changed, 8 insertions(+), 20 deletions(-) diff --git a/compiler/i8086/cgcpu.pas b/compiler/i8086/cgcpu.pas index 4718f83437..4e1afa8d58 100644 --- a/compiler/i8086/cgcpu.pas +++ b/compiler/i8086/cgcpu.pas @@ -1052,7 +1052,6 @@ unit cgcpu; procedure tcg8086.a_load_reg_ref(list : TAsmList;fromsize,tosize: tcgsize; reg : tregister;const ref : treference); var - tmpsize : tcgsize; tmpreg : tregister; tmpref : treference; begin @@ -1068,15 +1067,12 @@ unit cgcpu; internalerror(2013030310); OS_16,OS_S16: case fromsize of - OS_8: + OS_8,OS_S8: begin - reg := makeregsize(list, reg, OS_16); - setsubreg(reg, R_SUBH); - list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg)); - setsubreg(reg, R_SUBW); - list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); + tmpreg:=getintregister(list,tosize); + a_load_reg_reg(list,fromsize,tosize,reg,tmpreg); + a_load_reg_ref(list,tosize,tosize,tmpreg,tmpref); end; - OS_S8: internalerror(2013052503); { TODO } OS_16,OS_S16: begin list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); @@ -1086,26 +1082,18 @@ unit cgcpu; end; OS_32,OS_S32: case fromsize of - OS_8: + OS_8,OS_S8,OS_S16: begin - reg := makeregsize(list, reg, OS_16); - setsubreg(reg, R_SUBH); - list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg)); - setsubreg(reg, R_SUBW); - list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); - inc(tmpref.offset, 2); - list.concat(taicpu.op_const_ref(A_MOV, S_W, 0, tmpref)); + tmpreg:=getintregister(list,tosize); + a_load_reg_reg(list,fromsize,tosize,reg,tmpreg); + a_load_reg_ref(list,tosize,tosize,tmpreg,tmpref); end; - OS_S8: - internalerror(2013052501); { TODO } OS_16: begin list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); inc(tmpref.offset, 2); list.concat(taicpu.op_const_ref(A_MOV, S_W, 0, tmpref)); end; - OS_S16: - internalerror(2013052502); { TODO } OS_32,OS_S32: begin list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref));