Browse Source

* a64: Fixed bug where unsigned min/max inlines used a signed comparison

J. Gareth "Curious Kit" Moreton 1 year ago
parent
commit
77c86cafd0
1 changed files with 11 additions and 8 deletions
  1. 11 8
      compiler/aarch64/ncpuinl.pas

+ 11 - 8
compiler/aarch64/ncpuinl.pas

@@ -400,6 +400,7 @@ implementation
         i: Integer;
         ai: taicpu;
         op: TAsmOp;
+        cond: TAsmCond;
       begin
         paraarray[1]:=tcallparanode(tcallparanode(parameters).nextpara).paravalue;
           paraarray[2]:=tcallparanode(parameters).paravalue;
@@ -455,21 +456,23 @@ implementation
                paraarray[1].location.register,paraarray[2].location.register));
 
              case inlinenumber of
-               in_min_dword,
                in_min_longint,
-               in_min_qword,
                in_min_int64:
-                current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg_cond(A_CSEL,
-                  location.register,paraarray[1].location.register,paraarray[2].location.register,C_LT));
-               in_max_dword,
+                 cond := C_LT;
+               in_min_dword,
+               in_min_qword:
+                 cond := C_LO;
                in_max_longint,
-               in_max_qword,
                in_max_int64:
-                current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg_cond(A_CSEL,
-                  location.register,paraarray[1].location.register,paraarray[2].location.register,C_GT));
+                 cond := C_GT;
+               in_max_dword,
+               in_max_qword:
+                 cond := C_HI;
                else
                  Internalerror(2021121901);
              end;
+             current_asmdata.CurrAsmList.concat(taicpu.op_reg_reg_reg_cond(A_CSEL,
+               location.register,paraarray[1].location.register,paraarray[2].location.register,cond));
            end
          else
            internalerror(2021121801);