Przeglądaj źródła

* fixed not(boolean32) and not(boolean64) on i8086

git-svn-id: trunk@26369 -
nickysn 11 lat temu
rodzic
commit
270444508a
1 zmienionych plików z 40 dodań i 4 usunięć
  1. 40 4
      compiler/x86/nx86mat.pas

+ 40 - 4
compiler/x86/nx86mat.pas

@@ -242,7 +242,7 @@ interface
              LOC_CREFERENCE,
              LOC_REFERENCE:
                begin
-{$ifndef cpu64bitalu}
+{$if defined(cpu32bitalu)}
                  if is_64bit(resultdef) then
                    begin
                      hreg:=cg.GetIntRegister(current_asmdata.CurrAsmList,OS_32);
@@ -252,7 +252,29 @@ interface
                      cg.a_op_ref_reg(current_asmdata.CurrAsmList,OP_OR,OS_32,left.location.reference,hreg);
                    end
                  else
-{$endif cpu64bitalu}
+{$elseif defined(cpu16bitalu)}
+                 if is_64bit(resultdef) then
+                   begin
+                     hreg:=cg.GetIntRegister(current_asmdata.CurrAsmList,OS_16);
+                     tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,left.location.reference);
+                     cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,left.location.reference,hreg);
+                     inc(left.location.reference.offset,2);
+                     cg.a_op_ref_reg(current_asmdata.CurrAsmList,OP_OR,OS_16,left.location.reference,hreg);
+                     inc(left.location.reference.offset,2);
+                     cg.a_op_ref_reg(current_asmdata.CurrAsmList,OP_OR,OS_16,left.location.reference,hreg);
+                     inc(left.location.reference.offset,2);
+                     cg.a_op_ref_reg(current_asmdata.CurrAsmList,OP_OR,OS_16,left.location.reference,hreg);
+                   end
+                 else if is_32bit(resultdef) then
+                   begin
+                     hreg:=cg.GetIntRegister(current_asmdata.CurrAsmList,OS_16);
+                     tcgx86(cg).make_simple_ref(current_asmdata.CurrAsmList,left.location.reference);
+                     cg.a_load_ref_reg(current_asmdata.CurrAsmList,OS_16,OS_16,left.location.reference,hreg);
+                     inc(left.location.reference.offset,2);
+                     cg.a_op_ref_reg(current_asmdata.CurrAsmList,OP_OR,OS_16,left.location.reference,hreg);
+                   end
+                 else
+{$endif}
                    emit_const_ref(A_CMP, TCGSize2Opsize[opsize], 0, left.location.reference);
                  location_reset(location,LOC_FLAGS,OS_NO);
                  location.resflags:=F_E;
@@ -265,14 +287,28 @@ interface
              LOC_SUBSETREF,
              LOC_CSUBSETREF :
                begin
-{$ifndef cpu64bitalu}
+{$if defined(cpu32bitalu)}
                  if is_64bit(resultdef) then
                    begin
                      hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,false);
                      emit_reg_reg(A_OR,S_L,left.location.register64.reghi,left.location.register64.reglo);
                    end
                  else
-{$endif cpu64bitalu}
+{$elseif defined(cpu16bitalu)}
+                 if is_64bit(resultdef) then
+                   begin
+                     hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,false);
+                     emit_reg_reg(A_OR,S_W,GetNextReg(left.location.register64.reghi),left.location.register64.reghi);
+                     emit_reg_reg(A_OR,S_W,GetNextReg(left.location.register64.reglo),left.location.register64.reglo);
+                     emit_reg_reg(A_OR,S_W,left.location.register64.reghi,left.location.register64.reglo);
+                   end
+                 else if is_32bit(resultdef) then
+                   begin
+                     hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,false);
+                     emit_reg_reg(A_OR,S_L,GetNextReg(left.location.register),left.location.register);
+                   end
+                 else
+{$endif}
                    begin
                      hlcg.location_force_reg(current_asmdata.CurrAsmList,left.location,left.resultdef,resultdef,true);
                      emit_reg_reg(A_TEST,TCGSize2Opsize[opsize],left.location.register,left.location.register);