Parcourir la source

* MIPS and SPARC: determine whether case expression is in range using a single unsigned comparison (like it is done on other targets).

git-svn-id: trunk@27088 -
sergei il y a 11 ans
Parent
commit
e163a2c813
2 fichiers modifiés avec 11 ajouts et 9 suppressions
  1. 5 4
      compiler/mips/ncpuset.pas
  2. 6 5
      compiler/sparc/ncpuset.pas

+ 5 - 4
compiler/mips/ncpuset.pas

@@ -91,13 +91,15 @@ var
 
 begin
   opcgsize:=def_cgsize(opsize);
+  last:=min_;
   jumpsegment := current_procinfo.aktlocaldata;
   if not (jumptable_no_range) then
     begin
-      { case expr less than min_ => goto elselabel }
-      cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, opcgsize, jmp_lt, aint(min_), hregister, elselabel);
+      { a <= x <= b <-> unsigned(x-a) <= (b-a) }
+      cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SUB,opcgsize,aint(min_),hregister);
       { case expr greater than max_ => goto elselabel }
-      cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList, opcgsize, jmp_gt, aint(max_), hregister, elselabel);
+      cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
+      min_:=0;
     end;
   current_asmdata.getjumplabel(table);
   indexreg := cg.getaddressregister(current_asmdata.CurrAsmList);
@@ -123,7 +125,6 @@ begin
   { generate jump table }
   new_section(jumpSegment,sec_rodata,current_procinfo.procdef.mangledname,sizeof(aint));
   jumpSegment.concat(Tai_label.Create(table));
-  last := min_;
   genitem(hp);
 end;
 

+ 6 - 5
compiler/sparc/ncpuset.pas

@@ -90,12 +90,14 @@ unit ncpuset;
 
       begin
         opcgsize:=def_cgsize(opsize);
+        last:=min_;
         if not(jumptable_no_range) then
           begin
-             { case expr less than min_ => goto elselabel }
-             cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,jmp_lt,aint(min_),hregister,elselabel);
-             { case expr greater than max_ => goto elselabel }
-             cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,jmp_gt,aint(max_),hregister,elselabel);
+            { a <= x <= b <-> unsigned(x-a) <= (b-a) }
+            cg.a_op_const_reg(current_asmdata.CurrAsmList,OP_SUB,opcgsize,aint(min_),hregister);
+            { case expr greater than max_ => goto elselabel }
+            cg.a_cmp_const_reg_label(current_asmdata.CurrAsmList,opcgsize,OC_A,aint(max_)-aint(min_),hregister,elselabel);
+            min_:=0;
           end;
         current_asmdata.getjumplabel(table);
         indexreg:=cg.getaddressregister(current_asmdata.CurrAsmList);
@@ -137,7 +139,6 @@ unit ncpuset;
         current_asmdata.CurrAsmList.concat(taicpu.op_none(A_NOP));
         cg.ungetcpuregister(current_asmdata.CurrAsmList,NR_O7);
         { generate jump table }
-        last:=min_;
         cg.a_label(current_asmdata.CurrAsmList,table);
         genitem(current_asmdata.CurrAsmList,hp);
       end;