summaryrefslogtreecommitdiff
path: root/compiler/i8086/cgcpu.pas
diff options
context:
space:
mode:
authornickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-05-25 12:05:02 +0000
committernickysn <nickysn@3ad0048d-3df7-0310-abae-a5850022a9f2>2013-05-25 12:05:02 +0000
commit432668c53bf14a9e12b003150cc947e8f256d4ef (patch)
treeb5a970d5e9bd1b00563d68726877e602aded995f /compiler/i8086/cgcpu.pas
parent3feead9e30884fc041285167e36b673adbc7b13f (diff)
downloadfpc-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.pas59
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;