+ make use of the 16-bit movsx and movzx instructions in tcg8086.a_load_reg_reg

when the cpu target is 80386 or later

git-svn-id: trunk@34046 -
This commit is contained in:
nickysn 2016-07-02 14:06:25 +00:00
parent fd4e42abaa
commit a5f1ae97d4

View File

@ -1392,6 +1392,10 @@ unit cgcpu;
OS_16,OS_S16: OS_16,OS_S16:
case fromsize of case fromsize of
OS_8: OS_8:
begin
if current_settings.cputype>=cpu_386 then
add_mov(taicpu.op_reg_reg(A_MOVZX, S_BW, reg1, reg2))
else
begin begin
reg2 := makeregsize(list, reg2, OS_8); reg2 := makeregsize(list, reg2, OS_8);
if reg1<>reg2 then if reg1<>reg2 then
@ -1400,7 +1404,12 @@ unit cgcpu;
list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2)); list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
makeregsize(list, reg2, OS_16); makeregsize(list, reg2, OS_16);
end; end;
end;
OS_S8: OS_S8:
begin
if current_settings.cputype>=cpu_386 then
add_mov(taicpu.op_reg_reg(A_MOVSX, S_BW, reg1, reg2))
else
begin begin
getcpuregister(list, NR_AX); getcpuregister(list, NR_AX);
add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, NR_AL)); add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, NR_AL));
@ -1408,6 +1417,7 @@ unit cgcpu;
add_mov(taicpu.op_reg_reg(A_MOV, S_W, NR_AX, reg2)); add_mov(taicpu.op_reg_reg(A_MOV, S_W, NR_AX, reg2));
ungetcpuregister(list, NR_AX); ungetcpuregister(list, NR_AX);
end; end;
end;
OS_16,OS_S16: OS_16,OS_S16:
begin begin
if reg1<>reg2 then if reg1<>reg2 then
@ -1421,6 +1431,10 @@ unit cgcpu;
OS_8: OS_8:
begin begin
list.concat(taicpu.op_const_reg(A_MOV, S_W, 0, GetNextReg(reg2))); list.concat(taicpu.op_const_reg(A_MOV, S_W, 0, GetNextReg(reg2)));
if current_settings.cputype>=cpu_386 then
add_mov(taicpu.op_reg_reg(A_MOVZX, S_BW, reg1, reg2))
else
begin
reg2 := makeregsize(list, reg2, OS_8); reg2 := makeregsize(list, reg2, OS_8);
if reg1<>reg2 then if reg1<>reg2 then
add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2)); add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2));
@ -1428,6 +1442,7 @@ unit cgcpu;
list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2)); list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
makeregsize(list, reg2, OS_16); makeregsize(list, reg2, OS_16);
end; end;
end;
OS_S8: OS_S8:
begin begin
getcpuregister(list, NR_AX); getcpuregister(list, NR_AX);