This is the mail archive of the binutils@sourceware.org mailing list for the binutils project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

PATCH: Remove branches in swap_operands in x86 assembler


I am checking this patch to remove some branches in swap_operands.


H.J.
----
2007-01-03  H.J. Lu  <hongjiu.lu@intel.com>

	* config/tc-i386.c (swap_operands): Remove branches.

--- gas/config/tc-i386.c.swap	2007-01-03 14:49:01.000000000 -0800
+++ gas/config/tc-i386.c	2007-01-03 19:59:01.000000000 -0800
@@ -2280,16 +2280,13 @@ swap_operands (void)
   union i386_op temp_op;
   unsigned int temp_type;
   enum bfd_reloc_code_real temp_reloc;
-  int xchg1 = 0;
-  int xchg2 = 0;
+  int xchg1, xchg2;
 
-  if (i.operands == 4)
-    /* There will be two exchanges in a 4 operand instruction.
-       First exchange is the done inside this block.(1st and 4rth operand) 
-       The next exchange is done outside this block.(2nd and 3rd operand) */
+  switch (i.operands)
     {
-      xchg1 = 0;
-      xchg2 = 3;
+    case 4:
+      xchg1 = 1;
+      xchg2 = i.operands - 2;
       temp_type = i.types[xchg2];
       i.types[xchg2] = i.types[xchg1];
       i.types[xchg1] = temp_type;
@@ -2299,29 +2296,23 @@ swap_operands (void)
       temp_reloc = i.reloc[xchg2];
       i.reloc[xchg2] = i.reloc[xchg1];
       i.reloc[xchg1] = temp_reloc;
-      xchg1 = 1;
-      xchg2 = 2;
-    }
-
-  if (i.operands == 2)
-    {
-      xchg1 = 0;
-      xchg2 = 1;
-    }
-  else if (i.operands == 3)
-    {
+    case 3:
+    case 2:
       xchg1 = 0;
-      xchg2 = 2;
+      xchg2 = i.operands - 1;
+      temp_type = i.types[xchg2];
+      i.types[xchg2] = i.types[xchg1];
+      i.types[xchg1] = temp_type;
+      temp_op = i.op[xchg2];
+      i.op[xchg2] = i.op[xchg1];
+      i.op[xchg1] = temp_op;
+      temp_reloc = i.reloc[xchg2];
+      i.reloc[xchg2] = i.reloc[xchg1];
+      i.reloc[xchg1] = temp_reloc;
+      break;
+    default:
+      abort ();
     }
-  temp_type = i.types[xchg2];
-  i.types[xchg2] = i.types[xchg1];
-  i.types[xchg1] = temp_type;
-  temp_op = i.op[xchg2];
-  i.op[xchg2] = i.op[xchg1];
-  i.op[xchg1] = temp_op;
-  temp_reloc = i.reloc[xchg2];
-  i.reloc[xchg2] = i.reloc[xchg1];
-  i.reloc[xchg1] = temp_reloc;
 
   if (i.mem_operands == 2)
     {


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]