diff options
author | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-05-25 12:05:02 +0000 |
---|---|---|
committer | nickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2> | 2013-05-25 12:05:02 +0000 |
commit | 432668c53bf14a9e12b003150cc947e8f256d4ef (patch) | |
tree | b5a970d5e9bd1b00563d68726877e602aded995f /compiler/i8086/cgcpu.pas | |
parent | 3feead9e30884fc041285167e36b673adbc7b13f (diff) | |
download | fpc-432668c53bf14a9e12b003150cc947e8f256d4ef.tar.gz |
+ support moving from a shorter unsigned (sign extension not yet implemented) to a longer type in tcg8086.a_load_reg_ref
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@24589 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'compiler/i8086/cgcpu.pas')
-rw-r--r-- | compiler/i8086/cgcpu.pas | 59 |
1 files changed, 47 insertions, 12 deletions
diff --git a/compiler/i8086/cgcpu.pas b/compiler/i8086/cgcpu.pas index 6b37a93ef3..064e3f6f9c 100644 --- a/compiler/i8086/cgcpu.pas +++ b/compiler/i8086/cgcpu.pas @@ -824,19 +824,54 @@ unit cgcpu; else internalerror(2013030310); OS_16,OS_S16: - if fromsize in [OS_16,OS_S16] then - list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)) - else - internalerror(2013030312); + case fromsize of + OS_8: + 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)); + end; + OS_S8: internalerror(2013052503); { TODO } + OS_16,OS_S16: + begin + list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); + end; + else + internalerror(2013030312); + end; OS_32,OS_S32: - if fromsize in [OS_32,OS_S32] then - begin - list.concat(taicpu.op_reg_ref(A_MOV, S_W, reg, tmpref)); - inc(tmpref.offset, 2); - list.concat(taicpu.op_reg_ref(A_MOV, S_W, GetNextReg(reg), tmpref)); - end - else - internalerror(2013030313); + case fromsize of + OS_8: + 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)); + 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)); + inc(tmpref.offset, 2); + list.concat(taicpu.op_reg_ref(A_MOV, S_W, GetNextReg(reg), tmpref)); + end; + else + internalerror(2013030313); + end; else internalerror(2013030311); end; |