patches/gcc/3.4.6/600-gcc34-arm-ldm-peephole.patch
author "Yann E. MORIN" <yann.morin.1998@anciens.enib.fr>
Sat Apr 26 21:31:05 2008 +0000 (2008-04-26)
changeset 454 372b2f397baa
permissions -rw-r--r--
Configure tsocks with a simple heuristic.

Consider the proxy has to be in a 'local' network. It means it is directly
reachable by the local machine, even if the local machine has to hop through
one or more gates to reach the proxy (often the case in enterprise networks
where class A 10.0.0.0/8 is in fact sub-divided into smaller networks, each
one of them in a different location, eg. 10.1.0.0/16 in a place, while
10.2.0.0/16 would be on the other side of the world). Not being in the same
subnet does not mean the proxy is not available.

So we will build a mask with at most high bits set, which defines a network
that has both the local machine and the proxy. Because a machine may have
more than one interface, build a mask for each of them, removing 127.0.0.1
which is added automagically by tsocks, and removing duplicate masks.

If all of this does not work, then it means the local machine can NOT in fact
reach the proxy, which in turn means the user mis-configured something (most
probably a typo...).

/trunk/scripts/crosstool.sh | 61 52 9 0 +++++++++++++++++++++++++++++++++++++++++++--------
1 file changed, 52 insertions(+), 9 deletions(-)
yann@339
     1
diff -durN gcc-3.4.6.orig/gcc/config/arm/arm.c gcc-3.4.6/gcc/config/arm/arm.c
yann@339
     2
--- gcc-3.4.6.orig/gcc/config/arm/arm.c	2005-10-01 15:31:38.000000000 +0200
yann@339
     3
+++ gcc-3.4.6/gcc/config/arm/arm.c	2007-08-15 22:54:59.000000000 +0200
yann@339
     4
@@ -4857,6 +4857,11 @@
yann@339
     5
       *load_offset = unsorted_offsets[order[0]];
yann@339
     6
     }
yann@339
     7
 
yann@339
     8
+  /* For XScale a two-word LDM is a performance loss, so only do this if
yann@339
     9
+     size is more important.  See comments in arm_gen_load_multiple.  */
yann@339
    10
+  if (nops == 2 && arm_tune_xscale && !optimize_size)
yann@339
    11
+    return 0;
yann@339
    12
+
yann@339
    13
   if (unsorted_offsets[order[0]] == 0)
yann@339
    14
     return 1; /* ldmia */
yann@339
    15
 
yann@339
    16
@@ -5083,6 +5088,11 @@
yann@339
    17
       *load_offset = unsorted_offsets[order[0]];
yann@339
    18
     }
yann@339
    19
 
yann@339
    20
+  /* For XScale a two-word LDM is a performance loss, so only do this if
yann@339
    21
+     size is more important.  See comments in arm_gen_load_multiple.  */
yann@339
    22
+  if (nops == 2 && arm_tune_xscale && !optimize_size)
yann@339
    23
+    return 0;
yann@339
    24
+
yann@339
    25
   if (unsorted_offsets[order[0]] == 0)
yann@339
    26
     return 1; /* stmia */
yann@339
    27
 
yann@339
    28
diff -durN gcc-3.4.6.orig/gcc/config/arm/arm.md gcc-3.4.6/gcc/config/arm/arm.md
yann@339
    29
--- gcc-3.4.6.orig/gcc/config/arm/arm.md	2005-10-01 15:31:38.000000000 +0200
yann@339
    30
+++ gcc-3.4.6/gcc/config/arm/arm.md	2007-08-15 22:54:59.000000000 +0200
yann@339
    31
@@ -8811,13 +8811,16 @@
yann@339
    32
    (set_attr "length" "4,8,8")]
yann@339
    33
 )
yann@339
    34
 
yann@339
    35
+; Try to convert LDR+LDR+arith into [add+]LDM+arith
yann@339
    36
+; On XScale, LDM is always slower than two LDRs, so only do this if
yann@339
    37
+; optimising for size.
yann@339
    38
 (define_insn "*arith_adjacentmem"
yann@339
    39
   [(set (match_operand:SI 0 "s_register_operand" "=r")
yann@339
    40
 	(match_operator:SI 1 "shiftable_operator"
yann@339
    41
 	 [(match_operand:SI 2 "memory_operand" "m")
yann@339
    42
 	  (match_operand:SI 3 "memory_operand" "m")]))
yann@339
    43
    (clobber (match_scratch:SI 4 "=r"))]
yann@339
    44
-  "TARGET_ARM && adjacent_mem_locations (operands[2], operands[3])"
yann@339
    45
+  "TARGET_ARM && (!arm_tune_xscale || optimize_size) && adjacent_mem_locations (operands[2], operands[3])"
yann@339
    46
   "*
yann@339
    47
   {
yann@339
    48
     rtx ldm[3];
yann@339
    49
@@ -8852,6 +8855,8 @@
yann@339
    50
       }
yann@339
    51
    if (val1 && val2)
yann@339
    52
       {
yann@339
    53
+	/* This would be a loss on a Harvard core, but adjacent_mem_locations()
yann@339
    54
+	   will prevent it from happening.  */
yann@339
    55
 	rtx ops[3];
yann@339
    56
 	ldm[0] = ops[0] = operands[4];
yann@339
    57
 	ops[1] = XEXP (XEXP (operands[2], 0), 0);
yann@339
    58
diff -durN gcc-3.4.6.orig/gcc/genpeep.c gcc-3.4.6/gcc/genpeep.c
yann@339
    59
--- gcc-3.4.6.orig/gcc/genpeep.c	2003-07-05 07:27:22.000000000 +0200
yann@339
    60
+++ gcc-3.4.6/gcc/genpeep.c	2007-08-15 22:54:59.000000000 +0200
yann@339
    61
@@ -381,6 +381,7 @@
yann@339
    62
   printf ("#include \"recog.h\"\n");
yann@339
    63
   printf ("#include \"except.h\"\n\n");
yann@339
    64
   printf ("#include \"function.h\"\n\n");
yann@339
    65
+  printf ("#include \"flags.h\"\n\n");
yann@339
    66
 
yann@339
    67
   printf ("#ifdef HAVE_peephole\n");
yann@339
    68
   printf ("extern rtx peep_operand[];\n\n");