Browse Source

+ 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 -

nickysn 9 years ago
parent
commit
a5f1ae97d4
1 changed files with 32 additions and 17 deletions
  1. 32 17
      compiler/i8086/cgcpu.pas

+ 32 - 17
compiler/i8086/cgcpu.pas

@@ -1393,20 +1393,30 @@ unit cgcpu;
                 case fromsize of
                 case fromsize of
                   OS_8:
                   OS_8:
                     begin
                     begin
-                      reg2 := makeregsize(list, reg2, OS_8);
-                      if reg1<>reg2 then
-                        add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2));
-                      setsubreg(reg2,R_SUBH);
-                      list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
-                      makeregsize(list, reg2, OS_16);
+                      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);
+                          if reg1<>reg2 then
+                            add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2));
+                          setsubreg(reg2,R_SUBH);
+                          list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
+                          makeregsize(list, reg2, OS_16);
+                        end;
                     end;
                     end;
                   OS_S8:
                   OS_S8:
                     begin
                     begin
-                      getcpuregister(list, NR_AX);
-                      add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, NR_AL));
-                      list.concat(taicpu.op_none(A_CBW));
-                      add_mov(taicpu.op_reg_reg(A_MOV, S_W, NR_AX, reg2));
-                      ungetcpuregister(list, NR_AX);
+                      if current_settings.cputype>=cpu_386 then
+                        add_mov(taicpu.op_reg_reg(A_MOVSX, S_BW, reg1, reg2))
+                      else
+                        begin
+                          getcpuregister(list, NR_AX);
+                          add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, NR_AL));
+                          list.concat(taicpu.op_none(A_CBW));
+                          add_mov(taicpu.op_reg_reg(A_MOV, S_W, NR_AX, reg2));
+                          ungetcpuregister(list, NR_AX);
+                        end;
                     end;
                     end;
                   OS_16,OS_S16:
                   OS_16,OS_S16:
                     begin
                     begin
@@ -1421,12 +1431,17 @@ 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)));
-                      reg2 := makeregsize(list, reg2, OS_8);
-                      if reg1<>reg2 then
-                        add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2));
-                      setsubreg(reg2,R_SUBH);
-                      list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
-                      makeregsize(list, reg2, OS_16);
+                      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);
+                          if reg1<>reg2 then
+                            add_mov(taicpu.op_reg_reg(A_MOV, S_B, reg1, reg2));
+                          setsubreg(reg2,R_SUBH);
+                          list.concat(taicpu.op_const_reg(A_MOV, S_B, 0, reg2));
+                          makeregsize(list, reg2, OS_16);
+                        end;
                     end;
                     end;
                   OS_S8:
                   OS_S8:
                     begin
                     begin