]> git.unchartedbackwaters.co.uk Git - francis/libjit.git/commitdiff
Optimize the use of rotated immediate values.
authorRhys Weatherley <rweather@southern-storm.com.au>
Wed, 9 Jun 2004 07:12:10 +0000 (07:12 +0000)
committerRhys Weatherley <rweather@southern-storm.com.au>
Wed, 9 Jun 2004 07:12:10 +0000 (07:12 +0000)
ChangeLog
jit/jit-gen-arm.c

index 60bcc0bda59339b172319b32ae46097915a34eaa..0d891ee590a21fde30b47926542281f2b79f8357 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -10,6 +10,8 @@
        * jit/jit-gen-arm.c (_arm_alu_reg_imm): forgot to update the
        instruction pointer when loading the immediate value.
 
+       * jit/jit-gen-arm.c: optimize the use of rotated immediate values.
+
 2004-06-08  Rhys Weatherley  <rweather@southern-storm.com.au>
 
        * jit/Makefile.am, jit/jit-cpuid-x86.c, jit/jit-cpuid-x86.h:
index 636bee6ddbaee70fa77d63f30f511ef9b871deb8..162d7aeaecda59f0c40e72fbfbba725824fe9431 100644 (file)
 arm_inst_ptr _arm_mov_reg_imm
        (arm_inst_ptr inst, int reg, int value, int execute_prefix)
 {
+       int bit;
+
        /* Handle bytes in various positions */
-       if((value & 0x000000FF) == value)
-       {
-               arm_mov_reg_imm8(inst, reg, value);
-               return inst;
-       }
-       else if((value & 0x0000FF00) == value)
-       {
-               arm_mov_reg_imm8_rotate(inst, reg, (value >> 8), 12);
-               return inst;
-       }
-       else if((value & 0x00FF0000) == value)
-       {
-               arm_mov_reg_imm8_rotate(inst, reg, (value >> 16), 8);
-               return inst;
-       }
-       else if((value & 0xFF000000) == value)
+       for(bit = 0; bit <= (32 - 8); bit += 2)
        {
-               arm_mov_reg_imm8_rotate(inst, reg, ((value >> 24) & 0xFF), 4);
-               return inst;
+               if((value & (0xFF << bit)) == value)
+               {
+                       arm_mov_reg_imm8_rotate
+                               (inst, reg, ((value >> bit) & 0xFF), (16 - bit / 2) & 0x0F);
+                       return inst;
+               }
        }
 
        /* Handle inverted bytes in various positions */
        value = ~value;
-       if((value & 0x000000FF) == value)
-       {
-               arm_mov_reg_imm8(inst, reg, value);
-               arm_alu_reg(inst, ARM_MVN, reg, reg);
-               return inst;
-       }
-       else if((value & 0x0000FF00) == value)
+       for(bit = 0; bit <= (32 - 8); bit += 2)
        {
-               arm_mov_reg_imm8_rotate(inst, reg, (value >> 8), 12);
-               arm_alu_reg(inst, ARM_MVN, reg, reg);
-               return inst;
-       }
-       else if((value & 0x00FF0000) == value)
-       {
-               arm_mov_reg_imm8_rotate(inst, reg, (value >> 16), 8);
-               arm_alu_reg(inst, ARM_MVN, reg, reg);
-               return inst;
-       }
-       else if((value & 0xFF000000) == value)
-       {
-               arm_mov_reg_imm8_rotate(inst, reg, ((value >> 24) & 0xFF), 4);
-               arm_alu_reg(inst, ARM_MVN, reg, reg);
-               return inst;
+               if((value & (0xFF << bit)) == value)
+               {
+                       arm_alu_reg_imm8_rotate
+                               (inst, ARM_MVN, reg, 0,
+                                ((value >> bit) & 0xFF), (16 - bit / 2) & 0x0F);
+                       return inst;
+               }
        }
 
        /* Build the value the hard way, byte by byte */
@@ -130,42 +107,18 @@ arm_inst_ptr _arm_mov_reg_imm
 
 int arm_is_complex_imm(int value)
 {
-       if(value > -256 && value < 256)
-       {
-               return 0;
-       }
-       else if((value & 0x000000FF) == value)
-       {
-               return 0;
-       }
-       else if((value & 0x0000FF00) == value)
-       {
-               return 0;
-       }
-       else if((value & 0x00FF0000) == value)
-       {
-               return 0;
-       }
-       else if((value & 0xFF000000) == value)
-       {
-               return 0;
-       }
-       value = ~value;
-       if((value & 0x000000FF) == value)
-       {
-               return 0;
-       }
-       else if((value & 0x0000FF00) == value)
-       {
-               return 0;
-       }
-       else if((value & 0x00FF0000) == value)
+       int bit;
+       int inv_value = ~value;
+       for(bit = 0; bit <= (32 - 8); bit += 2)
        {
-               return 0;
-       }
-       else if((value & 0xFF000000) == value)
-       {
-               return 0;
+               if((value & (0xFF << bit)) == value)
+               {
+                       return 0;
+               }
+               if((inv_value & (0xFF << bit)) == inv_value)
+               {
+                       return 0;
+               }
        }
        return 1;
 }
@@ -174,7 +127,17 @@ arm_inst_ptr _arm_alu_reg_imm
        (arm_inst_ptr inst, int opc, int dreg,
         int sreg, int imm, int saveWork, int execute_prefix)
 {
-       int tempreg;
+       int bit, tempreg;
+       for(bit = 0; bit <= (32 - 8); bit += 2)
+       {
+               if((imm & (0xFF << bit)) == imm)
+               {
+                       arm_alu_reg_imm8_rotate
+                               (inst, opc, dreg, sreg,
+                                ((imm >> bit) & 0xFF), (16 - bit / 2) & 0x0F);
+                       return inst;
+               }
+       }
        if(saveWork)
        {
                if(dreg != ARM_R2 && sreg != ARM_R2)