public inbox for gcc-patches@gcc.gnu.org
 help / color / mirror / Atom feed
* The TI C6X port
@ 2011-05-10 15:36 Bernd Schmidt
  2011-05-10 15:38 ` C6X port 1/11: Reorganize schedule_block Bernd Schmidt
                   ` (16 more replies)
  0 siblings, 17 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:36 UTC (permalink / raw)
  To: GCC Patches; +Cc: Paul Brook, Nathan Sidwell

I will post a series of patches as replies to this message which add a
port for TI's C6X processors to gcc. This involves a number of scheduler
changes and a few minor new target hooks and macros.

Some pieces are still missing in this submission. Paul Brook has
implemented exception handling support according the C6X ELF ABI which
is similar to ARM; I expect he'll submit the target independent parts of
this soon after the port goes in. This patch set also lacks support for
modulo scheduling using the hardware's SPLOOP instruction; I've
implemented this in our tree but don't consider it entirely ready for
submission yet.

Binutils and uClibc already contain C6X patches; unfortunately there
isn't an open-source sim.

I have bootstrapped the resulting tree after all the patches on
i686-linux; running regression tests now (done already for several of
the individual patches).
I've also run c6x tests, which look fairly clean on the whole.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 1/11: Reorganize schedule_block
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
@ 2011-05-10 15:38 ` Bernd Schmidt
  2011-05-10 15:40 ` C6X port 2/11: Use a structure for schedule_block variables Bernd Schmidt
                   ` (15 subsequent siblings)
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:38 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 520 bytes --]

There is still some code duplication in schedule_block, and the inner
scheduling loop is somewhat convoluted. It would be easier to follow if
the sequence of operations was

1. sort the ready list
2. choose an instruction
3. schedule it

The following patch changes the loop to use that structure. It would be
nice to break out step 2 into a separate function later, eliminating one
goto.

Apart from normal testing I've built an ia64 cross compiler to check
that code generated before/after is the same at -O2.


Bernd

[-- Attachment #2: hs-loop.diff --]
[-- Type: text/plain, Size: 6128 bytes --]

	* haifa-sched.c (schedule-block): Reorder the inner scheduling loop
	to reduce duplication, and to achieve a slightly more logical order
	of operations.

Index: gcc/haifa-sched.c
===================================================================
--- gcc.orig/haifa-sched.c
+++ gcc/haifa-sched.c
@@ -3066,63 +3066,77 @@ schedule_block (basic_block *target_bb)
 	}
       while (advance > 0);
 
-      prune_ready_list (temp_state, true);
+      if (ready.n_ready > 0)
+	prune_ready_list (temp_state, true);
       if (ready.n_ready == 0)
-        continue;
+	continue;
 
-      if (sort_p)
+      first_cycle_insn_p = true;
+      cycle_issued_insns = 0;
+      can_issue_more = issue_rate;
+      for (;;)
 	{
-	  /* Sort the ready list based on priority.  */
-	  ready_sort (&ready);
+	  rtx insn;
+	  int cost;
+	  bool asm_p = false;
 
-	  if (sched_verbose >= 2)
+	  if (sort_p && ready.n_ready > 0)
 	    {
-	      fprintf (sched_dump, ";;\t\tReady list after ready_sort:  ");
-	      debug_ready_list (&ready);
+	      /* Sort the ready list based on priority.  This must be
+		 done every iteration through the loop, as schedule_insn
+		 may have readied additional insns that will not be
+		 sorted correctly.  */
+	      ready_sort (&ready);
+
+	      if (sched_verbose >= 2)
+		{
+		  fprintf (sched_dump, ";;\t\tReady list after ready_sort:  ");
+		  debug_ready_list (&ready);
+		}
 	    }
-	}
 
-      /* We don't want md sched reorder to even see debug isns, so put
-	 them out right away.  */
-      if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
-	{
-	  while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
+	  /* We don't want md sched reorder to even see debug isns, so put
+	     them out right away.  */
+	  if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0))
+	      && (*current_sched_info->schedule_more_p) ())
 	    {
-	      rtx insn = ready_remove_first (&ready);
-	      gcc_assert (DEBUG_INSN_P (insn));
-	      (*current_sched_info->begin_schedule_ready) (insn);
-	      VEC_safe_push (rtx, heap, scheduled_insns, insn);
-	      last_scheduled_insn = insn;
-	      advance = schedule_insn (insn);
-	      gcc_assert (advance == 0);
-	      if (ready.n_ready > 0)
-		ready_sort (&ready);
+	      while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
+		{
+		  rtx insn = ready_remove_first (&ready);
+		  gcc_assert (DEBUG_INSN_P (insn));
+		  (*current_sched_info->begin_schedule_ready) (insn);
+		  VEC_safe_push (rtx, heap, scheduled_insns, insn);
+		  last_scheduled_insn = insn;
+		  advance = schedule_insn (insn);
+		  gcc_assert (advance == 0);
+		  if (ready.n_ready > 0)
+		    ready_sort (&ready);
+		}
 	    }
 
-	  if (!ready.n_ready)
-	    continue;
-	}
-
-      /* Allow the target to reorder the list, typically for
-	 better instruction bundling.  */
-      if (sort_p && targetm.sched.reorder
-	  && (ready.n_ready == 0
-	      || !SCHED_GROUP_P (ready_element (&ready, 0))))
-	can_issue_more =
-	  targetm.sched.reorder (sched_dump, sched_verbose,
-				 ready_lastpos (&ready),
-				 &ready.n_ready, clock_var);
-      else
-	can_issue_more = issue_rate;
+	  if (first_cycle_insn_p && !ready.n_ready)
+	    break;
 
-      first_cycle_insn_p = true;
-      cycle_issued_insns = 0;
-      for (;;)
-	{
-	  rtx insn;
-	  int cost;
-	  bool asm_p = false;
+	  /* Allow the target to reorder the list, typically for
+	     better instruction bundling.  */
+	  if (sort_p
+	      && (ready.n_ready == 0
+		  || !SCHED_GROUP_P (ready_element (&ready, 0))))
+	    {
+	      if (first_cycle_insn_p && targetm.sched.reorder)
+		can_issue_more
+		  = targetm.sched.reorder (sched_dump, sched_verbose,
+					   ready_lastpos (&ready),
+					   &ready.n_ready, clock_var);
+	      else if (!first_cycle_insn_p && targetm.sched.reorder2)
+		can_issue_more
+		  = targetm.sched.reorder2 (sched_dump, sched_verbose,
+					    ready.n_ready
+					    ? ready_lastpos (&ready) : NULL,
+					    &ready.n_ready, clock_var);
+	    }
 
+	restart_choose_ready:
 	  if (sched_verbose >= 2)
 	    {
 	      fprintf (sched_dump, ";;\tReady list (t = %3d):  ",
@@ -3164,8 +3178,7 @@ schedule_block (basic_block *target_bb)
 		/* Finish cycle.  */
 		break;
 	      if (res > 0)
-		/* Restart choose_ready ().  */
-		continue;
+		goto restart_choose_ready;
 
 	      gcc_assert (insn != NULL_RTX);
 	    }
@@ -3207,7 +3220,7 @@ schedule_block (basic_block *target_bb)
 	       insn from the split block.  */
 	    {
 	      TODO_SPEC (insn) = (TODO_SPEC (insn) & ~SPECULATIVE) | HARD_DEP;
-	      continue;
+	      goto restart_choose_ready;
 	    }
 
 	  /* DECISION is made.  */
@@ -3256,45 +3269,8 @@ schedule_block (basic_block *target_bb)
 	    break;
 
 	  first_cycle_insn_p = false;
-
-	  if (ready.n_ready > 0)
-            prune_ready_list (temp_state, false);
-
-	  /* Sort the ready list based on priority.  This must be
-	     redone here, as schedule_insn may have readied additional
-	     insns that will not be sorted correctly.  */
 	  if (ready.n_ready > 0)
-	    ready_sort (&ready);
-
-	  /* Quickly go through debug insns such that md sched
-	     reorder2 doesn't have to deal with debug insns.  */
-	  if (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0))
-	      && (*current_sched_info->schedule_more_p) ())
-	    {
-	      while (ready.n_ready && DEBUG_INSN_P (ready_element (&ready, 0)))
-		{
-		  insn = ready_remove_first (&ready);
-		  gcc_assert (DEBUG_INSN_P (insn));
-		  (*current_sched_info->begin_schedule_ready) (insn);
-		  VEC_safe_push (rtx, heap, scheduled_insns, insn);
-		  advance = schedule_insn (insn);
-		  last_scheduled_insn = insn;
-		  gcc_assert (advance == 0);
-		  if (ready.n_ready > 0)
-		    ready_sort (&ready);
-		}
-	    }
-
-	  if (targetm.sched.reorder2
-	      && (ready.n_ready == 0
-		  || !SCHED_GROUP_P (ready_element (&ready, 0))))
-	    {
-	      can_issue_more =
-		targetm.sched.reorder2 (sched_dump, sched_verbose,
-					ready.n_ready
-					? ready_lastpos (&ready) : NULL,
-					&ready.n_ready, clock_var);
-	    }
+	    prune_ready_list (temp_state, false);
 	}
     }
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 2/11: Use a structure for schedule_block variables
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
  2011-05-10 15:38 ` C6X port 1/11: Reorganize schedule_block Bernd Schmidt
@ 2011-05-10 15:40 ` Bernd Schmidt
  2011-05-10 15:41 ` C6X port 3/11: Cache dependency costs Bernd Schmidt
                   ` (14 subsequent siblings)
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:40 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 151 bytes --]

This moves some local variables into a structure, in preparation for a
later patch which adds the capability to save/restore scheduler state.


Bernd


[-- Attachment #2: hs-ls.diff --]
[-- Type: text/plain, Size: 4239 bytes --]

	* haifa-sched.c (struct sched_block_state): New.
	(schedule_block): Move some local variables into such a structure.

Index: gcc/haifa-sched.c
===================================================================
--- gcc.orig/haifa-sched.c
+++ gcc/haifa-sched.c
@@ -1635,6 +1635,16 @@ sched_setup_bb_reg_pressure_info (basic_
   initiate_bb_reg_pressure_info (bb);
   setup_insn_max_reg_pressure (after, false);
 }
+\f
+/* A structure that holds local state for the loop in schedule_block.  */
+struct sched_block_state
+{
+  /* True if no real insns have been scheduled in the current cycle.  */
+  bool first_cycle_insn_p;
+  /* Initialized with the machine's issue rate every cycle, and updated
+     by calls to the variable_issue hook.  */
+  int can_issue_more;
+};
 
 /* INSN is the "currently executing insn".  Launch each insn which was
    waiting on INSN.  READY is the ready list which contains the insns
@@ -2920,8 +2930,7 @@ void
 schedule_block (basic_block *target_bb)
 {
   int i;
-  bool first_cycle_insn_p;
-  int can_issue_more;
+  struct sched_block_state ls;
   state_t temp_state = NULL;  /* It is used for multipass scheduling.  */
   int sort_p, advance, start_clock_var;
 
@@ -3071,9 +3080,9 @@ schedule_block (basic_block *target_bb)
       if (ready.n_ready == 0)
 	continue;
 
-      first_cycle_insn_p = true;
+      ls.first_cycle_insn_p = true;
       cycle_issued_insns = 0;
-      can_issue_more = issue_rate;
+      ls.can_issue_more = issue_rate;
       for (;;)
 	{
 	  rtx insn;
@@ -3114,7 +3123,7 @@ schedule_block (basic_block *target_bb)
 		}
 	    }
 
-	  if (first_cycle_insn_p && !ready.n_ready)
+	  if (ls.first_cycle_insn_p && !ready.n_ready)
 	    break;
 
 	  /* Allow the target to reorder the list, typically for
@@ -3123,13 +3132,13 @@ schedule_block (basic_block *target_bb)
 	      && (ready.n_ready == 0
 		  || !SCHED_GROUP_P (ready_element (&ready, 0))))
 	    {
-	      if (first_cycle_insn_p && targetm.sched.reorder)
-		can_issue_more
+	      if (ls.first_cycle_insn_p && targetm.sched.reorder)
+		ls.can_issue_more
 		  = targetm.sched.reorder (sched_dump, sched_verbose,
 					   ready_lastpos (&ready),
 					   &ready.n_ready, clock_var);
-	      else if (!first_cycle_insn_p && targetm.sched.reorder2)
-		can_issue_more
+	      else if (!ls.first_cycle_insn_p && targetm.sched.reorder2)
+		ls.can_issue_more
 		  = targetm.sched.reorder2 (sched_dump, sched_verbose,
 					    ready.n_ready
 					    ? ready_lastpos (&ready) : NULL,
@@ -3147,7 +3156,7 @@ schedule_block (basic_block *target_bb)
 	    }
 
 	  if (ready.n_ready == 0
-	      && can_issue_more
+	      && ls.can_issue_more
 	      && reload_completed)
 	    {
 	      /* Allow scheduling insns directly from the queue in case
@@ -3161,7 +3170,7 @@ schedule_block (basic_block *target_bb)
 	    }
 
 	  if (ready.n_ready == 0
-	      || !can_issue_more
+	      || !ls.can_issue_more
 	      || state_dead_lock_p (curr_state)
 	      || !(*current_sched_info->schedule_more_p) ())
 	    break;
@@ -3172,7 +3181,7 @@ schedule_block (basic_block *target_bb)
 	      int res;
 
 	      insn = NULL_RTX;
-	      res = choose_ready (&ready, first_cycle_insn_p, &insn);
+	      res = choose_ready (&ready, ls.first_cycle_insn_p, &insn);
 
 	      if (res < 0)
 		/* Finish cycle.  */
@@ -3252,14 +3261,14 @@ schedule_block (basic_block *target_bb)
 		     || asm_noperands (PATTERN (insn)) >= 0);
 
 	  if (targetm.sched.variable_issue)
-	    can_issue_more =
+	    ls.can_issue_more =
 	      targetm.sched.variable_issue (sched_dump, sched_verbose,
-					    insn, can_issue_more);
+					    insn, ls.can_issue_more);
 	  /* A naked CLOBBER or USE generates no instruction, so do
 	     not count them against the issue rate.  */
 	  else if (GET_CODE (PATTERN (insn)) != USE
 		   && GET_CODE (PATTERN (insn)) != CLOBBER)
-	    can_issue_more--;
+	    ls.can_issue_more--;
 	  advance = schedule_insn (insn);
 
 	  /* After issuing an asm insn we should start a new cycle.  */
@@ -3268,7 +3277,7 @@ schedule_block (basic_block *target_bb)
 	  if (advance != 0)
 	    break;
 
-	  first_cycle_insn_p = false;
+	  ls.first_cycle_insn_p = false;
 	  if (ready.n_ready > 0)
 	    prune_ready_list (temp_state, false);
 	}

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 3/11: Cache dependency costs
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
  2011-05-10 15:38 ` C6X port 1/11: Reorganize schedule_block Bernd Schmidt
  2011-05-10 15:40 ` C6X port 2/11: Use a structure for schedule_block variables Bernd Schmidt
@ 2011-05-10 15:41 ` Bernd Schmidt
  2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
                   ` (13 subsequent siblings)
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:41 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 167 bytes --]

Jeff already approved this one a while ago. I haven't applied it yet
because so far it hasn't been necessary, but it will help for the
backtracking scheduler.


Bernd

[-- Attachment #2: depcost.diff --]
[-- Type: text/plain, Size: 2414 bytes --]

	* sched-int.h (struct _dep): Add member cost.
	(DEP_COST, UNKNOWN_DEP_COST): New macros.
	* sched-deps.c (init_dep_1): Initialize DEP_COST.
	* haifa-sched.c (dep_cost_1): Use and set DEP_COST.

Index: gcc/haifa-sched.c
===================================================================
--- gcc.orig/haifa-sched.c
+++ gcc/haifa-sched.c
@@ -855,6 +855,9 @@ dep_cost_1 (dep_t link, dw_t dw)
   rtx used = DEP_CON (link);
   int cost;
 
+  if (DEP_COST (link) != UNKNOWN_DEP_COST)
+    return DEP_COST (link);
+
   /* A USE insn should never require the value used to be computed.
      This allows the computation of a function's result and parameter
      values to overlap the return and call.  We don't care about the
@@ -912,6 +915,7 @@ dep_cost_1 (dep_t link, dw_t dw)
 	cost = 0;
     }
 
+  DEP_COST (link) = cost;
   return cost;
 }
 
@@ -4874,11 +4878,20 @@ fix_recovery_deps (basic_block rec)
 void
 sched_change_pattern (rtx insn, rtx new_pat)
 {
+  sd_iterator_def sd_it;
+  dep_t dep;
   int t;
 
   t = validate_change (insn, &PATTERN (insn), new_pat, 0);
   gcc_assert (t);
   dfa_clear_single_insn_cache (insn);
+
+  for (sd_it = sd_iterator_start (insn, SD_LIST_FORW | SD_LIST_BACK);
+       sd_iterator_cond (&sd_it, &dep);)
+    {
+      DEP_COST (dep) = UNKNOWN_DEP_COST;
+      sd_iterator_next (&sd_it);
+    }
 }
 
 /* Change pattern of INSN to NEW_PAT.  Invalidate cached haifa
Index: gcc/sched-deps.c
===================================================================
--- gcc.orig/sched-deps.c
+++ gcc/sched-deps.c
@@ -107,6 +107,7 @@ init_dep_1 (dep_t dep, rtx pro, rtx con,
   DEP_CON (dep) = con;
   DEP_TYPE (dep) = type;
   DEP_STATUS (dep) = ds;
+  DEP_COST (dep) = UNKNOWN_DEP_COST;
 }
 
 /* Init DEP with the arguments.
Index: gcc/sched-int.h
===================================================================
--- gcc.orig/sched-int.h
+++ gcc/sched-int.h
@@ -239,6 +239,9 @@ struct _dep
   /* Dependency status.  This field holds all dependency types and additional
      information for speculative dependencies.  */
   ds_t status;
+
+  /* Cached cost of the dependency.  */
+  int cost;
 };
 
 typedef struct _dep dep_def;
@@ -248,6 +251,9 @@ typedef dep_def *dep_t;
 #define DEP_CON(D) ((D)->con)
 #define DEP_TYPE(D) ((D)->type)
 #define DEP_STATUS(D) ((D)->status)
+#define DEP_COST(D) ((D)->cost)
+
+#define UNKNOWN_DEP_COST INT_MIN
 
 /* Functions to work with dep.  */
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 4/11: Backtracking scheduler
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (2 preceding siblings ...)
  2011-05-10 15:41 ` C6X port 3/11: Cache dependency costs Bernd Schmidt
@ 2011-05-10 15:48 ` Bernd Schmidt
  2011-05-11  9:14   ` Richard Sandiford
  2011-05-25 10:16   ` Hans-Peter Nilsson
  2011-05-10 15:54 ` C6X port 5/11: Track predication conditions more accurately Bernd Schmidt
                   ` (12 subsequent siblings)
  16 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:48 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 3175 bytes --]

On C6X, every jump instruction has 5 delay slots which can be filled
with normally scheduled instructions. With an issue width of 8
insns/cycle, this means that up to 40 insns can be issued after the jump
insn before the jump's side-effect takes place. I didn't particularaly
feel like using reorg.c to deal with this, hence these scheduler patches.

Conceptually, one can think of the dependency between the two instructions

	mv .l1	a1, a4    ; set the first function argument
	call	somewhere

as a true dependence with cost -5, meaning that the first instruction
has to be scheduled no later than 5 cycles after the call. We can extend
the scheduler to issue the call when only such negative-cost
dependencies are left, but generally there is no way of knowing in
advance whether it will be possible to schedule all the remaining
dependencies in the 5 cycles following it. This means we have to
backtrack to a previous state when we find that we got into a state
where it is not possible to generate a valid schedule.

The papers I looked at all seemed to use this model of negative-cost
dependencies, and that's what I implemented first. It kind of worked,
except that the RTL was meaningless after the scheduling pass - you
could have unconditional jumps followed by instructions which would
appear dead to any other consumer of RTL. Unfortunately, the scheduling
pass isn't quite the last thing that runs - var_tracking happens
afterwards, and it gets terminally confused by such bogus RTL, which
means the whole scheme only works as long as one doesn't try to produce
debug output.

Because of this problem, I've chosen a different model for this patch.
Before calling the final sched_ebb pass, the port must split jump insns
(or anything that should have delay slots) into two separate insns, a
real insn and a shadow. As an example,

 (jump_insn (set (pc) (label_ref 24)))

becomes

 (insn (unspec [(label_ref 24)] UNSPEC_REAL_JUMP)
 (jump_insn (set (pc) (unspec [(pc)] UNSPEC_JUMP_SHADOW)

where the first insn emits the branch into the assembly file, while the
second one produces no output (or, in the case of C6X, a helpful comment
that documents that the side effect takes place). For each such pair, a
new function in haifa-sched.c should be called to record the two insns
and the number of delay slots. The scheduler then ensures that these are
scheduled with the prescribed distance in cycles, and that the shadow
insn(s) are the last to occur in their cycle (see the shadows_only_p
mechanism).

This model allows us to leave the dependencies looking rather natural -
e.g. everything that shouldn't cross a jump will depend on the branch
shadow, rather than having a dependence with negative cost on the real
branch.

On C6X, other instructions than jumps (e.g. loads and multiplies) also
have delay slots, but we can't make use of them in normal code since
only for jumps does the CPU ensure that code is interrupt-safe. However,
when using the SPLOOP instruction for hardware-pipelined loops, we can
make use of this as well. This will be part of a future patch which
extends the mechanism to do modulo scheduling using the C6X SPLOOP
instruction.


Bernd

[-- Attachment #2: btsched.diff --]
[-- Type: text/plain, Size: 42837 bytes --]

	* haifa-sched.c: Include "hashtab.h"
	(sched_no_dce): New global variable.
	(INSN_EXACT_TICK, INSN_TICK_ESTIMATE, FEEDS_BACKTRACK_INSN,
	SHADOW_P): New macros.
	(last_clock_var, cycle_issued_insns): Move declarations.
	(must_backtrack): New static variable.
	(struct delay_pair): New structure.
	(delay_htab, delay_htab_i2): New static variables.
	(delay_hash_i1, delay_hash_i2, delay_i1_eq, delay_i2_eq,
	record_delay_slot_pair, pair_delay, add_delay_dependencies): New
	functions.
	(dep_cost_1): If delay pairs exist, try to look up the insns and
	use the correct pair delay if we find them.
	(rank-for_schedule): Tweak priority for insns that must be scheduled
	soon to avoid backtracking.
	(queue_insn): Detect conditions which force backtracking.
	(ready_add): Likewise.
	(struct sched_block_state): Add member shadows_only_p.
	(struct haifa_save_data): New structure.
	(backtrack_queue): New static variable.
	(mark_backtrack_feeds, copy_insn_list, save_backtrack_point,
	unschedule_insns_until, restore_last_backtrack_point,
	free_topmost_backtrack_point, free_backtrack_queue,
	estimate_insn_tick, estimate_shadow_tick): New functions.
	(prune_ready_list): New arg shadows_only_p.  All callers changed.
	If true, remove everything that isn't SHADOW_P.  Look up delay
	pairs and estimate ticks to avoid scheduling the first insn too
	early.
	(verify_shadows): New function.
	(schedule_block): Add machinery to enable backtracking.
	(sched_init): Take sched_no_dce into account when setting
	DF_LR_RUN_DCE.
	(free_delay_pairs): New function.
	(init_h_i_d): Initialize INSN_EXACT_TICK.
	* Makefile.in (haifa-sched.o): Add $(HASHTAB_H).
	* sched-deps.c (sd_unresolve_dep): New function.
	* sched-int. (struct haifa_sched_info): New fields save_state
	and restore_state.
	(struct _haifa_insn_data): New fields exact_tick, tick_estiamte,
	feeds_backtrack_insn and shadow_p.
	(DO_BACKTRACKING): New value in enum SCHED_FLAGS.
	(sched_no_dce): Declare variable.
	(record_delay_slot_pair, free_delay_pairs, add_delay_dependencies,
	sd_unresolve_dep): Declare functions.
	* modulo-sched.c (sms_sched_info): Clear the two new fields.
	* sched-rgn.c (rgn_const_sched_info): Likewise.
	* sel-sched-ir.c (sched_sel_haifa_sched_info): Likewise.
	* sched-ebb.c (save_ebb_state, restore_ebb_state): New functions.
	(ebb_sched_info): Add them for the two new fields.
	(add_deps_for_risky_insns): Call add_delay_dependencies.
	
Index: gcc/haifa-sched.c
===================================================================
--- gcc.orig/haifa-sched.c
+++ gcc/haifa-sched.c
@@ -148,6 +148,7 @@ along with GCC; see the file COPYING3.
 #include "cfgloop.h"
 #include "ira.h"
 #include "emit-rtl.h"  /* FIXME: Can go away once crtl is moved to rtl.h.  */
+#include "hashtab.h"
 
 #ifdef INSN_SCHEDULING
 
@@ -157,6 +158,10 @@ along with GCC; see the file COPYING3.
 
 int issue_rate;
 
+/* This can be set to true by a backend if the scheduler should not
+   enable a DCE pass.  */
+bool sched_no_dce;
+
 /* sched-verbose controls the amount of debugging output the
    scheduler prints.  It is controlled by -fsched-verbose=N:
    N>0 and no -DSR : the output is directed to stderr.
@@ -177,7 +182,11 @@ FILE *sched_dump = 0;
 struct common_sched_info_def *common_sched_info;
 
 #define INSN_TICK(INSN)	(HID (INSN)->tick)
+#define INSN_EXACT_TICK(INSN) (HID (INSN)->exact_tick)
+#define INSN_TICK_ESTIMATE(INSN) (HID (INSN)->tick_estimate)
 #define INTER_TICK(INSN) (HID (INSN)->inter_tick)
+#define FEEDS_BACKTRACK_INSN(INSN) (HID (INSN)->feeds_backtrack_insn)
+#define SHADOW_P(INSN) (HID (INSN)->shadow_p)
 
 /* If INSN_TICK of an instruction is equal to INVALID_TICK,
    then it should be recalculated from scratch.  */
@@ -302,6 +311,18 @@ static struct ready_list *readyp = &read
 /* Scheduling clock.  */
 static int clock_var;
 
+/* Clock at which the previous instruction was issued.  */
+static int last_clock_var;
+
+/* Set to true if, when queuing a shadow insn, we discover that it would be
+   scheduled too late.  */
+static bool must_backtrack;
+
+/* The following variable value is number of essential insns issued on
+   the current cycle.  An insn is essential one if it changes the
+   processors state.  */
+int cycle_issued_insns;
+
 /* This records the actual schedule.  It is built up during the main phase
    of schedule_block, and afterwards used to reorder the insns in the RTL.  */
 static VEC(rtx, heap) *scheduled_insns;
@@ -488,6 +509,147 @@ haifa_classify_insn (const_rtx insn)
   return haifa_classify_rtx (PATTERN (insn));
 }
 
+/* A structure to record a pair of insns where the first one is a real
+   insn that has delay slots, and the second is its delayed shadow.
+   I1 is scheduled normally and will emit an assembly instruction,
+   while I2 describes the side effect that takes place at the
+   transition between cycles CYCLES and (CYCLES + 1) after I1.  */
+struct delay_pair
+{
+  struct delay_pair *next_same_i1;
+  rtx i1, i2;
+  int cycles;
+};
+
+/* Two hash tables to record delay_pairs, one indexed by I1 and the other
+   indexed by I2.  */
+static htab_t delay_htab;
+static htab_t delay_htab_i2;
+
+/* Returns a hash value for X (which really is a delay_pair), based on
+   hashing just I1.  */
+static hashval_t
+delay_hash_i1 (const void *x)
+{
+  return htab_hash_pointer (((const struct delay_pair *) x)->i1);
+}
+
+/* Returns a hash value for X (which really is a delay_pair), based on
+   hashing just I2.  */
+static hashval_t
+delay_hash_i2 (const void *x)
+{
+  return htab_hash_pointer (((const struct delay_pair *) x)->i2);
+}
+
+/* Return nonzero if I1 of pair X is the same as that of pair Y.  */
+static int
+delay_i1_eq (const void *x, const void *y)
+{
+  return ((const struct delay_pair *) x)->i1 == y;
+}
+
+/* Return nonzero if I2 of pair X is the same as that of pair Y.  */
+static int
+delay_i2_eq (const void *x, const void *y)
+{
+  return ((const struct delay_pair *) x)->i2 == y;
+}
+
+/* This function can be called by a port just before it starts the
+   final scheduling pass.  It records the fact that an instruction
+   with delay slots has been split into two insns, I1 and I2.  The
+   first one will be scheduled normally and initiates the operation.
+   The second one is a shadow which must follow a specific number of
+   CYCLES after I1; its only purpose is to show the side effect that
+   occurs at that cycle in the RTL.  If a JUMP_INSN or a CALL_INSN has
+   been split, I1 should be a normal INSN, while I2 retains the
+   original insn type.  */
+
+void
+record_delay_slot_pair (rtx i1, rtx i2, int cycles)
+{
+  struct delay_pair *p = XNEW (struct delay_pair);
+  struct delay_pair **slot;
+
+  p->i1 = i1;
+  p->i2 = i2;
+  p->cycles = cycles;
+
+  if (!delay_htab)
+    {
+      delay_htab = htab_create (10, delay_hash_i1, delay_i1_eq, NULL);
+      delay_htab_i2 = htab_create (10, delay_hash_i2, delay_i2_eq, free);
+    }
+  slot = ((struct delay_pair **)
+	  htab_find_slot_with_hash (delay_htab, i1, htab_hash_pointer (i1),
+				    INSERT));
+  p->next_same_i1 = *slot;
+  *slot = p;
+  slot = ((struct delay_pair **)
+	  htab_find_slot_with_hash (delay_htab_i2, i2, htab_hash_pointer (i2),
+				    INSERT));
+  *slot = p;
+}
+
+/* For a pair P of insns, return the fixed distance in cycles from the first
+   insn after which the second must be scheduled.  */
+static int
+pair_delay (struct delay_pair *p)
+{
+  return p->cycles;
+}
+
+/* Given an insn INSN, add a dependence on its delayed shadow if it
+   has one.  Also try to find situations where shadows depend on each other
+   and add dependencies to the real insns to limit the amount of backtracking
+   needed.  */
+void
+add_delay_dependencies (rtx insn)
+{
+  struct delay_pair *pair;
+  sd_iterator_def sd_it;
+  dep_t dep;
+
+  if (!delay_htab)
+    return;
+
+  pair
+    = (struct delay_pair *)htab_find_with_hash (delay_htab_i2, insn,
+						htab_hash_pointer (insn));
+  if (!pair)
+    return;
+  add_dependence (insn, pair->i1, REG_DEP_ANTI);
+
+  FOR_EACH_DEP (pair->i2, SD_LIST_BACK, sd_it, dep)
+    {
+      rtx pro = DEP_PRO (dep);
+      struct delay_pair *other_pair
+	= (struct delay_pair *)htab_find_with_hash (delay_htab_i2, pro,
+						    htab_hash_pointer (pro));
+      if (!other_pair)
+	continue;
+      if (pair_delay (other_pair) >= pair_delay (pair))
+	{
+	  if (sched_verbose >= 4)
+	    {
+	      fprintf (sched_dump, ";;\tadding dependence %d <- %d\n",
+		       INSN_UID (other_pair->i1),
+		       INSN_UID (pair->i1));
+	      fprintf (sched_dump, ";;\tpair1 %d <- %d, cost %d\n",
+		       INSN_UID (pair->i1),
+		       INSN_UID (pair->i2),
+		       pair_delay (pair));
+	      fprintf (sched_dump, ";;\tpair2 %d <- %d, cost %d\n",
+		       INSN_UID (other_pair->i1),
+		       INSN_UID (other_pair->i2),
+		       pair_delay (other_pair));
+	    }
+	  add_dependence (pair->i1, other_pair->i1, REG_DEP_ANTI);
+	}
+    }
+}
+\f
 /* Forward declarations.  */
 
 static int priority (rtx);
@@ -858,6 +1020,22 @@ dep_cost_1 (dep_t link, dw_t dw)
   if (DEP_COST (link) != UNKNOWN_DEP_COST)
     return DEP_COST (link);
 
+  if (delay_htab)
+    {
+      struct delay_pair *delay_entry;
+      delay_entry
+	= (struct delay_pair *)htab_find_with_hash (delay_htab_i2, used,
+						    htab_hash_pointer (used));
+      if (delay_entry)
+	{
+	  if (delay_entry->i1 == insn)
+	    {
+	      DEP_COST (link) = pair_delay (delay_entry);
+	      return DEP_COST (link);
+	    }
+	}
+    }
+
   /* A USE insn should never require the value used to be computed.
      This allows the computation of a function's result and parameter
      values to overlap the return and call.  We don't care about the
@@ -1214,6 +1392,17 @@ rank_for_schedule (const void *x, const
       else
 	return INSN_TICK (tmp) - INSN_TICK (tmp2);
     }
+
+  /* If we are doing backtracking in this schedule, prefer insns that
+     have forward dependencies with negative cost against an insn that
+     was already scheduled.  */
+  if (current_sched_info->flags & DO_BACKTRACKING)
+    {
+      priority_val = FEEDS_BACKTRACK_INSN (tmp2) - FEEDS_BACKTRACK_INSN (tmp);
+      if (priority_val)
+	return priority_val;
+    }
+
   /* Prefer insn with higher priority.  */
   priority_val = INSN_PRIORITY (tmp2) - INSN_PRIORITY (tmp);
 
@@ -1326,6 +1515,7 @@ queue_insn (rtx insn, int n_cycles, cons
 {
   int next_q = NEXT_Q_AFTER (q_ptr, n_cycles);
   rtx link = alloc_INSN_LIST (insn, insn_queue[next_q]);
+  int new_tick;
 
   gcc_assert (n_cycles <= max_insn_queue_index);
   gcc_assert (!DEBUG_INSN_P (insn));
@@ -1342,6 +1532,21 @@ queue_insn (rtx insn, int n_cycles, cons
     }
 
   QUEUE_INDEX (insn) = next_q;
+
+  if (current_sched_info->flags & DO_BACKTRACKING)
+    {
+      new_tick = clock_var + n_cycles;
+      if (INSN_TICK (insn) == INVALID_TICK || INSN_TICK (insn) < new_tick)
+	INSN_TICK (insn) = new_tick;
+
+      if (INSN_EXACT_TICK (insn) != INVALID_TICK
+	  && INSN_EXACT_TICK (insn) < clock_var + n_cycles)
+	{
+	  must_backtrack = true;
+	  if (sched_verbose >= 2)
+	    fprintf (sched_dump, ";;\t\tcausing a backtrack.\n");
+	}
+    }
 }
 
 /* Remove INSN from queue.  */
@@ -1401,6 +1606,12 @@ ready_add (struct ready_list *ready, rtx
 
   gcc_assert (QUEUE_INDEX (insn) != QUEUE_READY);
   QUEUE_INDEX (insn) = QUEUE_READY;
+
+  if (INSN_EXACT_TICK (insn) != INVALID_TICK
+      && INSN_EXACT_TICK (insn) < clock_var)
+    {
+      must_backtrack = true;
+    }
 }
 
 /* Remove the element with the highest priority from the ready list and
@@ -1547,9 +1758,6 @@ advance_one_cycle (void)
     fprintf (sched_dump, ";;\tAdvanced a state.\n");
 }
 
-/* Clock at which the previous instruction was issued.  */
-static int last_clock_var;
-
 /* Update register pressure after scheduling INSN.  */
 static void
 update_register_pressure (rtx insn)
@@ -1645,6 +1853,9 @@ struct sched_block_state
 {
   /* True if no real insns have been scheduled in the current cycle.  */
   bool first_cycle_insn_p;
+  /* True if a shadow insn has been scheduled in the current cycle, which
+     means that no more normal insns can be issued.  */
+  bool shadows_only_p;
   /* Initialized with the machine's issue rate every cycle, and updated
      by calls to the variable_issue hook.  */
   int can_issue_more;
@@ -1901,6 +2112,372 @@ remove_notes (rtx head, rtx tail)
     }
 }
 
+/* A structure to record enough data to allow us to backtrack the scheduler to
+   a previous state.  */
+struct haifa_saved_data
+{
+  /* Next entry on the list.  */
+  struct haifa_saved_data *next;
+
+  /* Backtracking is associated with scheduling insns that have delay slots.
+     DELAY_PAIR points to the structure that contains the insns involved, and
+     the number of cycles between them.  */
+  struct delay_pair *delay_pair;
+
+  /* Data used by the frontend (e.g. sched-ebb or sched-rgn).  */
+  void *fe_saved_data;
+  /* Data used by the backend.  */
+  void *be_saved_data;
+
+  /* Copies of global state.  */
+  int clock_var, last_clock_var;
+  struct ready_list ready;
+  state_t curr_state;
+
+  rtx last_scheduled_insn;
+  rtx last_nondebug_scheduled_insn;
+  int cycle_issued_insns;
+
+  /* Copies of state used in the inner loop of schedule_block.  */
+  struct sched_block_state sched_block;
+
+  /* We don't need to save q_ptr, as its value is arbitrary and we can set it
+     to 0 when restoring.  */
+  int q_size;
+  rtx *insn_queue;
+};
+
+/* A record, in reverse order, of all scheduled insns which have delay slots
+   and may require backtracking.  */
+static struct haifa_saved_data *backtrack_queue;
+
+/* For every dependency of INSN, set the FEEDS_BACKTRACK_INSN bit according
+   to SET_P.  */
+static void
+mark_backtrack_feeds (rtx insn, int set_p)
+{
+  sd_iterator_def sd_it;
+  dep_t dep;
+  FOR_EACH_DEP (insn, SD_LIST_HARD_BACK, sd_it, dep)
+    {
+      FEEDS_BACKTRACK_INSN (DEP_PRO (dep)) = set_p;
+    }
+}
+
+/* Make a copy of the INSN_LIST list LINK and return it.  */
+static rtx
+copy_insn_list (rtx link)
+{
+  rtx new_queue;
+  rtx *pqueue = &new_queue;
+
+  for (; link; link = XEXP (link, 1))
+    {
+      rtx x = XEXP (link, 0);
+      rtx newlink = alloc_INSN_LIST (x, NULL);
+      *pqueue = newlink;
+      pqueue = &XEXP (newlink, 1);
+    }
+  *pqueue = NULL_RTX;
+  return new_queue;
+}
+
+/* Save the current scheduler state so that we can backtrack to it
+   later if necessary.  PAIR gives the insns that make it necessary to
+   save this point.  SCHED_BLOCK is the local state of schedule_block
+   that need to be saved.  */
+static void
+save_backtrack_point (struct delay_pair *pair,
+		      struct sched_block_state sched_block)
+{
+  int i;
+  struct haifa_saved_data *save = XNEW (struct haifa_saved_data);
+
+  save->curr_state = xmalloc (dfa_state_size);
+  memcpy (save->curr_state, curr_state, dfa_state_size);
+
+  save->ready.first = ready.first;
+  save->ready.n_ready = ready.n_ready;
+  save->ready.n_debug = ready.n_debug;
+  save->ready.veclen = ready.veclen;
+  save->ready.vec = XNEWVEC (rtx, ready.veclen);
+  memcpy (save->ready.vec, ready.vec, ready.veclen * sizeof (rtx));
+
+  save->insn_queue = XNEWVEC (rtx, max_insn_queue_index + 1);
+  save->q_size = q_size;
+  for (i = 0; i <= max_insn_queue_index; i++)
+    {
+      int q = NEXT_Q_AFTER (q_ptr, i);
+      save->insn_queue[i] = copy_insn_list (insn_queue[q]);
+    }
+
+  save->clock_var = clock_var;
+  save->last_clock_var = last_clock_var;
+  save->cycle_issued_insns = cycle_issued_insns;
+  save->last_scheduled_insn = last_scheduled_insn;
+  save->last_nondebug_scheduled_insn = last_nondebug_scheduled_insn;
+
+  save->sched_block = sched_block;
+
+  if (current_sched_info->save_state)
+    save->fe_saved_data = (*current_sched_info->save_state) ();
+
+  if (targetm.sched.alloc_sched_context)
+    {
+      save->be_saved_data = targetm.sched.alloc_sched_context ();
+      targetm.sched.init_sched_context (save->be_saved_data, false);
+    }
+  else
+    save->be_saved_data = NULL;
+
+  save->delay_pair = pair;
+
+  save->next = backtrack_queue;
+  backtrack_queue = save;
+
+  while (pair)
+    {
+      mark_backtrack_feeds (pair->i2, 1);
+      INSN_TICK (pair->i2) = INVALID_TICK;
+      INSN_EXACT_TICK (pair->i2) = clock_var + pair_delay (pair);
+      SHADOW_P (pair->i2) = true;
+      pair = pair->next_same_i1;
+    }
+}
+
+/* Pop entries from the SCHEDULED_INSNS vector up to and including INSN.
+   Restore their dependencies to an unresolved state, and mark them as
+   queued nowhere.  */
+
+static void
+unschedule_insns_until (rtx insn)
+{
+  for (;;)
+    {
+      rtx last;
+      sd_iterator_def sd_it;
+      dep_t dep;
+
+      last = VEC_pop (rtx, scheduled_insns);
+
+      /* This will be changed by restore_backtrack_point if the insn is in
+	 any queue.  */
+      QUEUE_INDEX (last) = QUEUE_NOWHERE;
+      if (last != insn)
+	INSN_TICK (last) = INVALID_TICK;
+
+      for (sd_it = sd_iterator_start (last, SD_LIST_RES_FORW);
+	   sd_iterator_cond (&sd_it, &dep);)
+	{
+	  rtx con = DEP_CON (dep);
+	  TODO_SPEC (con) |= HARD_DEP;
+	  INSN_TICK (con) = INVALID_TICK;
+	  sd_unresolve_dep (sd_it);
+	}
+
+      if (last == insn)
+	break;
+    }
+}
+
+/* Restore scheduler state from the topmost entry on the backtracking queue.
+   PSCHED_BLOCK_P points to the local data of schedule_block that we must
+   overwrite with the saved data.
+   The caller must already have called unschedule_insns_until.  */
+
+static void
+restore_last_backtrack_point (struct sched_block_state *psched_block)
+
+{
+  rtx link;
+  int i;
+  struct haifa_saved_data *save = backtrack_queue;
+
+  backtrack_queue = save->next;
+
+  if (current_sched_info->restore_state)
+    (*current_sched_info->restore_state) (save->fe_saved_data);
+
+  if (targetm.sched.alloc_sched_context)
+    {
+      targetm.sched.set_sched_context (save->be_saved_data);
+      targetm.sched.free_sched_context (save->be_saved_data);
+    }
+
+  /* Clear the QUEUE_INDEX of everything in the ready list or one
+     of the queues.  */
+  if (ready.n_ready > 0)
+    {
+      rtx *first = ready_lastpos (&ready);
+      for (i = 0; i < ready.n_ready; i++)
+	{
+	  QUEUE_INDEX (first[i]) = QUEUE_NOWHERE;
+	  INSN_TICK (first[i]) = INVALID_TICK;
+	}
+    }
+  for (i = 0; i <= max_insn_queue_index; i++)
+    {
+      int q = NEXT_Q_AFTER (q_ptr, i);
+
+      for (link = insn_queue[q]; link; link = XEXP (link, 1))
+	{
+	  rtx x = XEXP (link, 0);
+	  QUEUE_INDEX (x) = QUEUE_NOWHERE;
+	  INSN_TICK (x) = INVALID_TICK;
+	}
+      free_INSN_LIST_list (&insn_queue[q]);
+    }
+
+  free (ready.vec);
+  ready = save->ready;
+
+  if (ready.n_ready > 0)
+    {
+      rtx *first = ready_lastpos (&ready);
+      for (i = 0; i < ready.n_ready; i++)
+	{
+	  QUEUE_INDEX (first[i]) = QUEUE_READY;
+	  INSN_TICK (first[i]) = save->clock_var;
+	}
+    }
+
+  q_ptr = 0;
+  q_size = save->q_size;
+  for (i = 0; i <= max_insn_queue_index; i++)
+    {
+      int q = NEXT_Q_AFTER (q_ptr, i);
+
+      insn_queue[q] = save->insn_queue[q];
+
+      for (link = insn_queue[q]; link; link = XEXP (link, 1))
+	{
+	  rtx x = XEXP (link, 0);
+	  QUEUE_INDEX (x) = i;
+	  INSN_TICK (x) = save->clock_var + i;
+	}
+    }
+  free (save->insn_queue);
+
+  clock_var = save->clock_var;
+  last_clock_var = save->last_clock_var;
+  cycle_issued_insns = save->cycle_issued_insns;
+  last_scheduled_insn = save->last_scheduled_insn;
+  last_nondebug_scheduled_insn = save->last_nondebug_scheduled_insn;
+
+  *psched_block = save->sched_block;
+
+  memcpy (curr_state, save->curr_state, dfa_state_size);
+  free (save->curr_state);
+
+  mark_backtrack_feeds (save->delay_pair->i2, 0);
+
+  free (save);
+
+  for (save = backtrack_queue; save; save = save->next)
+    {
+      mark_backtrack_feeds (save->delay_pair->i2, 1);
+    }
+}
+
+/* Discard all data associated with the topmost entry in the backtrack
+   queue.  If RESET_TICK is false, we just want to free the data.  If true,
+   we are doing this because we discovered a reason to backtrack.  In the
+   latter case, also reset the INSN_TICK for the shadow insn.  */
+static void
+free_topmost_backtrack_point (bool reset_tick)
+{
+  struct haifa_saved_data *save = backtrack_queue;
+  int i;
+
+  backtrack_queue = save->next;
+
+  if (reset_tick)
+    {
+      struct delay_pair *pair = save->delay_pair;
+      while (pair)
+	{
+	  INSN_TICK (pair->i2) = INVALID_TICK;
+	  INSN_EXACT_TICK (pair->i2) = INVALID_TICK;
+	  pair = pair->next_same_i1;
+	}
+    }
+  if (targetm.sched.free_sched_context)
+    targetm.sched.free_sched_context (save->be_saved_data);
+  if (current_sched_info->restore_state)
+    free (save->fe_saved_data);
+  for (i = 0; i <= max_insn_queue_index; i++)
+    free_INSN_LIST_list (&save->insn_queue[i]);
+  free (save->insn_queue);
+  free (save->curr_state);
+  free (save->ready.vec);
+  free (save);
+}
+
+/* Free the entire backtrack queue.  */
+static void
+free_backtrack_queue (void)
+{
+  while (backtrack_queue)
+    free_topmost_backtrack_point (false);
+}
+
+static bool
+estimate_insn_tick (bitmap processed, rtx insn, int budget)
+{
+  sd_iterator_def sd_it;
+  dep_t dep;
+  int earliest = INSN_TICK (insn);
+
+  FOR_EACH_DEP (insn, SD_LIST_BACK, sd_it, dep)
+    {
+      rtx pro = DEP_PRO (dep);
+      int t;
+
+      if (QUEUE_INDEX (pro) == QUEUE_SCHEDULED)
+	gcc_assert (INSN_TICK (pro) + dep_cost (dep) <= INSN_TICK (insn));
+      else
+	{
+	  int cost = dep_cost (dep);
+	  if (cost >= budget)
+	    return false;
+	  if (!bitmap_bit_p (processed, INSN_LUID (pro)))
+	    {
+	      if (!estimate_insn_tick (processed, pro, budget - cost))
+		return false;
+	    }
+	  gcc_assert (INSN_TICK_ESTIMATE (pro) != INVALID_TICK);
+	  t = INSN_TICK_ESTIMATE (pro) + cost;
+	  if (earliest == INVALID_TICK || t > earliest)
+	    earliest = t;
+	}
+    }
+  bitmap_set_bit (processed, INSN_LUID (insn));
+  INSN_TICK_ESTIMATE (insn) = earliest;
+  return true;
+}
+
+/* Examine the pair of insns in P, and estimate (optimistically, assuming
+   infinite resources) the cycle in which the delayed shadow can be issued.
+   Return the number of cycles that must pass before the real insn can be
+   issued in order to meet this constraint.  */
+static int
+estimate_shadow_tick (struct delay_pair *p)
+{
+  bitmap_head processed;
+  int t;
+  bool cutoff;
+  bitmap_initialize (&processed, 0);
+
+  cutoff = !estimate_insn_tick (&processed, p->i2,
+				max_insn_queue_index + pair_delay (p));
+  bitmap_clear (&processed);
+  if (cutoff)
+    return max_insn_queue_index;
+  t = INSN_TICK_ESTIMATE (p->i2) - (clock_var + pair_delay (p) + 1);
+  if (t > 0)
+    return t;
+  return 0;
+}
 
 /* Return the head and tail pointers of ebb starting at BEG and ending
    at END.  */
@@ -2468,11 +3045,6 @@ struct choice_entry
    function max_issue.  */
 static struct choice_entry *choice_stack;
 
-/* The following variable value is number of essential insns issued on
-   the current cycle.  An insn is essential one if it changes the
-   processors state.  */
-int cycle_issued_insns;
-
 /* This holds the value of the target dfa_lookahead hook.  */
 int dfa_lookahead;
 
@@ -2884,10 +3456,18 @@ commit_schedule (rtx prev_head, rtx tail
    issued in this cycle.  TEMP_STATE is temporary scheduler state we
    can use as scratch space.  If FIRST_CYCLE_INSN_P is true, no insns
    have been issued for the current cycle, which means it is valid to
-   issue an asm statement.  */
+   issue an asm statement.
+
+   If SHADOWS_ONLY_P is true, we eliminate all real insns and only
+   leave those for which SHADOW_P is true.
+
+   Return the number of cycles we must
+   advance to find the next ready instruction, or zero if there remain
+   insns on the ready list.  */
 
 static void
-prune_ready_list (state_t temp_state, bool first_cycle_insn_p)
+prune_ready_list (state_t temp_state, bool first_cycle_insn_p,
+		  bool shadows_only_p)
 {
   int i;
 
@@ -2898,7 +3478,12 @@ prune_ready_list (state_t temp_state, bo
       int cost = 0;
       const char *reason = "resource conflict";
 
-      if (recog_memoized (insn) < 0)
+      if (shadows_only_p && !DEBUG_INSN_P (insn) && !SHADOW_P (insn))
+	{
+	  cost = 1;
+	  reason = "not a shadow";
+	}
+      else if (recog_memoized (insn) < 0)
 	{
 	  if (!first_cycle_insn_p
 	      && (GET_CODE (PATTERN (insn)) == ASM_INPUT
@@ -2910,12 +3495,34 @@ prune_ready_list (state_t temp_state, bo
 	cost = 0;
       else
 	{
+	  int delay_cost = 0;
+
+	  if (delay_htab)
+	    {
+	      struct delay_pair *delay_entry;
+	      delay_entry
+		= (struct delay_pair *)htab_find_with_hash (delay_htab, insn,
+							    htab_hash_pointer (insn));
+	      while (delay_entry && delay_cost == 0)
+		{
+		  delay_cost = estimate_shadow_tick (delay_entry);
+		  if (delay_cost > max_insn_queue_index)
+		    delay_cost = max_insn_queue_index;
+		  delay_entry = delay_entry->next_same_i1;
+		}
+	    }
+
 	  memcpy (temp_state, curr_state, dfa_state_size);
 	  cost = state_transition (temp_state, insn);
 	  if (cost < 0)
 	    cost = 0;
 	  else if (cost == 0)
 	    cost = 1;
+	  if (cost < delay_cost)
+	    {
+	      cost = delay_cost;
+	      reason = "shadow tick";
+	    }
 	}
       if (cost >= 1)
 	{
@@ -2926,6 +3533,60 @@ prune_ready_list (state_t temp_state, bo
     }
 }
 
+/* Called when we detect that the schedule is impossible.  We examine the
+   backtrack queue to find the earliest insn that caused this condition.  */
+
+static struct haifa_saved_data *
+verify_shadows (void)
+{
+  struct haifa_saved_data *save, *earliest_fail = NULL;
+  for (save = backtrack_queue; save; save = save->next)
+    {
+      int t;
+      struct delay_pair *pair = save->delay_pair;
+      rtx i1 = pair->i1;
+
+      for (; pair; pair = pair->next_same_i1)
+	{
+	  rtx i2 = pair->i2;
+
+	  if (QUEUE_INDEX (i2) == QUEUE_SCHEDULED)
+	    continue;
+
+	  t = INSN_TICK (i1) + pair_delay (pair);
+	  if (t < clock_var)
+	    {
+	      if (sched_verbose >= 2)
+		fprintf (sched_dump,
+			 ";;\t\tfailed delay requirements for %d/%d (%d->%d)"
+			 ", not ready\n",
+			 INSN_UID (pair->i1), INSN_UID (pair->i2),
+			 INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
+	      earliest_fail = save;
+	      break;
+	    }
+	  if (QUEUE_INDEX (i2) >= 0)
+	    {
+	      int queued_for = INSN_TICK (i2);
+
+	      if (t < queued_for)
+		{
+		  if (sched_verbose >= 2)
+		    fprintf (sched_dump,
+			     ";;\t\tfailed delay requirements for %d/%d"
+			     " (%d->%d), queued too late\n",
+			     INSN_UID (pair->i1), INSN_UID (pair->i2),
+			     INSN_TICK (pair->i1), INSN_EXACT_TICK (pair->i2));
+		  earliest_fail = save;
+		  break;
+		}
+	    }
+	}
+    }
+
+  return earliest_fail;
+}
+
 /* Use forward list scheduling to rearrange insns of block pointed to by
    TARGET_BB, possibly bringing insns from subsequent blocks in the same
    region.  */
@@ -2955,6 +3616,8 @@ schedule_block (basic_block *target_bb)
 
   haifa_recovery_bb_recently_added_p = false;
 
+  backtrack_queue = NULL;
+
   /* Debug info.  */
   if (sched_verbose)
     dump_new_block_header (0, *target_bb, head, tail);
@@ -3051,6 +3714,8 @@ schedule_block (basic_block *target_bb)
 
   gcc_assert (VEC_length (rtx, scheduled_insns) == 0);
   sort_p = TRUE;
+  must_backtrack = false;
+
   /* Loop until all the insns in BB are scheduled.  */
   while ((*current_sched_info->schedule_more_p) ())
     {
@@ -3080,18 +3745,21 @@ schedule_block (basic_block *target_bb)
       while (advance > 0);
 
       if (ready.n_ready > 0)
-	prune_ready_list (temp_state, true);
+	prune_ready_list (temp_state, true, false);
       if (ready.n_ready == 0)
 	continue;
+      if (must_backtrack)
+	goto do_backtrack;
 
       ls.first_cycle_insn_p = true;
+      ls.shadows_only_p = false;
       cycle_issued_insns = 0;
       ls.can_issue_more = issue_rate;
       for (;;)
 	{
 	  rtx insn;
 	  int cost;
-	  bool asm_p = false;
+	  bool asm_p;
 
 	  if (sort_p && ready.n_ready > 0)
 	    {
@@ -3130,6 +3798,7 @@ schedule_block (basic_block *target_bb)
 	  if (ls.first_cycle_insn_p && !ready.n_ready)
 	    break;
 
+	resume_after_backtrack:
 	  /* Allow the target to reorder the list, typically for
 	     better instruction bundling.  */
 	  if (sort_p
@@ -3236,6 +3905,22 @@ schedule_block (basic_block *target_bb)
 	      goto restart_choose_ready;
 	    }
 
+	  if (delay_htab)
+	    {
+	      /* If this insn is the first part of a delay-slot pair, record a
+		 backtrack point.  */
+	      struct delay_pair *delay_entry;
+	      delay_entry
+		= (struct delay_pair *)htab_find_with_hash (delay_htab, insn,
+							    htab_hash_pointer (insn));
+	      if (delay_entry)
+		{
+		  save_backtrack_point (delay_entry, ls);
+		  if (sched_verbose >= 2)
+		    fprintf (sched_dump, ";;\t\tsaving backtrack point\n");
+		}
+	    }
+
 	  /* DECISION is made.  */
 
           if (TODO_SPEC (insn) & SPECULATIVE)
@@ -3275,18 +3960,70 @@ schedule_block (basic_block *target_bb)
 	    ls.can_issue_more--;
 	  advance = schedule_insn (insn);
 
+	  if (SHADOW_P (insn))
+	    ls.shadows_only_p = true;
+
 	  /* After issuing an asm insn we should start a new cycle.  */
 	  if (advance == 0 && asm_p)
 	    advance = 1;
+
+	  if (must_backtrack)
+	    break;
+
 	  if (advance != 0)
 	    break;
 
 	  ls.first_cycle_insn_p = false;
 	  if (ready.n_ready > 0)
-	    prune_ready_list (temp_state, false);
+	    prune_ready_list (temp_state, false, ls.shadows_only_p);
 	}
-    }
 
+    do_backtrack:
+      if (!must_backtrack)
+	for (i = 0; i < ready.n_ready; i++)
+	  {
+	    rtx insn = ready_element (&ready, i);
+	    if (INSN_EXACT_TICK (insn) == clock_var)
+	      {
+		must_backtrack = true;
+		clock_var++;
+		break;
+	      }
+	  }
+      while (must_backtrack)
+	{
+	  struct haifa_saved_data *failed;
+	  rtx failed_insn;
+
+	  must_backtrack = false;
+	  failed = verify_shadows ();
+	  gcc_assert (failed);
+
+	  failed_insn = failed->delay_pair->i1;
+	  unschedule_insns_until (failed_insn);
+	  while (failed != backtrack_queue)
+	    free_topmost_backtrack_point (true);
+	  restore_last_backtrack_point (&ls);
+	  if (sched_verbose >= 2)
+	    fprintf (sched_dump, ";;\t\trewind to cycle %d\n", clock_var);
+	  /* Delay by at least a cycle.  This could cause additional
+	     backtracking.  */
+	  queue_insn (failed_insn, 1, "backtracked");
+	  advance = 0;
+	  if (must_backtrack)
+	    continue;
+	  if (ready.n_ready > 0)
+	    goto resume_after_backtrack;
+	  else
+	    {
+	      if (clock_var == 0 && ls.first_cycle_insn_p)
+		goto end_schedule;
+	      advance = 1;
+	      break;
+	    }
+	}
+    }
+ end_schedule:
   /* Debug info.  */
   if (sched_verbose)
     {
@@ -3364,6 +4101,8 @@ schedule_block (basic_block *target_bb)
 
   current_sched_info->head = head;
   current_sched_info->tail = tail;
+
+  free_backtrack_queue ();
 }
 \f
 /* Set_priorities: compute priority of each insn in the block.  */
@@ -3488,7 +4227,8 @@ sched_init (void)
 
   init_alias_analysis ();
 
-  df_set_flags (DF_LR_RUN_DCE);
+  if (!sched_no_dce)
+    df_set_flags (DF_LR_RUN_DCE);
   df_note_add_problem ();
 
   /* More problems needed for interloop dep calculation in SMS.  */
@@ -3653,6 +4393,17 @@ sched_finish (void)
 #endif
 }
 
+/* Free all delay_pair structures that were recorded.  */
+void
+free_delay_pairs (void)
+{
+  if (delay_htab)
+    {
+      htab_empty (delay_htab);
+      htab_empty (delay_htab_i2);
+    }
+}
+
 /* Fix INSN_TICKs of the instructions in the current block as well as
    INSN_TICKs of their dependents.
    HEAD and TAIL are the begin and the end of the current scheduled block.  */
@@ -5546,6 +6297,7 @@ init_h_i_d (rtx insn)
       INSN_COST (insn) = -1;
       QUEUE_INDEX (insn) = QUEUE_NOWHERE;
       INSN_TICK (insn) = INVALID_TICK;
+      INSN_EXACT_TICK (insn) = INVALID_TICK;
       INTER_TICK (insn) = INVALID_TICK;
       TODO_SPEC (insn) = HARD_DEP;
     }
Index: gcc/Makefile.in
===================================================================
--- gcc.orig/Makefile.in
+++ gcc/Makefile.in
@@ -3399,7 +3399,7 @@ modulo-sched.o : modulo-sched.c $(DDG_H)
 haifa-sched.o : haifa-sched.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \
    $(SCHED_INT_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h $(FUNCTION_H) \
    $(INSN_ATTR_H) $(DIAGNOSTIC_CORE_H) $(RECOG_H) $(EXCEPT_H) $(TM_P_H) $(TARGET_H) output.h \
-   $(PARAMS_H) $(DBGCNT_H) $(CFGLOOP_H) ira.h $(EMIT_RTL_H)
+   $(PARAMS_H) $(DBGCNT_H) $(CFGLOOP_H) ira.h $(EMIT_RTL_H) $(HASHTAB_H)
 sched-deps.o : sched-deps.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \
    $(RTL_H) $(SCHED_INT_H) $(REGS_H) hard-reg-set.h $(FLAGS_H) insn-config.h \
    $(FUNCTION_H) $(INSN_ATTR_H) $(DIAGNOSTIC_CORE_H) $(RECOG_H) $(EXCEPT_H) cselib.h \
Index: gcc/modulo-sched.c
===================================================================
--- gcc.orig/modulo-sched.c
+++ gcc/modulo-sched.c
@@ -276,6 +276,7 @@ static struct haifa_sched_info sms_sched
   0, 0,
 
   NULL, NULL, NULL, NULL,
+  NULL, NULL,
   0
 };
 
Index: gcc/sched-deps.c
===================================================================
--- gcc.orig/sched-deps.c
+++ gcc/sched-deps.c
@@ -1279,6 +1279,28 @@ sd_resolve_dep (sd_iterator_def sd_it)
 		 INSN_RESOLVED_FORW_DEPS (pro));
 }
 
+/* Perform the inverse operation of sd_resolve_dep.  Restore the dependence
+   pointed to by SD_IT to unresolved state.  */
+void
+sd_unresolve_dep (sd_iterator_def sd_it)
+{
+  dep_node_t node = DEP_LINK_NODE (*sd_it.linkp);
+  dep_t dep = DEP_NODE_DEP (node);
+  rtx pro = DEP_PRO (dep);
+  rtx con = DEP_CON (dep);
+
+  if ((current_sched_info->flags & DO_SPECULATION)
+      && (DEP_STATUS (dep) & SPECULATIVE))
+    move_dep_link (DEP_NODE_BACK (node), INSN_RESOLVED_BACK_DEPS (con),
+		   INSN_SPEC_BACK_DEPS (con));
+  else
+    move_dep_link (DEP_NODE_BACK (node), INSN_RESOLVED_BACK_DEPS (con),
+		   INSN_HARD_BACK_DEPS (con));
+
+  move_dep_link (DEP_NODE_FORW (node), INSN_RESOLVED_FORW_DEPS (pro),
+		 INSN_FORW_DEPS (pro));
+}
+
 /* Make TO depend on all the FROM's producers.
    If RESOLVED_P is true add dependencies to the resolved lists.  */
 void
Index: gcc/sched-ebb.c
===================================================================
--- gcc.orig/sched-ebb.c
+++ gcc/sched-ebb.c
@@ -74,6 +74,25 @@ static void ebb_add_block (basic_block,
 static basic_block advance_target_bb (basic_block, rtx);
 static void ebb_fix_recovery_cfg (int, int, int);
 
+/* Allocate memory and store the state of the frontend.  Return the allocated
+   memory.  */
+static void *
+save_ebb_state (void)
+{
+  int *p = XNEW (int);
+  *p = sched_rgn_n_insns;
+  return p;
+}
+
+/* Restore the state of the frontend from P_, then free it.  */
+static void
+restore_ebb_state (void *p_)
+{
+  int *p = (int *)p_;
+  sched_rgn_n_insns = *p;
+  free (p_);
+}
+
 /* Return nonzero if there are more insns that should be scheduled.  */
 
 static int
@@ -295,6 +314,10 @@ static struct haifa_sched_info ebb_sched
   begin_schedule_ready,
   begin_move_insn,
   advance_target_bb,
+
+  save_ebb_state,
+  restore_ebb_state,
+
   SCHED_EBB
   /* We can create new blocks in begin_schedule_ready ().  */
   | NEW_BBS
@@ -377,76 +400,80 @@ add_deps_for_risky_insns (rtx head, rtx
   basic_block last_block = NULL, bb;
 
   for (insn = head; insn != next_tail; insn = NEXT_INSN (insn))
-    if (control_flow_insn_p (insn))
-      {
-	bb = BLOCK_FOR_INSN (insn);
-	bb->aux = last_block;
-	last_block = bb;
-	last_jump = insn;
-      }
-    else if (INSN_P (insn) && last_jump != NULL_RTX)
-      {
-	classification = haifa_classify_insn (insn);
-	prev = last_jump;
-	switch (classification)
-	  {
-	  case PFREE_CANDIDATE:
-	    if (flag_schedule_speculative_load)
-	      {
-		bb = earliest_block_with_similiar_load (last_block, insn);
-		if (bb)
-		  {
-		    bb = (basic_block) bb->aux;
-		    if (!bb)
-		      break;
-		    prev = BB_END (bb);
-		  }
-	      }
-	    /* Fall through.  */
-	  case TRAP_RISKY:
-	  case IRISKY:
-	  case PRISKY_CANDIDATE:
-	    /* ??? We could implement better checking PRISKY_CANDIDATEs
-	       analogous to sched-rgn.c.  */
-	    /* We can not change the mode of the backward
-	       dependency because REG_DEP_ANTI has the lowest
-	       rank.  */
-	    if (! sched_insns_conditions_mutex_p (insn, prev))
-	      {
-		dep_def _dep, *dep = &_dep;
-
-		init_dep (dep, prev, insn, REG_DEP_ANTI);
-
-		if (!(current_sched_info->flags & USE_DEPS_LIST))
-		  {
-		    enum DEPS_ADJUST_RESULT res;
-
-		    res = sd_add_or_update_dep (dep, false);
-
-		    /* We can't change an existing dependency with
-		       DEP_ANTI.  */
-		    gcc_assert (res != DEP_CHANGED);
-		  }
-		else
-		  {
-		    if ((current_sched_info->flags & DO_SPECULATION)
-			&& (spec_info->mask & BEGIN_CONTROL))
-		      DEP_STATUS (dep) = set_dep_weak (DEP_ANTI, BEGIN_CONTROL,
-						       MAX_DEP_WEAK);
-
-		    sd_add_or_update_dep (dep, false);
-
-		    /* Dep_status could have been changed.
-		       No assertion here.  */
-		  }
-	      }
-
-            break;
-
-          default:
-            break;
-	  }
-      }
+    {
+      add_delay_dependencies (insn);
+      if (control_flow_insn_p (insn))
+	{
+	  bb = BLOCK_FOR_INSN (insn);
+	  bb->aux = last_block;
+	  last_block = bb;
+	  last_jump = insn;
+	}
+      else if (INSN_P (insn) && last_jump != NULL_RTX)
+	{
+	  classification = haifa_classify_insn (insn);
+	  prev = last_jump;
+
+	  switch (classification)
+	    {
+	    case PFREE_CANDIDATE:
+	      if (flag_schedule_speculative_load)
+		{
+		  bb = earliest_block_with_similiar_load (last_block, insn);
+		  if (bb)
+		    {
+		      bb = (basic_block) bb->aux;
+		      if (!bb)
+			break;
+		      prev = BB_END (bb);
+		    }
+		}
+	      /* Fall through.  */
+	    case TRAP_RISKY:
+	    case IRISKY:
+	    case PRISKY_CANDIDATE:
+	      /* ??? We could implement better checking PRISKY_CANDIDATEs
+		 analogous to sched-rgn.c.  */
+	      /* We can not change the mode of the backward
+		 dependency because REG_DEP_ANTI has the lowest
+		 rank.  */
+	      if (! sched_insns_conditions_mutex_p (insn, prev))
+		{
+		  dep_def _dep, *dep = &_dep;
+
+		  init_dep (dep, prev, insn, REG_DEP_ANTI);
+
+		  if (!(current_sched_info->flags & USE_DEPS_LIST))
+		    {
+		      enum DEPS_ADJUST_RESULT res;
+
+		      res = sd_add_or_update_dep (dep, false);
+
+		      /* We can't change an existing dependency with
+			 DEP_ANTI.  */
+		      gcc_assert (res != DEP_CHANGED);
+		    }
+		  else
+		    {
+		      if ((current_sched_info->flags & DO_SPECULATION)
+			  && (spec_info->mask & BEGIN_CONTROL))
+			DEP_STATUS (dep) = set_dep_weak (DEP_ANTI, BEGIN_CONTROL,
+							 MAX_DEP_WEAK);
+
+		      sd_add_or_update_dep (dep, false);
+
+		      /* Dep_status could have been changed.
+			 No assertion here.  */
+		    }
+		}
+
+	      break;
+
+	    default:
+	      break;
+	    }
+	}
+    }
   /* Maintain the invariant that bb->aux is clear after use.  */
   while (last_block)
     {
Index: gcc/sched-int.h
===================================================================
--- gcc.orig/sched-int.h
+++ gcc/sched-int.h
@@ -627,6 +627,13 @@ struct haifa_sched_info
      The first parameter is the current basic block in EBB.  */
   basic_block (*advance_target_bb) (basic_block, rtx);
 
+  /* Allocate memory, store the frontend scheduler state in it, and
+     return it.  */
+  void *(*save_state) (void);
+  /* Restore frontend scheduler state from the argument, and free the
+     memory.  */
+  void (*restore_state) (void *);
+
   /* ??? FIXME: should use straight bitfields inside sched_info instead of
      this flag field.  */
   unsigned int flags;
@@ -775,10 +782,18 @@ struct _haifa_insn_data
      used to note timing constraints for the insns in the pending list.  */
   int tick;
 
+  /* For insns that are scheduled at a fixed difference from another,
+     this records the tick in which they must be ready.  */
+  int exact_tick;
+
   /* INTER_TICK is used to adjust INSN_TICKs of instructions from the
      subsequent blocks in a region.  */
   int inter_tick;
 
+  /* Used temporarily to estimate an INSN_TICK value for an insn given
+     current knowledge.  */
+  int tick_estimate;
+
   /* See comment on QUEUE_INDEX macro in haifa-sched.c.  */
   int queue_index;
 
@@ -788,6 +803,14 @@ struct _haifa_insn_data
      moved load insn and this one.  */
   unsigned int fed_by_spec_load : 1;
   unsigned int is_load_insn : 1;
+  /* Nonzero if this insn has negative-cost forward dependencies against
+     an already scheduled insn.  */
+  unsigned int feeds_backtrack_insn : 1;
+
+  /* Nonzero if this insn is a shadow of another, scheduled after a fixed
+     delay.  We only emit shadows at the end of a cycle, with no other
+     real insns following them.  */
+  unsigned int shadow_p : 1;
 
   /* '> 0' if priority is valid,
      '== 0' if priority was not yet computed,
@@ -1028,7 +1051,8 @@ enum SCHED_FLAGS {
      Results in generation of data and control speculative dependencies.
      Requires USE_DEPS_LIST set.  */
   DO_SPECULATION = USE_DEPS_LIST << 1,
-  SCHED_RGN = DO_SPECULATION << 1,
+  DO_BACKTRACKING = DO_SPECULATION << 1,
+  SCHED_RGN = DO_BACKTRACKING << 1,
   SCHED_EBB = SCHED_RGN << 1,
   /* Scheduler can possibly create new basic blocks.  Used for assertions.  */
   NEW_BBS = SCHED_EBB << 1,
@@ -1315,7 +1339,11 @@ extern int *ebb_head;
 extern int current_nr_blocks;
 extern int current_blocks;
 extern int target_bb;
+extern bool sched_no_dce;
 
+extern void record_delay_slot_pair (rtx, rtx, int);
+extern void free_delay_pairs (void);
+extern void add_delay_dependencies (rtx);
 extern bool sched_is_disabled_for_current_region_p (void);
 extern void sched_rgn_init (bool);
 extern void sched_rgn_finish (void);
@@ -1489,6 +1517,7 @@ extern dep_t sd_find_dep_between (rtx, r
 extern void sd_add_dep (dep_t, bool);
 extern enum DEPS_ADJUST_RESULT sd_add_or_update_dep (dep_t, bool);
 extern void sd_resolve_dep (sd_iterator_def);
+extern void sd_unresolve_dep (sd_iterator_def);
 extern void sd_copy_back_deps (rtx, rtx, bool);
 extern void sd_delete_dep (sd_iterator_def);
 extern void sd_debug_lists (rtx, sd_list_types_def);
Index: gcc/sched-rgn.c
===================================================================
--- gcc.orig/sched-rgn.c
+++ gcc/sched-rgn.c
@@ -2371,6 +2371,7 @@ static const struct haifa_sched_info rgn
   begin_schedule_ready,
   NULL,
   advance_target_bb,
+  NULL, NULL,
   SCHED_RGN
 };
 
Index: gcc/sel-sched-ir.c
===================================================================
--- gcc.orig/sel-sched-ir.c
+++ gcc/sel-sched-ir.c
@@ -5652,6 +5652,10 @@ static struct haifa_sched_info sched_sel
   NULL, /* begin_schedule_ready */
   NULL, /* begin_move_insn */
   NULL, /* advance_target_bb */
+
+  NULL,
+  NULL,
+
   SEL_SCHED | NEW_BBS
 };
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 5/11: Track predication conditions more accurately
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (3 preceding siblings ...)
  2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
@ 2011-05-10 15:54 ` Bernd Schmidt
  2011-05-11 12:26   ` Alexander Monakov
  2011-05-31 20:34   ` Steve Ellcey
  2011-05-10 16:16 ` C6X port 6/11: REG_WORDS_BIG_ENDIAN Bernd Schmidt
                   ` (11 subsequent siblings)
  16 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 15:54 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 635 bytes --]

The scheduler knows that insns with different COND_EXEC conditions don't
conflict and can be scheduled independently. Unfortunately, sched-deps.c
does not try to keep the conditions valid as it progresses. For example,

[B0] A0 = [A1]
     B0 = something
[!B0] [A2] = A0

The first and third insns have opposite conditions, so the scheduler
decides they are independent. For most targets this isn't a problem, as
the insn in the middle will produce enough dependencies to ensure the
right order. However, on C6X, order alone isn't sufficient due to the
exposed pipeline: we also need to ensure that the latencies are observed.


Bernd

[-- Attachment #2: insn-cond.diff --]
[-- Type: text/plain, Size: 4996 bytes --]

	* sched-int.h (struct _haifa_deps_insn_data): New members cond
	and reverse_cond.
	(INSN_COND, INSN_REVERSE_COND): New macros.
	* sched-deps.c (deps_analyze_insn): Call sched_get_condition_with_rev
	once.
	(sched_get_condition_with_rev): Cache the results, and look them up
	if possible.
	(sched_analyze_insn): Destroy INSN_COND of previous insns if they
	are clobbered by the current insn.

Index: gcc/sched-deps.c
===================================================================
--- gcc.orig/sched-deps.c
+++ gcc/sched-deps.c
@@ -489,13 +489,27 @@ deps_may_trap_p (const_rtx mem)
 
 /* Find the condition under which INSN is executed.  If REV is not NULL,
    it is set to TRUE when the returned comparison should be reversed
-   to get the actual condition.  */
+   to get the actual condition.
+   We only do actual work the first time we come here for an insn; the
+   results are cached in INSN_COND and INSN_REVERSE_COND.  */
 static rtx
 sched_get_condition_with_rev (const_rtx insn, bool *rev)
 {
   rtx pat = PATTERN (insn);
   rtx src;
 
+  if (INSN_COND (insn) == const_true_rtx)
+    return NULL_RTX;
+
+  if (INSN_COND (insn) != NULL_RTX)
+    {
+      if (rev)
+	*rev = INSN_REVERSE_COND (insn);
+      return INSN_COND (insn);
+    }
+
+  INSN_COND (insn) = const_true_rtx;
+  INSN_REVERSE_COND (insn) = false;
   if (pat == 0)
     return 0;
 
@@ -503,7 +517,10 @@ sched_get_condition_with_rev (const_rtx
     *rev = false;
 
   if (GET_CODE (pat) == COND_EXEC)
-    return COND_EXEC_TEST (pat);
+    {
+      INSN_COND (insn) = COND_EXEC_TEST (pat);
+      return COND_EXEC_TEST (pat);
+    }
 
   if (!any_condjump_p (insn) || !onlyjump_p (insn))
     return 0;
@@ -511,7 +528,10 @@ sched_get_condition_with_rev (const_rtx
   src = SET_SRC (pc_set (insn));
 
   if (XEXP (src, 2) == pc_rtx)
-    return XEXP (src, 0);
+    {
+      INSN_COND (insn) = XEXP (src, 0);
+      return XEXP (src, 0);
+    }
   else if (XEXP (src, 1) == pc_rtx)
     {
       rtx cond = XEXP (src, 0);
@@ -522,6 +542,8 @@ sched_get_condition_with_rev (const_rtx
 
       if (rev)
 	*rev = true;
+      INSN_COND (insn) = cond;
+      INSN_REVERSE_COND (insn) = true;
       return cond;
     }
 
@@ -2841,6 +2863,8 @@ sched_analyze_insn (struct deps_desc *de
     }
   else
     {
+      regset_head set_or_clobbered;
+
       EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
 	{
 	  struct deps_reg *reg_last = &deps->reg_last[i];
@@ -2871,6 +2895,21 @@ sched_analyze_insn (struct deps_desc *de
 	      }
 	  }
 
+      INIT_REG_SET (&set_or_clobbered);
+      bitmap_ior (&set_or_clobbered, reg_pending_clobbers, reg_pending_sets);
+      EXECUTE_IF_SET_IN_REG_SET (&set_or_clobbered, 0, i, rsi)
+	{
+	  struct deps_reg *reg_last = &deps->reg_last[i];
+	  rtx list;
+	  for (list = reg_last->uses; list; list = XEXP (list, 1))
+	    {
+	      rtx other = XEXP (list, 0);
+	      if (INSN_COND (other) != const_true_rtx
+		  && refers_to_regno_p (i, i + 1, INSN_COND (other), NULL))
+		INSN_COND (other) = const_true_rtx;
+	    }
+	}
+
       /* If the current insn is conditional, we can't free any
 	 of the lists.  */
       if (sched_has_condition_p (insn))
@@ -3245,6 +3284,10 @@ deps_analyze_insn (struct deps_desc *dep
   if (sched_deps_info->start_insn)
     sched_deps_info->start_insn (insn);
 
+  /* Record the condition for this insn.  */
+  if (NONDEBUG_INSN_P (insn))
+    sched_get_condition_with_rev (insn, NULL);
+
   if (NONJUMP_INSN_P (insn) || DEBUG_INSN_P (insn) || JUMP_P (insn))
     {
       /* Make each JUMP_INSN (but not a speculative check)
Index: gcc/sched-int.h
===================================================================
--- gcc.orig/sched-int.h
+++ gcc/sched-int.h
@@ -716,6 +716,17 @@ struct _haifa_deps_insn_data
      search in 'forw_deps'.  */
   deps_list_t resolved_forw_deps;
 
+  /* If the insn is conditional (either through COND_EXEC, or because
+     it is a conditional branch), this records the condition.  NULL
+     for insns that haven't been seen yet or don't have a condition;
+     const_true_rtx to mark an insn without a condition, or with a
+     condition that has been clobbered by a subsequent insn.  */
+  rtx cond;
+
+  /* True if the condition in 'cond' should be reversed to get the actual
+     condition.  */
+  unsigned int reverse_cond : 1;
+
   /* Some insns (e.g. call) are not allowed to move across blocks.  */
   unsigned int cant_move : 1;
 };
@@ -891,6 +902,8 @@ extern VEC(haifa_deps_insn_data_def, hea
 #define INSN_RESOLVED_FORW_DEPS(INSN) (HDID (INSN)->resolved_forw_deps)
 #define INSN_HARD_BACK_DEPS(INSN) (HDID (INSN)->hard_back_deps)
 #define INSN_SPEC_BACK_DEPS(INSN) (HDID (INSN)->spec_back_deps)
+#define INSN_COND(INSN)	(HDID (INSN)->cond)
+#define INSN_REVERSE_COND(INSN) (HDID (INSN)->reverse_cond)
 #define CANT_MOVE(INSN)	(HDID (INSN)->cant_move)
 #define CANT_MOVE_BY_LUID(LUID)	(VEC_index (haifa_deps_insn_data_def, h_d_i_d, \
                                             LUID)->cant_move)

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 6/11: REG_WORDS_BIG_ENDIAN
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (4 preceding siblings ...)
  2011-05-10 15:54 ` C6X port 5/11: Track predication conditions more accurately Bernd Schmidt
@ 2011-05-10 16:16 ` Bernd Schmidt
  2011-05-10 16:51 ` C6X port 8/11: A new FUNCTION_ARG macro Bernd Schmidt
                   ` (10 subsequent siblings)
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 16:16 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 154 bytes --]

C6X has little- and big-endian modes, but in both modes, registers are
in little-endian order. This patch adds code to support this model in gcc.


Bernd

[-- Attachment #2: regbe.diff --]
[-- Type: text/plain, Size: 5621 bytes --]

	* reload.c (operands_match_p): Take it into account.
	(reload_adjust_reg_for_mode): Likewise.
	* rtlanal.c (subreg_get_info): Likewise.
	* defaults.h (REG_WORDS_BIG_ENDIAN): Provide a default.
	* doc/tm.texi.in (WORDS_BIG_ENDIAN): Mention REG_WORDS_BIG_ENDIAN.
	(REG_WORDS_BIG_ENDIAN): Document.
	* doc/tm.texi: Regenerate.

Index: doc/tm.texi
===================================================================
--- doc/tm.texi.orig
+++ doc/tm.texi
@@ -863,11 +863,18 @@ word has the lowest number.  This macro
 @defmac WORDS_BIG_ENDIAN
 Define this macro to have the value 1 if, in a multiword object, the
 most significant word has the lowest number.  This applies to both
-memory locations and registers; GCC fundamentally assumes that the
-order of words in memory is the same as the order in registers.  This
+memory locations and registers; see @code{REG_WORDS_BIG_ENDIAN} if the
+order of words in memory is not the same as the order in registers.  This
 macro need not be a constant.
 @end defmac
 
+@defmac REG_WORDS_BIG_ENDIAN
+On some machines, the order of words in a multiword object differs between
+registers in memory.  In such a situation, define this macro to describe
+the order of words in a register.  The macro @code{WORDS_BIG_ENDIAN} controls
+the order of words in memory.
+@end defmac
+
 @defmac FLOAT_WORDS_BIG_ENDIAN
 Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
 @code{TFmode} floating point numbers are stored in memory with the word
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in.orig
+++ doc/tm.texi.in
@@ -853,11 +853,18 @@ word has the lowest number.  This macro
 @defmac WORDS_BIG_ENDIAN
 Define this macro to have the value 1 if, in a multiword object, the
 most significant word has the lowest number.  This applies to both
-memory locations and registers; GCC fundamentally assumes that the
-order of words in memory is the same as the order in registers.  This
+memory locations and registers; see @code{REG_WORDS_BIG_ENDIAN} if the
+order of words in memory is not the same as the order in registers.  This
 macro need not be a constant.
 @end defmac
 
+@defmac REG_WORDS_BIG_ENDIAN
+On some machines, the order of words in a multiword object differs between
+registers in memory.  In such a situation, define this macro to describe
+the order of words in a register.  The macro @code{WORDS_BIG_ENDIAN} controls
+the order of words in memory.
+@end defmac
+
 @defmac FLOAT_WORDS_BIG_ENDIAN
 Define this macro to have the value 1 if @code{DFmode}, @code{XFmode} or
 @code{TFmode} floating point numbers are stored in memory with the word
Index: defaults.h
===================================================================
--- defaults.h.orig
+++ defaults.h
@@ -882,6 +882,10 @@ see the files COPYING3 and COPYING.RUNTI
 #define FLOAT_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
 #endif
 
+#ifndef REG_WORDS_BIG_ENDIAN
+#define REG_WORDS_BIG_ENDIAN WORDS_BIG_ENDIAN
+#endif
+
 #ifdef TARGET_FLT_EVAL_METHOD
 #define TARGET_FLT_EVAL_METHOD_NON_DEFAULT 1
 #else
Index: reload.c
===================================================================
--- reload.c.orig
+++ reload.c
@@ -2217,15 +2217,15 @@ operands_match_p (rtx x, rtx y)
       else
 	j = REGNO (y);
 
-      /* On a WORDS_BIG_ENDIAN machine, point to the last register of a
+      /* On a REG_WORDS_BIG_ENDIAN machine, point to the last register of a
 	 multiple hard register group of scalar integer registers, so that
 	 for example (reg:DI 0) and (reg:SI 1) will be considered the same
 	 register.  */
-      if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD
+      if (REG_WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (x)) > UNITS_PER_WORD
 	  && SCALAR_INT_MODE_P (GET_MODE (x))
 	  && i < FIRST_PSEUDO_REGISTER)
 	i += hard_regno_nregs[i][GET_MODE (x)] - 1;
-      if (WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (y)) > UNITS_PER_WORD
+      if (REG_WORDS_BIG_ENDIAN && GET_MODE_SIZE (GET_MODE (y)) > UNITS_PER_WORD
 	  && SCALAR_INT_MODE_P (GET_MODE (y))
 	  && j < FIRST_PSEUDO_REGISTER)
 	j += hard_regno_nregs[j][GET_MODE (y)] - 1;
@@ -7305,7 +7305,7 @@ reload_adjust_reg_for_mode (rtx reloadre
 
   regno = REGNO (reloadreg);
 
-  if (WORDS_BIG_ENDIAN)
+  if (REG_WORDS_BIG_ENDIAN)
     regno += (int) hard_regno_nregs[regno][GET_MODE (reloadreg)]
       - (int) hard_regno_nregs[regno][mode];
 
Index: rtlanal.c
===================================================================
--- rtlanal.c.orig
+++ rtlanal.c
@@ -3289,7 +3289,7 @@ subreg_get_info (unsigned int xregno, en
 	 return a negative offset so that we find the proper highpart
 	 of the register.  */
       if (GET_MODE_SIZE (ymode) > UNITS_PER_WORD
-	  ? WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN)
+	  ? REG_WORDS_BIG_ENDIAN : BYTES_BIG_ENDIAN)
 	info->offset = nregs_xmode - nregs_ymode;
       else
 	info->offset = 0;
@@ -3344,6 +3344,15 @@ subreg_get_info (unsigned int xregno, en
   gcc_assert ((GET_MODE_SIZE (xmode) % GET_MODE_SIZE (ymode)) == 0);
   gcc_assert ((nregs_xmode % nregs_ymode) == 0);
 
+  if (WORDS_BIG_ENDIAN != REG_WORDS_BIG_ENDIAN
+      && GET_MODE_SIZE (xmode) > UNITS_PER_WORD)
+    {
+      HOST_WIDE_INT xsize = GET_MODE_SIZE (xmode);
+      HOST_WIDE_INT ysize = GET_MODE_SIZE (ymode);
+      HOST_WIDE_INT off_low = offset & (ysize - 1);
+      HOST_WIDE_INT off_high = offset & ~(ysize - 1);
+      offset = (xsize - ysize - off_high) | off_low;
+    }
   /* The XMODE value can be seen as a vector of NREGS_XMODE
      values.  The subreg must represent a lowpart of given field.
      Compute what field it is.  */

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (5 preceding siblings ...)
  2011-05-10 16:16 ` C6X port 6/11: REG_WORDS_BIG_ENDIAN Bernd Schmidt
@ 2011-05-10 16:51 ` Bernd Schmidt
  2011-05-10 18:55   ` Joseph S. Myers
  2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
                   ` (9 subsequent siblings)
  16 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 16:51 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 261 bytes --]

On C6X, we have PARM_BOUNDARY == 8 (one byte), but some function
argument slots still must be rounded to a larger value. As far as I
could tell there's currently no way of telling gcc about this, hence a
new target macro which controls this behaviour.


Bernd


[-- Attachment #2: fartab.diff --]
[-- Type: text/plain, Size: 4898 bytes --]

	* doc/tm.texi.in (FUNCTION_ARG_PADDING): Mention
	FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY.
	(FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY): Document.
	* function.c (locate_and_pad_parm): Take it into account.
	* doc/tm.texi: Regenerate.

Index: doc/tm.texi
===================================================================
--- doc/tm.texi.orig
+++ doc/tm.texi
@@ -4163,9 +4163,10 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro.  It is
+always just enough to reach the next multiple of the alignment boundary,
+which is usually @code{PARM_BOUNDARY}, or @code{FUNCTION_ARG_BOUNDARY}
+if @code{FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY} is defined.
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4198,6 +4199,12 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@defmac FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY
+Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY}.
+Define this macro if you want the value of @code{FUNCTION_ARG_BOUNDARY}
+to be used for this rounding instead.
+@end defmac
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: doc/tm.texi.in
===================================================================
--- doc/tm.texi.in.orig
+++ doc/tm.texi.in
@@ -4151,9 +4151,10 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro.  It is
+always just enough to reach the next multiple of the alignment boundary,
+which is usually @code{PARM_BOUNDARY}, or @code{FUNCTION_ARG_BOUNDARY}
+if @code{FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY} is defined.
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4186,6 +4187,12 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@defmac FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY
+Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY}.
+Define this macro if you want the value of @code{FUNCTION_ARG_BOUNDARY}
+to be used for this rounding instead.
+@end defmac
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: function.c
===================================================================
--- function.c.orig
+++ function.c
@@ -3709,7 +3709,7 @@ locate_and_pad_parm (enum machine_mode p
 {
   tree sizetree;
   enum direction where_pad;
-  unsigned int boundary;
+  unsigned int boundary, round_boundary;
   int reg_parm_stack_space = 0;
   int part_size_in_regs;
 
@@ -3741,6 +3741,11 @@ locate_and_pad_parm (enum machine_mode p
     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
   boundary = targetm.calls.function_arg_boundary (passed_mode, type);
+#ifdef FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY
+  round_boundary = boundary;
+#else
+  round_boundary = PARM_BOUNDARY;
+#endif
   locate->where_pad = where_pad;
 
   /* Alignment can't exceed MAX_SUPPORTED_STACK_ALIGNMENT.  */
@@ -3787,8 +3792,8 @@ locate_and_pad_parm (enum machine_mode p
     tree s2 = sizetree;
     if (where_pad != none
 	&& (!host_integerp (sizetree, 1)
-	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-      s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
+	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+      s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
     SUB_PARM_SIZE (locate->slot_offset, s2);
   }
 
@@ -3840,8 +3845,8 @@ locate_and_pad_parm (enum machine_mode p
 
   if (where_pad != none
       && (!host_integerp (sizetree, 1)
-	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-    sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
+	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+    sizetree = round_up (sizetree, round_boundary / BITS_PER_UNIT);
 
   ADD_PARM_SIZE (locate->size, sizetree);
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 9/11: Allow defining attributes in terms of another
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (6 preceding siblings ...)
  2011-05-10 16:51 ` C6X port 8/11: A new FUNCTION_ARG macro Bernd Schmidt
@ 2011-05-10 16:54 ` Bernd Schmidt
  2011-05-16 18:35   ` Bernd Schmidt
  2011-05-25 10:27   ` Hans-Peter Nilsson
  2011-05-10 16:56 ` C6X port 11/11: Testcases Bernd Schmidt
                   ` (8 subsequent siblings)
  16 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 16:54 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 445 bytes --]

I've found it useful to use a construct such as the following:

(define_attr "units64"
  "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
  (const_string "unknown"))

(define_attr "units64p"
  "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
  (attr "units64"))

to define one attribute in terms of another by default, allowing
individual insn patterns to override the definition of "units64p" where
necessary. This patch adds support for this in genattrtab.


Bernd

[-- Attachment #2: ga-attr.diff --]
[-- Type: text/plain, Size: 1141 bytes --]

	* genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined
	in terms of another.

Index: genattrtab.c
===================================================================
--- genattrtab.c.orig
+++ genattrtab.c
@@ -1916,6 +1916,37 @@ evaluate_eq_attr (rtx exp, struct attr_d
   rtx newexp;
   int i;
 
+  while (GET_CODE (value) == ATTR)
+    {
+      struct attr_value *av = NULL;
+
+      attr = find_attr (&XSTR (value, 0), 0);
+
+      if (insn_code_values)
+        {
+          struct attr_value_list *iv;
+          for (iv = insn_code_values[insn_code]; iv; iv = iv->next)
+            if (iv->attr == attr)
+              {
+                av = iv->av;
+                break;
+              }
+        }
+      else
+        {
+          struct insn_ent *ie;
+          for (av = attr->first_value; av; av = av->next)
+            for (ie = av->first_insn; ie; ie = ie->next)
+              if (ie->def->insn_code == insn_code)
+                goto got_av;
+        }
+      if (av)
+        {
+        got_av:
+          value = av->value;
+        }
+    }
+
   switch (GET_CODE (value))
     {
     case CONST_STRING:

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 11/11: Testcases
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (7 preceding siblings ...)
  2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
@ 2011-05-10 16:56 ` Bernd Schmidt
  2011-07-15 10:06   ` Bernd Schmidt
  2011-05-10 17:02 ` C6X port 10/11: The port Bernd Schmidt
                   ` (7 subsequent siblings)
  16 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 16:56 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 63 bytes --]

This contains the testsuite changes for the C6X port.


Bernd


[-- Attachment #2: c6xts.diff --]
[-- Type: text/plain, Size: 16776 bytes --]

	* gcc.target/tic6x/weak-call.c: New test.
	* gcc.target/tic6x/fpcmp.c: New test.
	* gcc.target/tic6x/fpdiv.c: New test.
	* gcc.target/tic6x/rotdi16-scan.c: New test.
	* gcc.target/tic6x/ffssi.c: New test.
	* gcc.target/tic6x/fpdiv-lib.c: New test.
	* gcc.target/tic6x/cold-lc.c: New test.
	* gcc.target/tic6x/longcalls.c: New test.
	* gcc.target/tic6x/abi-align-1.c: New test.
	* gcc.target/tic6x/fpcmp-finite.c: New test.
	* gcc.target/tic6x/rotdi16.c: New test.
	* gcc.target/tic6x/bswapl.c: New test.
	* gcc.target/tic6x/ffsdi.c: New test.
	* gcc.target/tic6x/tic6x.exp: New file.
	* gcc.target/tic6x/builtin-math-7.c: New test, adapted from gcc.dg.
	* lib/target-supports.exp (chck_profiling_available): Not on tic6x.
	* gcc.c-torture/execute/20101011-1.c: Add a condition for
	__TMS320C6X__.
	* gcc.dg/20020312-2.c: Likewise.
	* gcc.dg/pr27095.c: Handle tic6x like hppa.
	* gcc.dg/torture/pr37868.c: Skip on tic6x.
	* gcc.dg/torture/builtin-math-7.c: Likewise.

Index: testsuite/gcc.target/tic6x/weak-call.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/weak-call.c
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.f" } } */
+/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.g" } } */
+
+extern void f () __attribute__ ((weak));
+extern void g () __attribute__ ((weak)) __attribute__ ((noinline));
+
+void g ()
+{
+}
+
+int main ()
+{
+  f ();
+  g ();
+}
Index: testsuite/gcc.target/tic6x/builtin-math-7.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/builtin-math-7.c
@@ -0,0 +1,94 @@
+/* Copyright (C) 2009  Free Software Foundation.
+
+   Verify that folding of complex mul and div work correctly.
+   TI C6X specific version, reduced by two tests that fails due to the
+   use of implicit -freciprocal-math.
+
+   Origin: Kaveh R. Ghazi,  August 13, 2009.  */
+
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-add-options ieee } */
+
+extern void link_error(int);
+
+/* Evaluate this expression at compile-time.  */
+#define COMPILETIME_TESTIT(TYPE,X,OP,Y,RES) do { \
+  if ((_Complex TYPE)(X) OP (_Complex TYPE)(Y) != (_Complex TYPE)(RES)) \
+    link_error(__LINE__); \
+} while (0)
+
+/* Use this error function for cases which only evaluate at
+   compile-time when optimizing.  */
+#ifdef __OPTIMIZE__
+# define ERROR_FUNC(X) link_error(X)
+#else
+# define ERROR_FUNC(X) __builtin_abort()
+#endif
+
+/* Evaluate this expression at compile-time using static initializers.  */
+#define STATICINIT_TESTIT(TYPE,X,OP,Y,RES) do { \
+  static const _Complex TYPE foo = (_Complex TYPE)(X) OP (_Complex TYPE)(Y); \
+  if (foo != (_Complex TYPE)(RES)) \
+    ERROR_FUNC (__LINE__); \
+} while (0)
+
+/* Evaluate this expression at runtime.  */
+#define RUNTIME_TESTIT(TYPE,X,OP,Y,RES) do { \
+  volatile _Complex TYPE foo; \
+  foo = (_Complex TYPE)(X); \
+  foo OP##= (_Complex TYPE)(Y); \
+  if (foo != (_Complex TYPE)(RES)) \
+    __builtin_abort(); \
+} while (0)
+
+/* Evaluate this expression at compile-time and runtime.  */
+#define TESTIT(TYPE,X,OP,Y,RES) do { \
+  STATICINIT_TESTIT(TYPE,X,OP,Y,RES); \
+  COMPILETIME_TESTIT(TYPE,X,OP,Y,RES); \
+  RUNTIME_TESTIT(TYPE,X,OP,Y,RES); \
+} while (0)
+
+/* Either the real or imaginary parts should be infinity.  */
+#define TEST_ONE_PART_INF(VAL) do { \
+  static const _Complex double foo = (VAL); \
+  if (! __builtin_isinf(__real foo) && ! __builtin_isinf(__imag foo)) \
+    ERROR_FUNC (__LINE__); \
+  if (! __builtin_isinf(__real (VAL)) && ! __builtin_isinf(__imag (VAL))) \
+    __builtin_abort(); \
+} while (0)
+
+int main()
+{
+  /* Test some regular finite values.  */
+  TESTIT (double, 3.+4.i, *, 2, 6+8i);
+  TESTIT (double, 3.+4.i, /, 2, 1.5+2i);
+  TESTIT (int, 3+4i, *, 2, 6+8i);
+  TESTIT (int, 3+4i, /, 2, 1+2i);
+
+  TESTIT (double, 3.+4.i, *, 2+5i, -14+23i);
+  TESTIT (int, 3+4i, *, 2+5i, -14+23i);
+  TESTIT (int, 30+40i, /, 5i, 8-6i);
+  TESTIT (int, 14+6i, /, 7+3i, 2);
+  TESTIT (int, 8+24i, /, 4+12i, 2);
+
+  /* Test for accuracy.  */
+  COMPILETIME_TESTIT (double,
+		      (1 + __DBL_EPSILON__ + 1i),
+		      *,
+		      (1 - __DBL_EPSILON__ + 1i),
+		      -4.93038065763132378382330353301741393545754021943139377981e-32+2i);
+
+  /* This becomes (NaN + iInf).  */
+#define VAL1 ((_Complex double)__builtin_inf() * 1i)
+
+  /* Test some C99 Annex G special cases.  */
+  TEST_ONE_PART_INF ((VAL1) * (VAL1));
+  TEST_ONE_PART_INF ((_Complex double)1 / (_Complex double)0);
+  TEST_ONE_PART_INF ((VAL1) / (_Complex double)1);
+
+  RUNTIME_TESTIT (double, 1, /, VAL1, 0);
+  STATICINIT_TESTIT (double, 1, /, VAL1, 0);
+
+  return 0;
+}
Index: testsuite/gcc.target/tic6x/fpcmp.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/fpcmp.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c67x" } */
+/* { dg-final { scan-assembler-times "cmpeq.p" 4 } } */
+
+double gedf (double x, double y)
+{
+  return x >= y;
+}
+
+double ledf (double x, double y)
+{
+  return x <= y;
+}
+
+float gesf (float x, float y)
+{
+  return x >= y;
+}
+
+float lesf (float x, float y)
+{
+  return x <= y;
+}
Index: testsuite/gcc.target/tic6x/tic6x.exp
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/tic6x.exp
@@ -0,0 +1,62 @@
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+if ![istarget tic6x-*-*] then {
+  return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Like dg-options, but treats certain C6X-specific options specially:
+#
+#    -march=*
+#	Select the target architecture. Skip the test if the multilib
+#	flags force a different arch.
+proc dg-c6x-options {args} {
+    upvar dg-extra-tool-flags extra_tool_flags
+    upvar dg-do-what do_what
+
+    set multilib_arch ""
+    set arch ""
+
+    foreach flag [target_info multilib_flags] {
+	regexp "^-march=(.*)" $flag dummy multilib_arch
+    }
+
+    set flags [lindex $args 1]
+
+    foreach flag $flags {
+	regexp "^-march=(.*)" $flag dummy arch
+    }
+
+    if {$multilib_arch == "" || $multilib_cpu == $arch} {
+	set extra_tool_flags $flags
+    } else {
+	set do_what [list [lindex $do_what 0] "N" "P"]
+    }
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]]	"" ""
+
+# All done.
+dg-finish
Index: testsuite/gcc.target/tic6x/fpdiv.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/fpdiv.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c67x" } */
+/* { dg-final { scan-assembler "rcpdp" } } */
+/* { dg-final { scan-assembler "rcpsp" } } */
+
+double f (double x, double y)
+{
+  return x / y;
+}
+
+float g (float x, float y)
+{
+  return x / y;
+}
Index: testsuite/gcc.target/tic6x/rotdi16-scan.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/rotdi16-scan.c
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler "dpackx" } } */
+
+#include <stdlib.h>
+
+unsigned long long z = 0x012389ab4567cdefull;
+
+int main ()
+{
+  unsigned long long z2 = (z << 48) | (z >> 16);
+  if (z2 != 0xcdef012389ab4567ull)
+    abort ();
+  exit (0);
+}
Index: testsuite/gcc.target/tic6x/ffssi.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/ffssi.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+int foo (int x)
+{
+  return __builtin_ffsl (x);
+}
+
+int bar (int x)
+{
+  return __builtin_clzl (x);
+}
+
+int baz (int x)
+{
+  return __builtin_ctzl (x);
+}
Index: testsuite/gcc.target/tic6x/fpdiv-lib.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/fpdiv-lib.c
@@ -0,0 +1,14 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c67x -fno-reciprocal-math" } */
+/* { dg-final { scan-assembler-not "rcpdp" } } */
+/* { dg-final { scan-assembler-not "rcpsp" } } */
+
+double f (double x, double y)
+{
+  return x / y;
+}
+
+float g (float x, float y)
+{
+  return x / y;
+}
Index: testsuite/gcc.target/tic6x/cold-lc.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/cold-lc.c
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mlong-calls" } */
+
+extern void dump_stack (void) __attribute__ ((__cold__));
+struct thread_info {
+    struct task_struct *task;
+};
+extern struct thread_info *current_thread_info (void);
+
+void dump_stack (void)
+{
+    unsigned long stack;
+    show_stack ((current_thread_info ()->task), &stack);
+}
+
+void die (char *str, void *fp, int nr)
+{
+    dump_stack ();
+    while (1);
+}
+
Index: testsuite/gcc.target/tic6x/longcalls.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/longcalls.c
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mlong-calls" } */
+/* { dg-final { scan-assembler-times "\\tcall\[p\]*\[\\t ]*.s" 3 } } */
+/* { dg-final { scan-assembler "call\[p\]*\[\\t ]*.s.\[\\t ]*.f" } } */
+/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.g" } } */
+/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.h" } } */
+
+int x;
+
+static __attribute__ ((noinline)) void f ()
+{
+  x = 5;
+}
+
+extern void g ();
+
+static __attribute__ ((noinline)) __attribute__((section(".init.text"))) void h ()
+{
+  x = 5;
+}
+
+int bar ()
+{
+  f ();
+  g ();
+  h ();
+}
Index: testsuite/gcc.target/tic6x/abi-align-1.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/abi-align-1.c
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+/* common */
+char c;
+/* arrays must be 8 byte aligned, regardless of size */
+char c_ary[1];
+
+/* data */
+char d = 1;
+char d_ary[1] = {1};
+
+int main ()
+{
+  if (((unsigned long)&c_ary[0] & 7) != 0)
+    return 1;
+  if (((unsigned long)&d_ary[0] & 7) != 0)
+    return 1;
+  return 0;
+}
Index: testsuite/gcc.target/tic6x/fpcmp-finite.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/fpcmp-finite.c
@@ -0,0 +1,23 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c67x -ffinite-math-only" } */
+/* { dg-final { scan-assembler-not "cmpeq" } } */
+
+double gedf (double x, double y)
+{
+  return x >= y;
+}
+
+double ledf (double x, double y)
+{
+  return x <= y;
+}
+
+float gesf (float x, float y)
+{
+  return x >= y;
+}
+
+float lesf (float x, float y)
+{
+  return x <= y;
+}
Index: testsuite/gcc.target/tic6x/rotdi16.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/rotdi16.c
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -march=c64x+" } */
+
+#include <stdlib.h>
+
+unsigned long long z = 0x012389ab4567cdefull;
+
+int main ()
+{
+  unsigned long long z2 = (z << 48) | (z >> 16);
+  if (z2 != 0xcdef012389ab4567ull)
+    abort ();
+  exit (0);
+}
Index: testsuite/gcc.target/tic6x/bswapl.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/bswapl.c
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+int foo (int x)
+{
+  return __builtin_bswap32 (x);
+}
+
+long long bar (long long x)
+{
+  return __builtin_bswap64 (x);
+}
Index: testsuite/gcc.target/tic6x/ffsdi.c
===================================================================
--- /dev/null
+++ testsuite/gcc.target/tic6x/ffsdi.c
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+long long foo (long long x)
+{
+  return __builtin_ffsll (x);
+}
+
+long long bar (long long x)
+{
+  return __builtin_clzll (x);
+}
+
+long long baz (long long x)
+{
+  return __builtin_ctzll (x);
+}
Index: testsuite/lib/target-supports.exp
===================================================================
--- testsuite/lib/target-supports.exp.orig
+++ testsuite/lib/target-supports.exp
@@ -564,6 +564,7 @@ proc check_profiling_available { test_wh
 	     || [istarget powerpc-*-eabi*]
 	     || [istarget powerpc-*-elf]
 	     || [istarget rx-*-*]	
+	     || [istarget tic6x-*-elf]
 	     || [istarget xstormy16-*]
 	     || [istarget xtensa*-*-elf]
 	     || [istarget *-*-netware*]
Index: testsuite/gcc.c-torture/execute/20101011-1.c
===================================================================
--- testsuite/gcc.c-torture/execute/20101011-1.c.orig
+++ testsuite/gcc.c-torture/execute/20101011-1.c
@@ -12,6 +12,9 @@
 #elif defined (__sh__)
   /* On SH division by zero does not trap.  */
 # define DO_TEST 0
+#elif defined (__TMS320C6X__)
+  /* On TI C6X division by zero does not trap.  */
+# define DO_TEST 0
 #elif defined (__mips__) && !defined(__linux__)
   /* MIPS divisions do trap by default, but libgloss targets do not
      intercept the trap and raise a SIGFPE.  The same is probably
Index: testsuite/gcc.dg/pr27095.c
===================================================================
--- testsuite/gcc.dg/pr27095.c.orig
+++ testsuite/gcc.dg/pr27095.c
@@ -16,10 +16,11 @@ main (int argc, char **argv)
   memset (x, argc, strlen (x));
   return 0;
 }
-/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* } } } } } */
+/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* tic6x-*-* } } } } } */
 /* hppa*-*-hpux* has an IMPORT statement for strlen (plus the branch). */
 /* *-*-darwin* has something similar. */
-/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* } } } */
+/* tic6x emits a comment at the point where the delayed branch happens.  */
+/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* tic6x-*-* } } } */
 /* { dg-final { scan-assembler-not "(?n)bl L_strlen\(.*\n\)+.*bl L_strlen" { target powerpc*-*-darwin* } } } */
 /* ia64-*-hpux* has a global statement, a type statement, and the branch. */
 /* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target ia64-*-hpux* } } } */
Index: testsuite/gcc.dg/torture/pr37868.c
===================================================================
--- testsuite/gcc.dg/torture/pr37868.c.orig
+++ testsuite/gcc.dg/torture/pr37868.c
@@ -1,6 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-fno-strict-aliasing" } */
-/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* } "*" "" } */
+/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* tic6x-*-* } "*" "" } */
 
 extern void abort (void);
 #if (__SIZEOF_INT__ <= 2)
Index: testsuite/gcc.dg/torture/builtin-math-7.c
===================================================================
--- testsuite/gcc.dg/torture/builtin-math-7.c.orig
+++ testsuite/gcc.dg/torture/builtin-math-7.c
@@ -5,6 +5,7 @@
    Origin: Kaveh R. Ghazi,  August 13, 2009.  */
 
 /* { dg-do run } */
+/* { dg-skip-if "" { tic6x-*-* } "*" "" } */
 /* { dg-add-options ieee } */
 
 extern void link_error(int);
Index: testsuite/gcc.dg/20020312-2.c
===================================================================
--- testsuite/gcc.dg/20020312-2.c.orig
+++ testsuite/gcc.dg/20020312-2.c
@@ -64,6 +64,8 @@ extern void abort (void);
 # define PIC_REG  "12"
 #elif defined(__sparc__)
 # define PIC_REG  "l7"
+#elif defined(__TMS320C6X__)
+# define PIC_REG "B14"
 #elif defined(__v850)
 /* No pic register.  */
 #elif defined(__vax__)

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 10/11: The port
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (8 preceding siblings ...)
  2011-05-10 16:56 ` C6X port 11/11: Testcases Bernd Schmidt
@ 2011-05-10 17:02 ` Bernd Schmidt
  2011-05-10 22:51   ` Joseph S. Myers
  2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
                   ` (6 subsequent siblings)
  16 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-10 17:02 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 1780 bytes --]

This adds config/c6x and various bits and pieces elsewhere to enable it.
This didn't make it on the first attempt to due size limits, hence gzipped.

	* doc/invoke.texi (C6X Options): New section.
	* doc/md.texi (TI C6X family): New section.
	* config.gcc: Handle tic6x, in particular tic6x-*-elf and
	tic6x-*-uclinux.
	config/c6x/uclinux-elf.h: New file.
	config/c6x/predicates.md: New file.
	config/c6x/unwind-c6x.c: New file.
	config/c6x/t-opts: New file.
	config/c6x/t-c6x-uclinux: New file.
	config/c6x/c6x-sched.md.in: New file.
	config/c6x/unwind-c6x.h: New file.
	config/c6x/c6x-isas.def: New file.
	config/c6x/elf.h: New file.
	config/c6x/gtd.c: New file.
	config/c6x/c6x.md: New file.
	config/c6x/gtf.c: New file.
	config/c6x/t-c6x: New file.
	config/c6x/c6x.opt: New file.
	config/c6x/ltd.c: New file.
	config/c6x/lib1funcs.asm: New file.
	config/c6x/t-c6x-elf: New file.
	config/c6x/ltf.c: New file.
	config/c6x/c6x-opts.h: New file.
	config/c6x/c6x-protos.h: New file.
	config/c6x/sync.md: New file.
	config/c6x/c6x-mult.md: New file.
	config/c6x/sfp-machine.h: New file.
	config/c6x/ged.c: New file.
	config/c6x/c6x.c: New file.
	config/c6x/gef.c: New file.
	config/c6x/c6x-sched.md: New file.
	config/c6x/c6x-mult.md.in: New file.
	config/c6x/genmult.sh: New file.
	config/c6x/led.c: New file.
	config/c6x/c6x.h: New file.
	config/c6x/lef.c: New file.
	config/c6x/gensched.sh: New file.
	config/c6x/eqd.c: New file.
	config/c6x/libunwind.S: New file.
	config/c6x/eqf.c: New file.
	config/c6x/t-c6x-softfp: New file.
	config/c6x/crti.s: New file.
	config/c6x/c6x-modes.def: New file.
	config/c6x/genopt.sh: New file.
	config/c6x/constraints.md: New file.
	config/c6x/crtn.s: New file.
	config/c6x/c6x-tables.opt: New file.
	config/c6x/pr-support.c: New file.

Bernd

[-- Attachment #2: c6xport.diff.gz --]
[-- Type: application/x-gzip, Size: 98284 bytes --]

[-- Attachment #3: c6x-libgcc.diff --]
[-- Type: text/plain, Size: 474 bytes --]

	* config.host: Handle tic6x-*-*.

Index: libgcc/config.host
===================================================================
--- libgcc/config.host	(revision 173564)
+++ libgcc/config.host	(working copy)
@@ -137,6 +137,9 @@ s390*-*-*)
 sh[123456789lbe]*-*-*)
 	cpu_type=sh
 	;;
+tic6x-*-*)
+	cpu_type=c6x
+	;;
 esac
 
 # Common parts for widely ported systems.
@@ -544,6 +547,8 @@ sparc64-*-netbsd*)
 	;;
 spu-*-elf*)
 	;;
+tic6x-*-*)
+	;;
 v850e1-*-*)
 	;;
 v850e-*-*)

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (9 preceding siblings ...)
  2011-05-10 17:02 ` C6X port 10/11: The port Bernd Schmidt
@ 2011-05-10 18:29 ` Joseph S. Myers
  2011-05-11 12:18   ` Bernd Schmidt
  2011-05-13 14:57   ` C6X port 13/11: MAINTAINERS Bernd Schmidt
  2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
                   ` (5 subsequent siblings)
  16 siblings, 2 replies; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-10 18:29 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Paul Brook, Nathan Sidwell

On Tue, 10 May 2011, Bernd Schmidt wrote:

> Binutils and uClibc already contain C6X patches; unfortunately there
> isn't an open-source sim.

The newlib support is also upstream.

> I've also run c6x tests, which look fairly clean on the whole.

Does this testing cover all six architecture variants (c62x, c64x, c64x+, 
c67x, c67x+, c674x), for both big and little endian?

General comments on apparently missing pieces by reference to the new-port 
checklist in sourcebuild.texi:

* contrib.texi should be updated.

* There should probably be something in install.texi.  (Noting 2.22 as the 
minimum binutils version, supposing that features not in 2.21 are in fact 
required by the port?)

* Add the two new targets to contrib/config-list.mk (and confirm they do 
pass --enable-werror-always builds with current trunk GCC).

* Web site updates (readings.html, backends.html, news item for 
index.html).

* If you are volunteering to be maintainer of the port, make that explicit 
(and probably post to gcc@ for the attention of the SC; maintainership 
needs approving by the SC, separately from the technical review of the 
patches).

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-10 16:51 ` C6X port 8/11: A new FUNCTION_ARG macro Bernd Schmidt
@ 2011-05-10 18:55   ` Joseph S. Myers
  2011-05-12 18:20     ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-10 18:55 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Tue, 10 May 2011, Bernd Schmidt wrote:

> On C6X, we have PARM_BOUNDARY == 8 (one byte), but some function
> argument slots still must be rounded to a larger value. As far as I
> could tell there's currently no way of telling gcc about this, hence a
> new target macro which controls this behaviour.

Is there a good reason this has to be a macro rather than a hook in 
targetm.calls?  Hooks are generally strongly preferred.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-10 17:02 ` C6X port 10/11: The port Bernd Schmidt
@ 2011-05-10 22:51   ` Joseph S. Myers
  2011-05-13 13:59     ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-10 22:51 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Tue, 10 May 2011, Bernd Schmidt wrote:

> 	* doc/invoke.texi (C6X Options): New section.
> 	* doc/md.texi (TI C6X family): New section.
> 	* config.gcc: Handle tic6x, in particular tic6x-*-elf and
> 	tic6x-*-uclinux.
> 	config/c6x/uclinux-elf.h: New file.
> 	config/c6x/predicates.md: New file.

[...]

The new files seem to be listed in random order.  If you don't have a 
better order, I advise alphabetical order - *not* the random order "svn 
diff" uses.  (The ChangeLog entries should also all have a leading "* ".)

General comment: there are lots of new files here that are built for the 
target, and if possible it's preferable for such sources to be under 
libgcc/config/ with associated build rules also located there not in the 
gcc/ directory.

> +tic6x-*-uclinux)
> +	tm_file="elfos.h ${tm_file} dbxelf.h c6x/elf.h tm-dwarf2.h c6x/uclinux-elf.h"

All targets based on the Linux kernel (with or without MMU) should now be 
using gnu-user.h and linux.h (and then overriding anything inappropriate 
from those headers).  There's a legacy issue that alpha*-*-linux* 
arm*-*-uclinux* powerpc-*-linux* powerpc64-*-linux* don't use those 
headers, but new Linux targets not using them should not be added.

> +	tm_file="$tm_file glibc-stdint.h"
> +       	tmake_file="c6x/t-c6x c6x/t-c6x-elf c6x/t-c6x-uclinux c6x/t-opts"

Indentation seems odd here.

> +	tmake_file="$tmake_file c6x/t-c6x-softfp soft-fp/t-softfp"
> +	tm_file="$tm_file ./sysroot-suffix.h"
> +	tmake_file="$tmake_file t-sysroot-suffix"
> +	tmake_file="$tmake_file t-slibgcc-elf-ver"
> +       	use_collect2=no

And again.

You're using t-slibgcc-elf-ver, so presumably building shared libgcc with 
symbol versioning - but I don't see any C6X-specific version map to assign 
symbol versions to C6X-specific symbols (both __c6xabi_*, and the __gnu_* 
renamings of some GCC symbols to put them in a proper vendor namespace).  
Even if some functions have special ABIs preventing them from being called 
through the PLT, I'd expect most of the functions to be exported from 
shared libgcc.

> +	tic6x-*-*)
> +		supported_defaults="arch"
> +
> +		case ${with_arch} in
> +		"" | c64x+ | c674x)
> +			# OK
> +			;;
> +		*)
> +			echo "Unknown arch used in --with-arch=$with_arch." 1>&2
> +			exit 1
> +			;;

That list is inconsistent with the full set of six CPU variants supported 
by the port; I'd think all should be handled for --with-arch, even if the 
port isn't particularly well tuned for the older variants or some features 
don't work for them.

> +	  /* Treat any failure as the end of unwinding, to cope more
> +	     gracefully with missing EH information.  Mixed EH and
> +	     non-EH within one object will usually result in failure,
> +	     because the .ARM.exidx tables do not indicate the end
> +	     of the code to which they apply; but mixed EH and non-EH

Bogus ARM reference in a comment (and, Paul implemented linker support for 
closing address ranges for both ARM and C6X).

> +/* Common implementation for ARM ABI defined personality routines.

Another bogus ARM reference.

> Index: config/c6x/t-opts
> ===================================================================
> --- /dev/null
> +++ config/c6x/t-opts
> @@ -0,0 +1,4 @@
> +$(srcdir)/config/c6x/c6x-tables.opt: $(srcdir)/config/c6x/genopt.sh \
> +  $(srcdir)/config/c6x/c6x-isas.def
> +	$(SHELL) $(srcdir)/config/c6x/genopt.sh $(srcdir)/config/c6x > \
> +		$(srcdir)/config/c6x/c6x-tables.opt

I don't think it makes sense for this to be separate from t-c6x.  m68k has 
t-opts because t-m68k *isn't* used for all m68k targets (only for classic 
m68k as opposed to ColdFire); that issue doesn't apply here.  (I'm not 
convinced it makes sense to separate t-c6x and t-c6x-elf either.)

> +#ifndef UNWIND_ARM_H
> +#define UNWIND_ARM_H

Is something elsewhere testing this particular spelling?  If not, ARM 
should not be referenced here.

> +#endif /* defined UNWIND_ARM_H */

Likewise.

> +#undef CC1_SPEC
> +#define CC1_SPEC "%{G*}"

You're not using g.opt, so the -G option doesn't exist for this target, so 
this spec is suspicious.

> +/* Make __c6xabi_AEABI_NAME an alias for __GCC_NAME.  */
> +#define RENAME_LIBRARY(GCC_NAME, AEABI_NAME)			\
> +  __asm__ (".globl\t__c6xabi_" #AEABI_NAME "\n"		\
> +	   ".set\t__c6xabi_" #AEABI_NAME			\
> +	   ", __" #GCC_NAME "\n");
> +
> +/* Rename helper functions to the names specified in the C6000 ELF ABI.  */
> +#ifdef L_divsi3
> +#define DECLARE_LIBRARY_RENAMES RENAME_LIBRARY (divsi3, divi)
> +#endif

All this code now needs to go in a header in libgcc/config/, listed in 
libgcc_tm_file.

> +$(srcdir)/config/c6x/c6x-sched.md: $(srcdir)/config/c6x/gensched.sh \
> +  $(srcdir)/config/c6x/c6x-sched.md.in
> +	$(SHELL) $(srcdir)/config/c6x/gensched.sh \
> +	$(srcdir)/config/c6x/c6x-sched.md.in > $@
> +
> +$(srcdir)/config/c6x/c6x-mult.md: $(srcdir)/config/c6x/genmult.sh \
> +  $(srcdir)/config/c6x/c6x-mult.md.in
> +	$(SHELL) $(srcdir)/config/c6x/genmult.sh \
> +	$(srcdir)/config/c6x/c6x-mult.md.in > $@

Generated files in the source tree should be accompanied by 
timestamp-updating rules on contrib/gcc_update (this also applies to the 
file generated by t-opts).

> +msdata=
> +Target RejectNegative Enum(c6x_sdata) Joined Var(c6x_sdata_mode) Init(C6X_SDATA_DEFAULT)
> +Select method for sdata handling
> +
> +Enum
> +Name(c6x_sdata) Type(enum c6x_sdata)
> +

It's desirable for --target-help to show the list of valid values, either 
in the help for the individual option (as for various Enum options in 
common.opt, using the TAB-separated form of help text) or by adding a help 
text to the Enum definition.

> Index: config/c6x/c6x.c

> +#include "tm.h"

> +#include "toplev.h"

Most targets no longer need to include toplev.h, does this one actually 
use any functions from it?

> +#include "c6x.h"

Redundant with the above include of tm.h.

> +#include "c6x-protos.h"

Would normally be included via tm_p.h.

> +#if 0 /* FIXME: Reenable when TI's tools are fixed.  */
> +  /* ??? Ideally we'd check flag_short_wchar somehow.  */
> +  asm_fprintf (asm_out_file, "\t.c6xabi_attribute Tag_ABI_wchar_t, %d\n", 2);
> +#endif

ARM has arm_output_c_attributes in arm-c.c.

> Index: config/c6x/c6x-sched.md
> ===================================================================
> --- /dev/null
> +++ config/c6x/c6x-sched.md
> @@ -0,0 +1,838 @@
> +;; -*- buffer-read-only: t -*-
> +;; Generated automatically from c6x-sched.md.in by gensched.sh
> +

Should have copyright/license notice (probably copied from the input 
file).

> +/* Define this to nonzero if the nominal address of the stack frame
> +   is at the high-address end of the local variables;
> +   that is, each additional local variable allocated
> +   goes at a more negative offset in the frame.  */
> +#define FRAME_GROWS_DOWNWARD 1
> +
> +/* Define this if pushing a word on the stack
> +   makes the stack pointer a smaller address.  */
> +#define STACK_GROWS_DOWNWARD

These look like generic comments (which should be avoided in target 
headers) instead of saying anything C6X-specific.

> +#define FUNCTION_PROFILER(file, labelno) \
> +  fatal_error("Profiling is not yet implemented for this architecture.")

Diagnostics should not start with a capital letter or end with "." (and 
note missing space before "(" in function call).

> +/* Definitions for register eliminations.
> +
> +   This is an array of structures.  Each structure initializes one pair
> +   of eliminable registers.  The "from" register number is given first,
> +   followed by "to".  Eliminations of the same "from" register are listed
> +   in order of preference.  */

Generic.

> +/* `LEGITIMATE_PIC_OPERAND_P (X)'
> +     A C expression that is nonzero if X is a legitimate immediate
> +     operand on the target machine when generating position independent
> +     code.  You can assume that X satisfies `CONSTANT_P', so you need
> +     not check this.  You can also assume FLAG_PIC is true, so you need
> +     not check it either.  You need not define this macro if all
> +     constants (including `SYMBOL_REF') can be immediate operands when
> +     generating position independent code. */

Generic.

> +/* A C expression to modify the code described by the conditional if
> +   information CE_INFO with the new PATTERN in INSN.  If PATTERN is a null
> +   pointer after the IFCVT_MODIFY_INSN macro executes, it is assumed that that
> +   insn cannot be converted to be executed conditionally.

Generic.

> +
> +   The ADDA insns used for accessing small data aren't predicable.  */

This seems to be the only bit of this comment that's C6X-specific.

> +/* Define this macro if it is as good or better to call a constant
> +   function address than to call an address kept in a register.  */

Generic.

> Index: config/c6x/libunwind.S
> ===================================================================
> --- /dev/null
> +++ config/c6x/libunwind.S
> @@ -0,0 +1,133 @@
> +.text

Appears to need standard libgcc copyright/license notice.

> Index: config/c6x/crti.s
> ===================================================================
> --- /dev/null
> +++ config/c6x/crti.s
> @@ -0,0 +1,17 @@
> +/*
> + * This file just supplies function prologues for the .init and .fini
> + * sections.  It is linked in before crtbegin.o.
> + */

Likewise.

> Index: config/c6x/crtn.s
> ===================================================================
> --- /dev/null
> +++ config/c6x/crtn.s
> @@ -0,0 +1,19 @@
> +/*
> + * This file supplies function epilogues for the .init and .fini sections.
> + * It is linked in after all other files.
> + */

Likewise.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 4/11: Backtracking scheduler
  2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
@ 2011-05-11  9:14   ` Richard Sandiford
  2011-05-11 11:24     ` Bernd Schmidt
  2011-05-25 10:16   ` Hans-Peter Nilsson
  1 sibling, 1 reply; 99+ messages in thread
From: Richard Sandiford @ 2011-05-11  9:14 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

Bernd Schmidt <bernds@codesourcery.com> writes:
> Because of this problem, I've chosen a different model for this patch.
> Before calling the final sched_ebb pass, the port must split jump insns
> (or anything that should have delay slots) into two separate insns, a
> real insn and a shadow. As an example,
>
>  (jump_insn (set (pc) (label_ref 24)))
>
> becomes
>
>  (insn (unspec [(label_ref 24)] UNSPEC_REAL_JUMP)
>  (jump_insn (set (pc) (unspec [(pc)] UNSPEC_JUMP_SHADOW)
>
> where the first insn emits the branch into the assembly file, while the
> second one produces no output (or, in the case of C6X, a helpful comment
> that documents that the side effect takes place).

Neat!  It'll be interesting to see how easy it would be to convert
recog and in-tree delayed-branch targets to use this form instead of
SEQUENCEs.  It'd certainly be a big step towards keeping the CFG
around during and after md-reorg.  I might look at that (getting
rid of SEQUENCEs in the insn stream) "if I have time".  But...

...your message and examples all seem to emphasis unconditional jumps.
How good a job does the scheduler do for conditional jumps?  E.g. do we
steal from the branch target in cases where that's useful?

Or, more generally, do you think we're at the stage where all targets
could move away from reorg.c to this approach, or do you think more
work is needed on the scheduler first?

I realise the scheduler won't need to do everything that reorg.c does.
Running reorg.c on already-scheduled code (and without pipeline
information, and without a proper CFG or DF tracking) has so many
oft-discussed downsides that a properly integrated approach could
easily be better without copying all the tricks that reorg.c can do.
I was just wondering where you think the boundary is.

Richard

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 4/11: Backtracking scheduler
  2011-05-11  9:14   ` Richard Sandiford
@ 2011-05-11 11:24     ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-11 11:24 UTC (permalink / raw)
  To: GCC Patches, rdsandiford

On 05/11/2011 10:04 AM, Richard Sandiford wrote:
> Neat!  It'll be interesting to see how easy it would be to convert
> recog and in-tree delayed-branch targets to use this form instead of
> SEQUENCEs.  It'd certainly be a big step towards keeping the CFG
> around during and after md-reorg.  I might look at that (getting
> rid of SEQUENCEs in the insn stream) "if I have time".  But...
> 
> ...your message and examples all seem to emphasis unconditional jumps.
> How good a job does the scheduler do for conditional jumps?  E.g. do we
> steal from the branch target in cases where that's useful?

It uses sched-ebb, which means it sort of does a reasonable job, but
it's weaker than reorg.c in some respects. I'd like to turn sched-ebb
into sched-dag and add better support for predicating insns when moving
them across a branch (there's some code for it in c6x.c), but that'll
need more work.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
@ 2011-05-11 12:18   ` Bernd Schmidt
  2011-05-11 12:21     ` Joseph S. Myers
  2011-05-13 14:57   ` C6X port 13/11: MAINTAINERS Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-11 12:18 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, Paul Brook, Nathan Sidwell

On 05/10/2011 06:51 PM, Joseph S. Myers wrote:
> On Tue, 10 May 2011, Bernd Schmidt wrote:
> 
>> Binutils and uClibc already contain C6X patches; unfortunately there
>> isn't an open-source sim.
> 
> The newlib support is also upstream.
> 
>> I've also run c6x tests, which look fairly clean on the whole.
> 
> Does this testing cover all six architecture variants (c62x, c64x, c64x+, 
> c67x, c67x+, c674x), for both big and little endian?

No, not recently. In general, most effort is on c64x+ and c674x - as
shown by the multilib selection and by the --with-arch selection as you
noticed. Linux certainly won't run on anything else, although I suppose
I could give c6x-elf another try.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-11 12:18   ` Bernd Schmidt
@ 2011-05-11 12:21     ` Joseph S. Myers
  0 siblings, 0 replies; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-11 12:21 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Paul Brook, Nathan Sidwell

On Wed, 11 May 2011, Bernd Schmidt wrote:

> On 05/10/2011 06:51 PM, Joseph S. Myers wrote:
> > On Tue, 10 May 2011, Bernd Schmidt wrote:
> > 
> >> Binutils and uClibc already contain C6X patches; unfortunately there
> >> isn't an open-source sim.
> > 
> > The newlib support is also upstream.
> > 
> >> I've also run c6x tests, which look fairly clean on the whole.
> > 
> > Does this testing cover all six architecture variants (c62x, c64x, c64x+, 
> > c67x, c67x+, c674x), for both big and little endian?
> 
> No, not recently. In general, most effort is on c64x+ and c674x - as
> shown by the multilib selection and by the --with-arch selection as you
> noticed. Linux certainly won't run on anything else, although I suppose
> I could give c6x-elf another try.

I'd say that since the port has options for the older variants, it should 
at least be tested that they appear to work at the point the port goes in 
(will build libgcc / pass the testsuite for c6x-elf without ICEs or wrong 
code being generated) - though it will of course be for anyone in the 
community who wishes to use it on those variants to do any performance 
tuning for them, or add any missing features for the older variants, and 
it would be reasonable to call sorry () in any cases where an option, 
language feature etc. isn't currently supported for them.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 5/11: Track predication conditions more accurately
  2011-05-10 15:54 ` C6X port 5/11: Track predication conditions more accurately Bernd Schmidt
@ 2011-05-11 12:26   ` Alexander Monakov
  2011-05-12 18:31     ` Bernd Schmidt
  2011-05-31 20:34   ` Steve Ellcey
  1 sibling, 1 reply; 99+ messages in thread
From: Alexander Monakov @ 2011-05-11 12:26 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches


On Tue, 10 May 2011, Bernd Schmidt wrote:

> The scheduler knows that insns with different COND_EXEC conditions don't
> conflict and can be scheduled independently. Unfortunately, sched-deps.c
> does not try to keep the conditions valid as it progresses. For example,
> 
> [B0] A0 = [A1]
>      B0 = something
> [!B0] [A2] = A0
> 
> The first and third insns have opposite conditions, so the scheduler
> decides they are independent. For most targets this isn't a problem, as
> the insn in the middle will produce enough dependencies to ensure the
> right order. However, on C6X, order alone isn't sufficient due to the
> exposed pipeline: we also need to ensure that the latencies are observed.
> 

> @@ -2871,6 +2895,21 @@ sched_analyze_insn (struct deps_desc *de
>  	      }
>  	  }
>  
> +      INIT_REG_SET (&set_or_clobbered);
> +      bitmap_ior (&set_or_clobbered, reg_pending_clobbers, reg_pending_sets);
> +      EXECUTE_IF_SET_IN_REG_SET (&set_or_clobbered, 0, i, rsi)
> +	{
> +	  struct deps_reg *reg_last = &deps->reg_last[i];
> +	  rtx list;
> +	  for (list = reg_last->uses; list; list = XEXP (list, 1))
> +	    {
> +	      rtx other = XEXP (list, 0);
> +	      if (INSN_COND (other) != const_true_rtx
> +		  && refers_to_regno_p (i, i + 1, INSN_COND (other), NULL))
> +		INSN_COND (other) = const_true_rtx;
> +	    }
> +	}
> +
>        /* If the current insn is conditional, we can't free any
>  	 of the lists.  */
>        if (sched_has_condition_p (insn))           

Could the above be conditional on whether the target CPU is exposed-pipeline?
I'm concerned this may degrade scheduling for other targets in some cases.

I wonder if sharing predicate RTXes between setters and users could also be a
solution.  I even thought (until moments ago) GCC was already doing that, but
apparently I was mistaken, ifcvt.c explicitly does copy_rtx.

Thanks.

Alexander

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-10 18:55   ` Joseph S. Myers
@ 2011-05-12 18:20     ` Bernd Schmidt
  2011-05-17  7:19       ` Paolo Bonzini
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-12 18:20 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 567 bytes --]

On 05/10/2011 06:57 PM, Joseph S. Myers wrote:
> On Tue, 10 May 2011, Bernd Schmidt wrote:
> 
>> On C6X, we have PARM_BOUNDARY == 8 (one byte), but some function
>> argument slots still must be rounded to a larger value. As far as I
>> could tell there's currently no way of telling gcc about this, hence a
>> new target macro which controls this behaviour.
> 
> Is there a good reason this has to be a macro rather than a hook in 
> targetm.calls?  Hooks are generally strongly preferred.

New version below. An adapted version of the C6X port will follow.


Bernd


[-- Attachment #2: fartab.diff --]
[-- Type: text/plain, Size: 7087 bytes --]

	* doc/tm.texi.in (FUNCTION_ARG_PADDING): Mention
	TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY.
	(TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY): Add hook.
	* function.c (locate_and_pad_parm): Take it into account.
	* target.def (function_arg_round_to_arg_boundary): New hook.
	* hooks.c (hook_bool_mode_const_tree_false): New function.
	* hooks.h (hook_bool_mode_const_tree_false): Declare.
	* doc/tm.texi: Regenerate.

Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi.orig
+++ gcc/doc/tm.texi
@@ -4163,9 +4163,11 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro.  It is
+always just enough to reach the next multiple of the alignment boundary,
+which is usually @code{PARM_BOUNDARY}, or @code{FUNCTION_ARG_BOUNDARY}
+if @code{TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY} is overridden to
+return true.
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4198,6 +4200,12 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@deftypefn {Target Hook} bool TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY (enum machine_mode @var{mode}, const_tree @var{type})
+Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY}.
+Define this macro if you want the value of @code{FUNCTION_ARG_BOUNDARY}
+to be used for this rounding instead.
+@end deftypefn
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in.orig
+++ gcc/doc/tm.texi.in
@@ -4151,9 +4151,11 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro.  It is
+always just enough to reach the next multiple of the alignment boundary,
+which is usually @code{PARM_BOUNDARY}, or @code{FUNCTION_ARG_BOUNDARY}
+if @code{TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY} is overridden to
+return true.
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4186,6 +4188,8 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@hook TARGET_FUNCTION_ARG_ROUND_TO_ARG_BOUNDARY
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: gcc/function.c
===================================================================
--- gcc/function.c.orig
+++ gcc/function.c
@@ -3709,7 +3709,7 @@ locate_and_pad_parm (enum machine_mode p
 {
   tree sizetree;
   enum direction where_pad;
-  unsigned int boundary;
+  unsigned int boundary, round_boundary;
   int reg_parm_stack_space = 0;
   int part_size_in_regs;
 
@@ -3741,6 +3741,10 @@ locate_and_pad_parm (enum machine_mode p
     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
   boundary = targetm.calls.function_arg_boundary (passed_mode, type);
+  if (targetm.calls.function_arg_round_to_arg_boundary (passed_mode, type))
+    round_boundary = boundary;
+  else
+    round_boundary = PARM_BOUNDARY;
   locate->where_pad = where_pad;
 
   /* Alignment can't exceed MAX_SUPPORTED_STACK_ALIGNMENT.  */
@@ -3787,8 +3791,8 @@ locate_and_pad_parm (enum machine_mode p
     tree s2 = sizetree;
     if (where_pad != none
 	&& (!host_integerp (sizetree, 1)
-	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-      s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
+	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+      s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
     SUB_PARM_SIZE (locate->slot_offset, s2);
   }
 
@@ -3840,8 +3844,8 @@ locate_and_pad_parm (enum machine_mode p
 
   if (where_pad != none
       && (!host_integerp (sizetree, 1)
-	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-    sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
+	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+    sizetree = round_up (sizetree, round_boundary / BITS_PER_UNIT);
 
   ADD_PARM_SIZE (locate->size, sizetree);
 
Index: gcc/hooks.c
===================================================================
--- gcc/hooks.c.orig
+++ gcc/hooks.c
@@ -85,6 +85,14 @@ hook_bool_mode_true (enum machine_mode m
   return true;
 }
 
+/* Generic hook that takes (enum machine_mode, const_tree) and returns false.  */
+bool
+hook_bool_mode_const_tree_false (enum machine_mode mode ATTRIBUTE_UNUSED,
+				 const_tree value ATTRIBUTE_UNUSED)
+{
+  return false;
+}
+
 /* Generic hook that takes (enum machine_mode, const_rtx) and returns false.  */
 bool
 hook_bool_mode_const_rtx_false (enum machine_mode mode ATTRIBUTE_UNUSED,
Index: gcc/target.def
===================================================================
--- gcc/target.def.orig
+++ gcc/target.def
@@ -2053,6 +2053,14 @@ DEFHOOK
  unsigned int, (enum machine_mode mode, const_tree type),
  default_function_arg_boundary)
 
+DEFHOOK
+(function_arg_round_to_arg_boundary,
+ "Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY}.\n\
+Define this macro if you want the value of @code{FUNCTION_ARG_BOUNDARY}\n\
+to be used for this rounding instead.",
+ bool, (enum machine_mode mode, const_tree type),
+ hook_bool_mode_const_tree_false)
+
 /* Return the diagnostic message string if function without a prototype
    is not allowed for this 'val' argument; NULL otherwise. */
 DEFHOOK
Index: gcc/hooks.h
===================================================================
--- gcc/hooks.h.orig
+++ gcc/hooks.h
@@ -32,6 +32,7 @@ extern bool hook_bool_bool_gcc_optionsp_
 extern bool hook_bool_const_int_const_int_true (const int, const int);
 extern bool hook_bool_mode_false (enum machine_mode);
 extern bool hook_bool_mode_true (enum machine_mode);
+extern bool hook_bool_mode_const_tree_false (enum machine_mode, const_tree);
 extern bool hook_bool_mode_const_rtx_false (enum machine_mode, const_rtx);
 extern bool hook_bool_mode_const_rtx_true (enum machine_mode, const_rtx);
 extern bool hook_bool_mode_rtx_false (enum machine_mode, rtx);

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 5/11: Track predication conditions more accurately
  2011-05-11 12:26   ` Alexander Monakov
@ 2011-05-12 18:31     ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-12 18:31 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 339 bytes --]

On 05/11/2011 12:45 PM, Alexander Monakov wrote:

> Could the above be conditional on whether the target CPU is exposed-pipeline?

Can do. New patch below.

> I'm concerned this may degrade scheduling for other targets in some cases.

On the other hand, it may also improve scheduling. Hard to say which
case would be more common.


Bernd

[-- Attachment #2: insn-cond.diff --]
[-- Type: text/plain, Size: 6846 bytes --]

	* sched-int.h (struct _haifa_deps_insn_data): New members cond
	and reverse_cond.
	(INSN_COND, INSN_REVERSE_COND): New macros.
	* sched-deps.c (deps_analyze_insn): Call sched_get_condition_with_rev
	once.
	(sched_get_condition_with_rev): Cache the results, and look them up
	if possible.
	(sched_analyze_insn): Destroy INSN_COND of previous insns if they
	are clobbered by the current insn.
	* target.def (exposed_pipline): New sched data hook.
	* doc/tm.texi.in: TARGET_SCHED_EXPOSED_PIPELINE: Add hook.
	* doc/tm.texi: Regenerate.

Index: gcc/sched-deps.c
===================================================================
--- gcc/sched-deps.c.orig
+++ gcc/sched-deps.c
@@ -489,13 +489,27 @@ deps_may_trap_p (const_rtx mem)
 
 /* Find the condition under which INSN is executed.  If REV is not NULL,
    it is set to TRUE when the returned comparison should be reversed
-   to get the actual condition.  */
+   to get the actual condition.
+   We only do actual work the first time we come here for an insn; the
+   results are cached in INSN_COND and INSN_REVERSE_COND.  */
 static rtx
 sched_get_condition_with_rev (const_rtx insn, bool *rev)
 {
   rtx pat = PATTERN (insn);
   rtx src;
 
+  if (INSN_COND (insn) == const_true_rtx)
+    return NULL_RTX;
+
+  if (INSN_COND (insn) != NULL_RTX)
+    {
+      if (rev)
+	*rev = INSN_REVERSE_COND (insn);
+      return INSN_COND (insn);
+    }
+
+  INSN_COND (insn) = const_true_rtx;
+  INSN_REVERSE_COND (insn) = false;
   if (pat == 0)
     return 0;
 
@@ -503,7 +517,10 @@ sched_get_condition_with_rev (const_rtx
     *rev = false;
 
   if (GET_CODE (pat) == COND_EXEC)
-    return COND_EXEC_TEST (pat);
+    {
+      INSN_COND (insn) = COND_EXEC_TEST (pat);
+      return COND_EXEC_TEST (pat);
+    }
 
   if (!any_condjump_p (insn) || !onlyjump_p (insn))
     return 0;
@@ -511,7 +528,10 @@ sched_get_condition_with_rev (const_rtx
   src = SET_SRC (pc_set (insn));
 
   if (XEXP (src, 2) == pc_rtx)
-    return XEXP (src, 0);
+    {
+      INSN_COND (insn) = XEXP (src, 0);
+      return XEXP (src, 0);
+    }
   else if (XEXP (src, 1) == pc_rtx)
     {
       rtx cond = XEXP (src, 0);
@@ -522,6 +542,8 @@ sched_get_condition_with_rev (const_rtx
 
       if (rev)
 	*rev = true;
+      INSN_COND (insn) = cond;
+      INSN_REVERSE_COND (insn) = true;
       return cond;
     }
 
@@ -2841,6 +2863,8 @@ sched_analyze_insn (struct deps_desc *de
     }
   else
     {
+      regset_head set_or_clobbered;
+
       EXECUTE_IF_SET_IN_REG_SET (reg_pending_uses, 0, i, rsi)
 	{
 	  struct deps_reg *reg_last = &deps->reg_last[i];
@@ -2871,6 +2895,25 @@ sched_analyze_insn (struct deps_desc *de
 	      }
 	  }
 
+      if (targetm.sched.exposed_pipeline)
+	{
+	  INIT_REG_SET (&set_or_clobbered);
+	  bitmap_ior (&set_or_clobbered, reg_pending_clobbers,
+		      reg_pending_sets);
+	  EXECUTE_IF_SET_IN_REG_SET (&set_or_clobbered, 0, i, rsi)
+	    {
+	      struct deps_reg *reg_last = &deps->reg_last[i];
+	      rtx list;
+	      for (list = reg_last->uses; list; list = XEXP (list, 1))
+		{
+		  rtx other = XEXP (list, 0);
+		  if (INSN_COND (other) != const_true_rtx
+		      && refers_to_regno_p (i, i + 1, INSN_COND (other), NULL))
+		    INSN_COND (other) = const_true_rtx;
+		}
+	    }
+	}
+
       /* If the current insn is conditional, we can't free any
 	 of the lists.  */
       if (sched_has_condition_p (insn))
@@ -3245,6 +3288,10 @@ deps_analyze_insn (struct deps_desc *dep
   if (sched_deps_info->start_insn)
     sched_deps_info->start_insn (insn);
 
+  /* Record the condition for this insn.  */
+  if (NONDEBUG_INSN_P (insn))
+    sched_get_condition_with_rev (insn, NULL);
+
   if (NONJUMP_INSN_P (insn) || DEBUG_INSN_P (insn) || JUMP_P (insn))
     {
       /* Make each JUMP_INSN (but not a speculative check)
Index: gcc/sched-int.h
===================================================================
--- gcc/sched-int.h.orig
+++ gcc/sched-int.h
@@ -716,6 +716,17 @@ struct _haifa_deps_insn_data
      search in 'forw_deps'.  */
   deps_list_t resolved_forw_deps;
 
+  /* If the insn is conditional (either through COND_EXEC, or because
+     it is a conditional branch), this records the condition.  NULL
+     for insns that haven't been seen yet or don't have a condition;
+     const_true_rtx to mark an insn without a condition, or with a
+     condition that has been clobbered by a subsequent insn.  */
+  rtx cond;
+
+  /* True if the condition in 'cond' should be reversed to get the actual
+     condition.  */
+  unsigned int reverse_cond : 1;
+
   /* Some insns (e.g. call) are not allowed to move across blocks.  */
   unsigned int cant_move : 1;
 };
@@ -891,6 +902,8 @@ extern VEC(haifa_deps_insn_data_def, hea
 #define INSN_RESOLVED_FORW_DEPS(INSN) (HDID (INSN)->resolved_forw_deps)
 #define INSN_HARD_BACK_DEPS(INSN) (HDID (INSN)->hard_back_deps)
 #define INSN_SPEC_BACK_DEPS(INSN) (HDID (INSN)->spec_back_deps)
+#define INSN_COND(INSN)	(HDID (INSN)->cond)
+#define INSN_REVERSE_COND(INSN) (HDID (INSN)->reverse_cond)
 #define CANT_MOVE(INSN)	(HDID (INSN)->cant_move)
 #define CANT_MOVE_BY_LUID(LUID)	(VEC_index (haifa_deps_insn_data_def, h_d_i_d, \
                                             LUID)->cant_move)
Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi.orig
+++ gcc/doc/tm.texi
@@ -6776,6 +6776,12 @@ This hook is called by Haifa Scheduler.
 in its second parameter.
 @end deftypefn
 
+@deftypevr {Target Hook} bool TARGET_SCHED_EXPOSED_PIPELINE
+True if the processor has an exposed pipeline, which means that not just
+the order of instructions is important for correctness when scheduling, but
+also the latencies of operations.
+@end deftypevr
+
 @node Sections
 @section Dividing the Output into Sections (Texts, Data, @dots{})
 @c the above section title is WAY too long.  maybe cut the part between
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in.orig
+++ gcc/doc/tm.texi.in
@@ -6728,6 +6728,8 @@ This hook is called by Haifa Scheduler.
 in its second parameter.
 @end deftypefn
 
+@hook TARGET_SCHED_EXPOSED_PIPELINE
+
 @node Sections
 @section Dividing the Output into Sections (Texts, Data, @dots{})
 @c the above section title is WAY too long.  maybe cut the part between
Index: gcc/target.def
===================================================================
--- gcc/target.def.orig
+++ gcc/target.def
@@ -897,6 +897,13 @@ DEFHOOK
 bool, (rtx insn, int x),
 hook_bool_rtx_int_false)
 
+DEFHOOKPOD
+(exposed_pipeline,
+"True if the processor has an exposed pipeline, which means that not just\n\
+the order of instructions is important for correctness when scheduling, but\n\
+also the latencies of operations.",
+bool, false)
+
 HOOK_VECTOR_END (sched)
 
 /* Functions relating to vectorization.  */

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-10 22:51   ` Joseph S. Myers
@ 2011-05-13 13:59     ` Bernd Schmidt
  2011-05-13 15:52       ` Joseph S. Myers
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 13:59 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, Paul Brook

[-- Attachment #1: Type: text/plain, Size: 7118 bytes --]

On 05/10/2011 09:53 PM, Joseph S. Myers wrote:
> General comment: there are lots of new files here that are built for the 
> target, and if possible it's preferable for such sources to be under 
> libgcc/config/ with associated build rules also located there not in the 
> gcc/ directory.

I've made an attempt to move over the floating-point library functions,
but this doesn't work since the include paths aren't set up properly -
sfp-machine.h isn't found regardless of where it is placed. So I've left
things in place for now.

I'm also unsure what to do about t-c6x-softfp. I've noticed that e.g.
moxie has two copies of the corresponding file, but I don't know why.

>> +tic6x-*-uclinux)
>> +	tm_file="elfos.h ${tm_file} dbxelf.h c6x/elf.h tm-dwarf2.h c6x/uclinux-elf.h"
> 
> All targets based on the Linux kernel (with or without MMU) should now be 
> using gnu-user.h and linux.h

Changed (or added rather). I've split the elf.h header file into two to
make better use of this.

>> +	tm_file="$tm_file glibc-stdint.h"
>> +       	tmake_file="c6x/t-c6x c6x/t-c6x-elf c6x/t-c6x-uclinux c6x/t-opts"
> 
> Indentation seems odd here.

Tabs vs spaces, corrected.

> You're using t-slibgcc-elf-ver, so presumably building shared libgcc with 
> symbol versioning - but I don't see any C6X-specific version map to assign 
> symbol versions to C6X-specific symbols (both __c6xabi_*, and the __gnu_* 
> renamings of some GCC symbols to put them in a proper vendor namespace).  

So far using --enable-shared isn't recommended anyway, since nothing
sets the DSBT index in the resulting shared libraries. Hence it hasn't
been necessary up to this point.
However, I've now made use of the 9.5/11 patch I sent earlier which
enables __gnu_ prefixes for libgcc functions, and added a .ver file for
the c6xabi functions. So far the .ver file is hardly tested (Paul,
please check the unwind symbols - copied from the ARM version of the
file. Is restore_core_regs supposed to be hidden?).

>> +		case ${with_arch} in
>> +		"" | c64x+ | c674x)
> 
> That list is inconsistent with the full set of six CPU variants supported 
> by the port; I'd think all should be handled for --with-arch

Changed.

>> +	  /* Treat any failure as the end of unwinding, to cope more
>> +	     gracefully with missing EH information.  Mixed EH and
>> +	     non-EH within one object will usually result in failure,
>> +	     because the .ARM.exidx tables do not indicate the end
>> +	     of the code to which they apply; but mixed EH and non-EH
> 
> Bogus ARM reference in a comment (and, Paul implemented linker support for 
> closing address ranges for both ARM and C6X).

Changed the ARM thing, but I'll have to defer to Paul to correctly
modify the rest of the comment when he submits the rest of the EH work.

>> +/* Common implementation for ARM ABI defined personality routines.
> 
> Another bogus ARM reference.

Changed.

>> --- /dev/null
>> +++ config/c6x/t-opts

> I don't think it makes sense for this to be separate from t-c6x.

Changed.

>> +#ifndef UNWIND_ARM_H
>> +#define UNWIND_ARM_H

Changed.

>> +#undef CC1_SPEC
>> +#define CC1_SPEC "%{G*}"
> 
> You're not using g.opt, so the -G option doesn't exist for this target, so 
> this spec is suspicious.

Removed. We were using -G at some point but it doesn't work with this ABI.

>> +/* Make __c6xabi_AEABI_NAME an alias for __GCC_NAME.  */

> All this code now needs to go in a header in libgcc/config/, listed in 
> libgcc_tm_file.

Changed. However, there's no libgcc_tm_file as far as I can see and
other ports add the header to tm_file.

> Generated files in the source tree should be accompanied by 
> timestamp-updating rules on contrib/gcc_update (this also applies to the 
> file generated by t-opts).

Fixed.

> It's desirable for --target-help to show the list of valid values, either 
> in the help for the individual option (as for various Enum options in 
> common.opt, using the TAB-separated form of help text) or by adding a help 
> text to the Enum definition.

I've done the latter. Text added to the EnumValues appears to be
ignored, is that correct?

>> Index: config/c6x/c6x.c
> 
>> +#include "tm.h"
> 
>> +#include "toplev.h"
> 
>> +#include "c6x.h"
> 
>> +#include "c6x-protos.h"

Includes fixed up.

>> +#if 0 /* FIXME: Reenable when TI's tools are fixed.  */
>> +  /* ??? Ideally we'd check flag_short_wchar somehow.  */
>> +  asm_fprintf (asm_out_file, "\t.c6xabi_attribute Tag_ABI_wchar_t, %d\n", 2);
>> +#endif
> 
> ARM has arm_output_c_attributes in arm-c.c.

Thanks. Will revisit later once we can actually generate the attribute.

>> Index: config/c6x/c6x-sched.md
>> ===================================================================
>> --- /dev/null
>> +++ config/c6x/c6x-sched.md
>> @@ -0,0 +1,838 @@
>> +;; -*- buffer-read-only: t -*-
>> +;; Generated automatically from c6x-sched.md.in by gensched.sh
>> +
> 
> Should have copyright/license notice (probably copied from the input 
> file).

I've removed the bit that strips out comments.

> These look like generic comments (which should be avoided in target 
> headers) instead of saying anything C6X-specific.

All removed.

>> +#define FUNCTION_PROFILER(file, labelno) \
>> +  fatal_error("Profiling is not yet implemented for this architecture.")
> 
> Diagnostics should not start with a capital letter or end with "." (and 
> note missing space before "(" in function call).

Fixed.

>> Index: config/c6x/libunwind.S
>> Index: config/c6x/crti.s
>> Index: config/c6x/crtn.s
> Appears to need standard libgcc copyright/license notice.

Added.

> * contrib.texi should be updated.

Not sure what I should do here, but I've modified my own entry a bit. I
suppose Paul can add himself for the EH stuff. There appear to be
entries only for individuals, not companies (with one exception).

> * There should probably be something in install.texi.  (Noting 2.22 as the 
> minimum binutils version, supposing that features not in 2.21 are in fact 
> required by the port?)

I guess it's probably better to require 2.22. I couldn't come up with
more than a one-liner to write here though.

> * Add the two new targets to contrib/config-list.mk (and confirm they do 
> pass --enable-werror-always builds with current trunk GCC).

Added. I've tried to change my builds to use that option, but there are
lots of errors that appear unrelated to the C6X port. c6x.o compiles
without warnings.

Also added: a C6X version of longlong.h, and some recent changes from
our 4.5 tree.

This version has been tested with the complete set of targets on
c6x-elf. Results are the same for big- and little-endian in all cases.
Cleanup tests fail (they require Paul's EH work), and there seem to be a
few non-C6X related failures that don't appear with our 4.5 tree:
 - if an address is truncated to HImode or QImode, the compiler
   appears not to use legitimate_address_p and crashes with -mdsbt.
   Two testcases.
 - gcc.dg/march.c fails due to extra help text
 - gcc.dg/pr45259.c produces unexpected errors
 - gcc.dg/pr48335-2.c crashes in expand_expr_addr_expr_1
Other than that it all seems as expected.


Bernd

[-- Attachment #2: c6xport.diff.gz --]
[-- Type: application/x-gzip, Size: 98241 bytes --]

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (10 preceding siblings ...)
  2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
@ 2011-05-13 13:59 ` Bernd Schmidt
  2011-05-13 15:23   ` Joseph S. Myers
                     ` (2 more replies)
  2011-05-13 14:26 ` C6X port 12/11: htdocs Bernd Schmidt
                   ` (4 subsequent siblings)
  16 siblings, 3 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 13:59 UTC (permalink / raw)
  To: GCC Patches; +Cc: Henderson, Stuart, Mike Frysinger

[-- Attachment #1: Type: text/plain, Size: 1613 bytes --]

For C6X, we'd prefer to move libgcc symbols into the __gnu_ namespace as
much as possible. The standard DECLARE_LIBRARY_RENAME method only allows
us to define an extra __c6xabi_ variant for each symbol, but does not
eliminate libgcc's normal symbols.

The following patch adds a target hook and a corresponding LIBGCC2_
macro which control the generation of library function names. It also
makes libgcc-std.ver a generated file, built from libgcc-std.ver.in by
replacing some placeholders with the correct prefixes. While I was
there, I also added functionality to generate a version of this file
with an extra underscore for the Blackfin port.

Not all symbols are modified, only the ones for which there are
reasonably standard patterns (in optabs.c, libgcc2.[ch] and
fixed-bit.h). fp-bit is unchanged, it probably shouldn't be used in new
ports anyway. soft-fp is used by C6X, but we simply redefine the
function names to __c6xabi_ so no extra mechanism is needed here.

This leaves various odds and ends such as _Unwind_xxx,
__register_frame_info, __sync_xxx, __emutls, etc. for which I've not
made an attempt to change the names.

Bootstrapped and regression tested on i686-linux. Additionally tested
with the next version of the c6x port which I'll submit soon. I've built
a bfin-linux-uclibc compiler and verified that the shared libgcc looks
sane, but my boards are currently not connected up - Stuart or Mike,
could you test this? Finally, I've also built a partial mips64-linux
toolchain with __gnu prefixes enabled and verified that we don't seem to
be missing any libgcc symbols unexpectedly.


Bernd

[-- Attachment #2: libfuncs-prefix.diff --]
[-- Type: text/plain, Size: 148172 bytes --]

	gcc/
	* libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if
	LIBGCC2_GNU_PREFIX is defined.
	(__N): New macro.
	(__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2,
	__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3,
	__divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack,
	__clz_tab): Define using __N.
	(__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if
	COMPAT_SIMODE_TRAPPING_ARITHMETIC.
	* target.def (libfunc_gnu_prefix): New hook.
	* doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document.
	(TARGET_LIBFUNC_GNU_PREFIX): Add hook.
	* doc/tm.texi: Regenerate.
	* optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into
	account.
	(gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
	(init_optabs): Likewise for the bswap libfuncs.
	* tree.c (build_common_builtin_nodes): Likewise for complex multiply
	and divide.
	* config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir).
	* config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise.
	* libgcc-std.ver: Remove.
	* Makefile.in (srcdirify): Handle $$(libgcc_objdir).
	* config/bfin/libgcc-bfin.ver: Remove.
	* config/bfin/t-bfin-linux (SHLIB_MAPFILES): Remove.
	* config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for
	libgcc-std.ver.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise.
	* config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise.
	* config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise.
	* config/sparc/t-linux (SHLIB_MAPFILES): Likewise.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/fixed-bit.h (FIXED_OP): Define differently depending on
	LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores.
	(FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise.

	libgcc/
	* libgcc-std.ver.in: New file.
	* Makefile.in (LIBGCC_VER_GNU_PREFIX, LIBGCC_VER_SYMBOLS_PREFIX): New
	variables.
	(libgcc-std.ver): New rule.
	* config/t-gnu-prefix: New file.
	* config/t-underscore-prefix: New file.

Index: trunk/gcc/libgcc2.h
===================================================================
--- trunk.orig/gcc/libgcc2.h
+++ trunk/gcc/libgcc2.h
@@ -193,8 +193,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	UDItype
 #define DWtype	TItype
 #define UDWtype	UTItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## di ## b
+#define __NDW(a,b)	__gnu_ ## a ## ti ## b
+#else
 #define __NW(a,b)	__ ## a ## di ## b
 #define __NDW(a,b)	__ ## a ## ti ## b
+#endif
 #define COMPAT_SIMODE_TRAPPING_ARITHMETIC
 #elif LIBGCC2_UNITS_PER_WORD == 4
 #define W_TYPE_SIZE (4 * BITS_PER_UNIT)
@@ -204,8 +209,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	USItype
 #define DWtype	DItype
 #define UDWtype	UDItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## si ## b
+#define __NDW(a,b)	__gnu_ ## a ## di ## b
+#else
 #define __NW(a,b)	__ ## a ## si ## b
 #define __NDW(a,b)	__ ## a ## di ## b
+#endif
 #elif LIBGCC2_UNITS_PER_WORD == 2
 #define W_TYPE_SIZE (2 * BITS_PER_UNIT)
 #define Wtype	HItype
@@ -214,8 +224,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	UHItype
 #define DWtype	SItype
 #define UDWtype	USItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## hi ## b
+#define __NDW(a,b)	__gnu_ ## a ## si ## b
+#else
 #define __NW(a,b)	__ ## a ## hi ## b
 #define __NDW(a,b)	__ ## a ## si ## b
+#endif
 #else
 #define W_TYPE_SIZE BITS_PER_UNIT
 #define Wtype	QItype
@@ -224,10 +239,20 @@ typedef int shift_count_type __attribute
 #define UHWtype	UQItype
 #define DWtype	HItype
 #define UDWtype	UHItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## qi ## b
+#define __NDW(a,b)	__gnu_ ## a ## hi ## b
+#else
 #define __NW(a,b)	__ ## a ## qi ## b
 #define __NDW(a,b)	__ ## a ## hi ## b
 #endif
+#endif
 
+#ifdef LIBGCC2_GNU_PREFIX
+#define __N(a)	__gnu_ ## a
+#else
+#define __N(a)	__ ## a
+#endif
 #define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1))
 #define Wtype_MIN (- Wtype_MAX - 1)
 
@@ -298,6 +323,25 @@ typedef int shift_count_type __attribute
 #define __popcountDI2	__NDW(popcount,2)
 #define __parityDI2	__NDW(parity,2)
 
+#define __clz_tab		__N(clz_tab)
+#define __powisf2		__N(powisf2)
+#define __powidf2		__N(powidf2)
+#define __powitf2		__N(powitf2)
+#define __powixf2		__N(powixf2)
+#define __bswapsi2		__N(bswapsi2)
+#define __bswapdi2		__N(bswapdi2)
+#define __mulsc3		__N(mulsc3)
+#define __muldc3		__N(muldc3)
+#define __mulxc3		__N(mulxc3)
+#define __multc3		__N(multc3)
+#define __divsc3		__N(divsc3)
+#define __divdc3		__N(divdc3)
+#define __divxc3		__N(divxc3)
+#define __divtc3		__N(divtc3)
+#define __udiv_w_sdiv		__N(udiv_w_sdiv)
+#define __clear_cache		__N(clear_cache)
+#define __enable_execute_stack	__N(enable_execute_stack)
+
 extern DWtype __muldi3 (DWtype, DWtype);
 extern DWtype __divdi3 (DWtype, DWtype);
 extern UDWtype __udivdi3 (UDWtype, UDWtype);
@@ -347,6 +391,12 @@ extern DWtype __mulvDI3 (DWtype, DWtype)
 extern DWtype __negvDI2 (DWtype);
 
 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
+#define __absvsi2	__N(absvsi2)
+#define __negvsi2	__N(negvsi2)
+#define __addvsi3	__N(addvsi3)
+#define __subvsi3	__N(subvsi3)
+#define __mulvsi3	__N(mulvsi3)
+
 extern SItype __absvsi2 (SItype);
 extern SItype __addvsi3 (SItype, SItype);
 extern SItype __subvsi3 (SItype, SItype);
Index: trunk/gcc/target.def
===================================================================
--- trunk.orig/gcc/target.def
+++ trunk/gcc/target.def
@@ -1258,6 +1258,16 @@ DEFHOOK
  void, (void),
  hook_void_void)
 
+ /* Add a __gnu_ prefix to library functions rather than just __.  */
+DEFHOOKPOD
+(libfunc_gnu_prefix,
+ "This hook can be used to override the default prefix given to library\n\
+routines. Normally, this is just two underscores, @code{__}, but\n\
+it if changed to true, then for example a name like @code{__gnu_muldi3}\n\
+is used instead of the default @code{__muldi3}. This applies only to\n\
+functions defined in @file{libgcc2.c}.",
+  bool, false)
+
 /* Given a decl, a section name, and whether the decl initializer
    has relocs, choose attributes for the section.  */
 /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
Index: trunk/gcc/doc/tm.texi
===================================================================
--- trunk.orig/gcc/doc/tm.texi
+++ trunk/gcc/doc/tm.texi
@@ -1588,6 +1588,15 @@ anyway.  If you don't define this and @c
 is 128 then the default is 1, otherwise it is 0.
 @end defmac
 
+@defmac LIBGCC2_GNU_PREFIX
+This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
+hook and should be defined if this hook is overriden to be true.  It
+causes function names in libgcc to be changed to use a @code{__gnu_}
+prefix for their name rather than the default @code{__}.  A port which
+uses this macro should also arrange to use @file{t-gnu-prefix} in
+the libgcc @file{config.host}.
+@end defmac
+
 @defmac SF_SIZE
 @defmacx DF_SIZE
 @defmacx XF_SIZE
@@ -5260,6 +5269,14 @@ library routines.
 The default is to do nothing.  Most ports don't need to define this hook.
 @end deftypefn
 
+@deftypevr {Target Hook} bool TARGET_LIBFUNC_GNU_PREFIX
+This hook can be used to override the default prefix given to library
+routines. Normally, this is just two underscores, @code{__}, but
+it if changed to true, then for example a name like @code{__gnu_muldi3}
+is used instead of the default @code{__muldi3}. This applies only to
+functions defined in @file{libgcc2.c}.
+@end deftypevr
+
 @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison})
 This macro should return @code{true} if the library routine that
 implements the floating point comparison operator @var{comparison} in
Index: trunk/gcc/doc/tm.texi.in
===================================================================
--- trunk.orig/gcc/doc/tm.texi.in
+++ trunk/gcc/doc/tm.texi.in
@@ -1578,6 +1578,15 @@ anyway.  If you don't define this and @c
 is 128 then the default is 1, otherwise it is 0.
 @end defmac
 
+@defmac LIBGCC2_GNU_PREFIX
+This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
+hook and should be defined if this hook is overriden to be true.  It
+causes function names in libgcc to be changed to use a @code{__gnu_}
+prefix for their name rather than the default @code{__}.  A port which
+uses this macro should also arrange to use @file{t-gnu-prefix} in
+the libgcc @file{config.host}.
+@end defmac
+
 @defmac SF_SIZE
 @defmacx DF_SIZE
 @defmacx XF_SIZE
@@ -5208,6 +5217,8 @@ library routines.
 The default is to do nothing.  Most ports don't need to define this hook.
 @end deftypefn
 
+@hook TARGET_LIBFUNC_GNU_PREFIX
+
 @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison})
 This macro should return @code{true} if the library routine that
 implements the floating point comparison operator @var{comparison} in
Index: trunk/gcc/optabs.c
===================================================================
--- trunk.orig/gcc/optabs.c
+++ trunk/gcc/optabs.c
@@ -5152,13 +5152,22 @@ gen_libfunc (optab optable, const char *
   unsigned opname_len = strlen (opname);
   const char *mname = GET_MODE_NAME (mode);
   unsigned mname_len = strlen (mname);
-  char *libfunc_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
+  int len = prefix_len + opname_len + mname_len + 1 + 1;
+  char *libfunc_name = XALLOCAVEC (char, len);
   char *p;
   const char *q;
 
   p = libfunc_name;
   *p++ = '_';
   *p++ = '_';
+  if (targetm.libfunc_gnu_prefix)
+    {
+      *p++ = 'g';
+      *p++ = 'n';
+      *p++ = 'u';
+      *p++ = '_';
+    }
   for (q = opname; *q; )
     *p++ = *q++;
   for (q = mname; *q; q++)
@@ -5362,6 +5371,7 @@ gen_interclass_conv_libfunc (convert_opt
 
   const char *fname, *tname;
   const char *q;
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
   char *libfunc_name, *suffix;
   char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix;
   char *p;
@@ -5372,11 +5382,19 @@ gen_interclass_conv_libfunc (convert_opt
 
   mname_len = strlen (GET_MODE_NAME (tmode)) + strlen (GET_MODE_NAME (fmode));
 
-  nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
+  nondec_name = XALLOCAVEC (char, prefix_len + opname_len + mname_len + 1 + 1);
   nondec_name[0] = '_';
   nondec_name[1] = '_';
-  memcpy (&nondec_name[2], opname, opname_len);
-  nondec_suffix = nondec_name + opname_len + 2;
+  if (targetm.libfunc_gnu_prefix)
+    {
+      nondec_name[2] = 'g';
+      nondec_name[3] = 'n';
+      nondec_name[4] = 'u';
+      nondec_name[5] = '_';
+    }
+
+  memcpy (&nondec_name[prefix_len], opname, opname_len);
+  nondec_suffix = nondec_name + opname_len + prefix_len;
 
   dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1);
   dec_name[0] = '_';
@@ -5487,6 +5505,7 @@ gen_intraclass_conv_libfunc (convert_opt
 
   const char *fname, *tname;
   const char *q;
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
   char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix;
   char *libfunc_name, *suffix;
   char *p;
@@ -5500,8 +5519,15 @@ gen_intraclass_conv_libfunc (convert_opt
   nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
   nondec_name[0] = '_';
   nondec_name[1] = '_';
-  memcpy (&nondec_name[2], opname, opname_len);
-  nondec_suffix = nondec_name + opname_len + 2;
+  if (targetm.libfunc_gnu_prefix)
+    {
+      nondec_name[2] = 'g';
+      nondec_name[3] = 'n';
+      nondec_name[4] = 'u';
+      nondec_name[5] = '_';
+    }
+  memcpy (&nondec_name[prefix_len], opname, opname_len);
+  nondec_suffix = nondec_name + opname_len + prefix_len;
 
   dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1);
   dec_name[0] = '_';
@@ -6231,8 +6257,16 @@ init_optabs (void)
 
   /* Explicitly initialize the bswap libfuncs since we need them to be
      valid for things other than word_mode.  */
-  set_optab_libfunc (bswap_optab, SImode, "__bswapsi2");
-  set_optab_libfunc (bswap_optab, DImode, "__bswapdi2");
+  if (targetm.libfunc_gnu_prefix)
+    {
+      set_optab_libfunc (bswap_optab, SImode, "__gnu_bswapsi2");
+      set_optab_libfunc (bswap_optab, DImode, "__gnu_bswapdi2");
+    }
+  else
+    {
+      set_optab_libfunc (bswap_optab, SImode, "__bswapsi2");
+      set_optab_libfunc (bswap_optab, DImode, "__bswapdi2");
+    }
 
   /* Use cabs for double complex abs, since systems generally have cabs.
      Don't define any libcall for float complex, so that cabs will be used.  */
Index: trunk/gcc/config/t-slibgcc-elf-ver
===================================================================
--- trunk.orig/gcc/config/t-slibgcc-elf-ver
+++ trunk/gcc/config/t-slibgcc-elf-ver
@@ -53,4 +53,4 @@ SHLIB_INSTALL = \
 	rm -f $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
 	$(SHLIB_INSTALL_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/t-slibgcc-sld
===================================================================
--- trunk.orig/gcc/config/t-slibgcc-sld
+++ trunk/gcc/config/t-slibgcc-sld
@@ -47,4 +47,4 @@ SHLIB_INSTALL = \
 	$(LN_S) $(SHLIB_SONAME) \
 	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/libgcc-std.ver
===================================================================
--- trunk.orig/gcc/libgcc-std.ver
+++ /dev/null
@@ -1,1921 +0,0 @@
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-# 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-GCC_3.0 {
-  # libgcc1 integer symbols
-  __absvsi2
-  __addvsi3
-  __ashlsi3
-  __ashrsi3
-  __divsi3
-  __lshrsi3
-  __modsi3
-  __mulsi3
-  __mulvsi3
-  __negvsi2
-  __subvsi3
-  __udivsi3
-  __umodsi3
-
-  # libgcc1 floating point symbols
-  __addsf3
-  __adddf3
-  __addxf3
-  __addtf3
-  __divsf3
-  __divdf3
-  __divxf3
-  __divtf3
-  __eqsf2
-  __eqdf2
-  __eqxf2
-  __eqtf2
-  __extenddfxf2
-  __extenddftf2
-  __extendsfdf2
-  __extendsfxf2
-  __extendsftf2
-  __fixsfsi
-  __fixdfsi
-  __fixxfsi
-  __fixtfsi
-  __floatsisf
-  __floatsidf
-  __floatsixf
-  __floatsitf
-  __gesf2
-  __gedf2
-  __gexf2
-  __getf2
-  __gtsf2
-  __gtdf2
-  __gtxf2
-  __gttf2
-  __lesf2
-  __ledf2
-  __lexf2
-  __letf2
-  __ltsf2
-  __ltdf2
-  __ltxf2
-  __lttf2
-  __mulsf3
-  __muldf3
-  __mulxf3
-  __multf3
-  __negsf2
-  __negdf2
-  __negxf2
-  __negtf2
-  __nesf2
-  __nedf2
-  __nexf2
-  __netf2
-  __subsf3
-  __subdf3
-  __subxf3
-  __subtf3
-  __truncdfsf2
-  __truncxfsf2
-  __trunctfsf2
-  __truncxfdf2
-  __trunctfdf2
-
-  # libgcc2 DImode arithmetic (for 32-bit targets).
-  __absvdi2
-  __addvdi3
-  __ashldi3
-  __ashrdi3
-  __cmpdi2
-  __divdi3
-  __ffsdi2
-  __fixdfdi
-  __fixsfdi
-  __fixtfdi
-  __fixxfdi
-  __fixunsdfdi
-  __fixunsdfsi
-  __fixunssfsi
-  __fixunssfdi
-  __fixunstfdi
-  __fixunstfsi
-  __fixunsxfdi
-  __fixunsxfsi
-  __floatdidf
-  __floatdisf
-  __floatdixf
-  __floatditf
-  __lshrdi3
-  __moddi3
-  __muldi3
-  __mulvdi3
-  __negdi2
-  __negvdi2
-  __subvdi3
-  __ucmpdi2
-  __udivdi3
-  __udivmoddi4
-  __umoddi3
-
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  __ashlti3
-  __ashrti3
-  __cmpti2
-  __divti3
-  __ffsti2
-  __fixdfti
-  __fixsfti
-  __fixtfti
-  __fixxfti
-  __lshrti3
-  __modti3
-  __multi3
-  __negti2
-  __ucmpti2
-  __udivmodti4
-  __udivti3
-  __umodti3
-  __fixunsdfti
-  __fixunssfti
-  __fixunstfti
-  __fixunsxfti
-  __floattidf
-  __floattisf
-  __floattixf
-  __floattitf
-
-  # Used to deal with trampoline initialization on some platforms
-  __clear_cache
-
-  # EH symbols
-  _Unwind_DeleteException
-  _Unwind_Find_FDE
-  _Unwind_ForcedUnwind
-  _Unwind_GetGR
-  _Unwind_GetIP
-  _Unwind_GetLanguageSpecificData
-  _Unwind_GetRegionStart
-  _Unwind_GetTextRelBase
-  _Unwind_GetDataRelBase
-  _Unwind_RaiseException
-  _Unwind_Resume
-  _Unwind_SetGR
-  _Unwind_SetIP
-  __deregister_frame
-  __deregister_frame_info
-  __deregister_frame_info_bases
-  __register_frame
-  __register_frame_info
-  __register_frame_info_bases
-  __register_frame_info_table
-  __register_frame_info_table_bases
-  __register_frame_table
-
-  # SjLj EH symbols
-  _Unwind_SjLj_Register
-  _Unwind_SjLj_Unregister
-  _Unwind_SjLj_RaiseException
-  _Unwind_SjLj_ForcedUnwind
-  _Unwind_SjLj_Resume
-}
-
-%inherit GCC_3.3 GCC_3.0
-GCC_3.3 {
-  _Unwind_FindEnclosingFunction
-  _Unwind_GetCFA
-  _Unwind_Backtrace
-  _Unwind_Resume_or_Rethrow
-  _Unwind_SjLj_Resume_or_Rethrow
-}
-
-%inherit GCC_3.3.1 GCC_3.3
-GCC_3.3.1 {
-  __gcc_personality_sj0
-  __gcc_personality_v0
-}
-
-%inherit GCC_3.3.2 GCC_3.3.1
-GCC_3.3.2 {
-}
-
-%inherit GCC_3.3.4 GCC_3.3.2
-GCC_3.3.4 {
-  __unorddf2
-  __unordsf2
-}
-
-%inherit GCC_3.4 GCC_3.3.4
-GCC_3.4 {
-  # bit scanning and counting built-ins
-  __clzsi2
-  __clzdi2
-  __clzti2
-  __ctzsi2
-  __ctzdi2
-  __ctzti2
-  __popcountsi2
-  __popcountdi2
-  __popcountti2
-  __paritysi2
-  __paritydi2
-  __parityti2
-}
-
-%inherit GCC_3.4.2 GCC_3.4
-GCC_3.4.2 {
-  # Used to deal with trampoline initialization on some platforms
-  __enable_execute_stack
-  __trampoline_setup
-}
-
-%inherit GCC_3.4.4 GCC_3.4.2
-GCC_3.4.4 {
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  __absvti2
-  __addvti3
-  __mulvti3
-  __negvti2
-  __subvti3
-}
-
-%inherit GCC_4.0.0 GCC_3.4.4
-GCC_4.0.0 {
-  # libgcc2 __builtin_powi helpers.
-  __powisf2
-  __powidf2
-  __powixf2
-  __powitf2
-
-  # c99 compliant complex arithmetic
-  __divsc3
-  __divdc3
-  __divxc3
-  __divtc3
-  __mulsc3
-  __muldc3
-  __mulxc3
-  __multc3
-}
-
-%inherit GCC_4.1.0 GCC_4.0.0
-GCC_4.1.0 {
-}
-
-%inherit GCC_4.2.0 GCC_4.1.0
-GCC_4.2.0 {
-  # unsigned-to-floating conversions
-  __floatunsisf
-  __floatunsidf
-  __floatunsixf
-  __floatunsitf
-  __floatundidf
-  __floatundisf
-  __floatundixf
-  __floatunditf
-  __floatuntidf
-  __floatuntisf
-  __floatuntixf
-  __floatuntitf
-  _Unwind_GetIPInfo
-}
-
-%inherit GCC_4.3.0 GCC_4.2.0
-GCC_4.3.0 {
-  # byte swapping routines
-  __bswapsi2
-  __bswapdi2
-  __emutls_get_address
-  __emutls_register_common
-  __ffssi2
-  __extendxftf2
-  __trunctfxf2
-
-  # fixed-point routines
-  __addqq3
-  __addhq3
-  __addsq3
-  __adddq3
-  __addtq3
-  __adduqq3
-  __adduhq3
-  __addusq3
-  __addudq3
-  __addutq3
-  __addha3
-  __addsa3
-  __addda3
-  __addta3
-  __adduha3
-  __addusa3
-  __adduda3
-  __adduta3
-  __ssaddqq3
-  __ssaddhq3
-  __ssaddsq3
-  __ssadddq3
-  __ssaddtq3
-  __ssaddha3
-  __ssaddsa3
-  __ssaddda3
-  __ssaddta3
-  __usadduqq3
-  __usadduhq3
-  __usaddusq3
-  __usaddudq3
-  __usaddutq3
-  __usadduha3
-  __usaddusa3
-  __usadduda3
-  __usadduta3
-  __subqq3
-  __subhq3
-  __subsq3
-  __subdq3
-  __subtq3
-  __subuqq3
-  __subuhq3
-  __subusq3
-  __subudq3
-  __subutq3
-  __subha3
-  __subsa3
-  __subda3
-  __subta3
-  __subuha3
-  __subusa3
-  __subuda3
-  __subuta3
-  __sssubqq3
-  __sssubhq3
-  __sssubsq3
-  __sssubdq3
-  __sssubtq3
-  __sssubha3
-  __sssubsa3
-  __sssubda3
-  __sssubta3
-  __ussubuqq3
-  __ussubuhq3
-  __ussubusq3
-  __ussubudq3
-  __ussubutq3
-  __ussubuha3
-  __ussubusa3
-  __ussubuda3
-  __ussubuta3
-  __mulqq3
-  __mulhq3
-  __mulsq3
-  __muldq3
-  __multq3
-  __muluqq3
-  __muluhq3
-  __mulusq3
-  __muludq3
-  __mulutq3
-  __mulha3
-  __mulsa3
-  __mulda3
-  __multa3
-  __muluha3
-  __mulusa3
-  __muluda3
-  __muluta3
-  __ssmulqq3
-  __ssmulhq3
-  __ssmulsq3
-  __ssmuldq3
-  __ssmultq3
-  __ssmulha3
-  __ssmulsa3
-  __ssmulda3
-  __ssmulta3
-  __usmuluqq3
-  __usmuluhq3
-  __usmulusq3
-  __usmuludq3
-  __usmulutq3
-  __usmuluha3
-  __usmulusa3
-  __usmuluda3
-  __usmuluta3
-  __divqq3
-  __divhq3
-  __divsq3
-  __divdq3
-  __divtq3
-  __divha3
-  __divsa3
-  __divda3
-  __divta3
-  __udivuqq3
-  __udivuhq3
-  __udivusq3
-  __udivudq3
-  __udivutq3
-  __udivuha3
-  __udivusa3
-  __udivuda3
-  __udivuta3
-  __ssdivqq3
-  __ssdivhq3
-  __ssdivsq3
-  __ssdivdq3
-  __ssdivtq3
-  __ssdivha3
-  __ssdivsa3
-  __ssdivda3
-  __ssdivta3
-  __usdivuqq3
-  __usdivuhq3
-  __usdivusq3
-  __usdivudq3
-  __usdivutq3
-  __usdivuha3
-  __usdivusa3
-  __usdivuda3
-  __usdivuta3
-  __negqq2
-  __neghq2
-  __negsq2
-  __negdq2
-  __negtq2
-  __neguqq2
-  __neguhq2
-  __negusq2
-  __negudq2
-  __negutq2
-  __negha2
-  __negsa2
-  __negda2
-  __negta2
-  __neguha2
-  __negusa2
-  __neguda2
-  __neguta2
-  __ssnegqq2
-  __ssneghq2
-  __ssnegsq2
-  __ssnegdq2
-  __ssnegtq2
-  __ssnegha2
-  __ssnegsa2
-  __ssnegda2
-  __ssnegta2
-  __usneguqq2
-  __usneguhq2
-  __usnegusq2
-  __usnegudq2
-  __usnegutq2
-  __usneguha2
-  __usnegusa2
-  __usneguda2
-  __usneguta2
-  __ashlqq3
-  __ashlhq3
-  __ashlsq3
-  __ashldq3
-  __ashltq3
-  __ashluqq3
-  __ashluhq3
-  __ashlusq3
-  __ashludq3
-  __ashlutq3
-  __ashlha3
-  __ashlsa3
-  __ashlda3
-  __ashlta3
-  __ashluha3
-  __ashlusa3
-  __ashluda3
-  __ashluta3
-  __ashrqq3
-  __ashrhq3
-  __ashrsq3
-  __ashrdq3
-  __ashrtq3
-  __ashrha3
-  __ashrsa3
-  __ashrda3
-  __ashrta3
-  __lshruqq3
-  __lshruhq3
-  __lshrusq3
-  __lshrudq3
-  __lshrutq3
-  __lshruha3
-  __lshrusa3
-  __lshruda3
-  __lshruta3
-  __ssashlqq3
-  __ssashlhq3
-  __ssashlsq3
-  __ssashldq3
-  __ssashltq3
-  __ssashlha3
-  __ssashlsa3
-  __ssashlda3
-  __ssashlta3
-  __usashluqq3
-  __usashluhq3
-  __usashlusq3
-  __usashludq3
-  __usashlutq3
-  __usashluha3
-  __usashlusa3
-  __usashluda3
-  __usashluta3
-  __cmpqq2
-  __cmphq2
-  __cmpsq2
-  __cmpdq2
-  __cmptq2
-  __cmpuqq2
-  __cmpuhq2
-  __cmpusq2
-  __cmpudq2
-  __cmputq2
-  __cmpha2
-  __cmpsa2
-  __cmpda2
-  __cmpta2
-  __cmpuha2
-  __cmpusa2
-  __cmpuda2
-  __cmputa2
-  __fractqqhq2
-  __fractqqsq2
-  __fractqqdq2
-  __fractqqtq2
-  __fractqqha
-  __fractqqsa
-  __fractqqda
-  __fractqqta
-  __fractqquqq
-  __fractqquhq
-  __fractqqusq
-  __fractqqudq
-  __fractqqutq
-  __fractqquha
-  __fractqqusa
-  __fractqquda
-  __fractqquta
-  __fractqqqi
-  __fractqqhi
-  __fractqqsi
-  __fractqqdi
-  __fractqqti
-  __fractqqsf
-  __fractqqdf
-  __fracthqqq2
-  __fracthqsq2
-  __fracthqdq2
-  __fracthqtq2
-  __fracthqha
-  __fracthqsa
-  __fracthqda
-  __fracthqta
-  __fracthquqq
-  __fracthquhq
-  __fracthqusq
-  __fracthqudq
-  __fracthqutq
-  __fracthquha
-  __fracthqusa
-  __fracthquda
-  __fracthquta
-  __fracthqqi
-  __fracthqhi
-  __fracthqsi
-  __fracthqdi
-  __fracthqti
-  __fracthqsf
-  __fracthqdf
-  __fractsqqq2
-  __fractsqhq2
-  __fractsqdq2
-  __fractsqtq2
-  __fractsqha
-  __fractsqsa
-  __fractsqda
-  __fractsqta
-  __fractsquqq
-  __fractsquhq
-  __fractsqusq
-  __fractsqudq
-  __fractsqutq
-  __fractsquha
-  __fractsqusa
-  __fractsquda
-  __fractsquta
-  __fractsqqi
-  __fractsqhi
-  __fractsqsi
-  __fractsqdi
-  __fractsqti
-  __fractsqsf
-  __fractsqdf
-  __fractdqqq2
-  __fractdqhq2
-  __fractdqsq2
-  __fractdqtq2
-  __fractdqha
-  __fractdqsa
-  __fractdqda
-  __fractdqta
-  __fractdquqq
-  __fractdquhq
-  __fractdqusq
-  __fractdqudq
-  __fractdqutq
-  __fractdquha
-  __fractdqusa
-  __fractdquda
-  __fractdquta
-  __fractdqqi
-  __fractdqhi
-  __fractdqsi
-  __fractdqdi
-  __fractdqti
-  __fractdqsf
-  __fractdqdf
-  __fracttqqq2
-  __fracttqhq2
-  __fracttqsq2
-  __fracttqdq2
-  __fracttqha
-  __fracttqsa
-  __fracttqda
-  __fracttqta
-  __fracttquqq
-  __fracttquhq
-  __fracttqusq
-  __fracttqudq
-  __fracttqutq
-  __fracttquha
-  __fracttqusa
-  __fracttquda
-  __fracttquta
-  __fracttqqi
-  __fracttqhi
-  __fracttqsi
-  __fracttqdi
-  __fracttqti
-  __fracttqsf
-  __fracttqdf
-  __fracthaqq
-  __fracthahq
-  __fracthasq
-  __fracthadq
-  __fracthatq
-  __fracthasa2
-  __fracthada2
-  __fracthata2
-  __fracthauqq
-  __fracthauhq
-  __fracthausq
-  __fracthaudq
-  __fracthautq
-  __fracthauha
-  __fracthausa
-  __fracthauda
-  __fracthauta
-  __fracthaqi
-  __fracthahi
-  __fracthasi
-  __fracthadi
-  __fracthati
-  __fracthasf
-  __fracthadf
-  __fractsaqq
-  __fractsahq
-  __fractsasq
-  __fractsadq
-  __fractsatq
-  __fractsaha2
-  __fractsada2
-  __fractsata2
-  __fractsauqq
-  __fractsauhq
-  __fractsausq
-  __fractsaudq
-  __fractsautq
-  __fractsauha
-  __fractsausa
-  __fractsauda
-  __fractsauta
-  __fractsaqi
-  __fractsahi
-  __fractsasi
-  __fractsadi
-  __fractsati
-  __fractsasf
-  __fractsadf
-  __fractdaqq
-  __fractdahq
-  __fractdasq
-  __fractdadq
-  __fractdatq
-  __fractdaha2
-  __fractdasa2
-  __fractdata2
-  __fractdauqq
-  __fractdauhq
-  __fractdausq
-  __fractdaudq
-  __fractdautq
-  __fractdauha
-  __fractdausa
-  __fractdauda
-  __fractdauta
-  __fractdaqi
-  __fractdahi
-  __fractdasi
-  __fractdadi
-  __fractdati
-  __fractdasf
-  __fractdadf
-  __fracttaqq
-  __fracttahq
-  __fracttasq
-  __fracttadq
-  __fracttatq
-  __fracttaha2
-  __fracttasa2
-  __fracttada2
-  __fracttauqq
-  __fracttauhq
-  __fracttausq
-  __fracttaudq
-  __fracttautq
-  __fracttauha
-  __fracttausa
-  __fracttauda
-  __fracttauta
-  __fracttaqi
-  __fracttahi
-  __fracttasi
-  __fracttadi
-  __fracttati
-  __fracttasf
-  __fracttadf
-  __fractuqqqq
-  __fractuqqhq
-  __fractuqqsq
-  __fractuqqdq
-  __fractuqqtq
-  __fractuqqha
-  __fractuqqsa
-  __fractuqqda
-  __fractuqqta
-  __fractuqquhq2
-  __fractuqqusq2
-  __fractuqqudq2
-  __fractuqqutq2
-  __fractuqquha
-  __fractuqqusa
-  __fractuqquda
-  __fractuqquta
-  __fractuqqqi
-  __fractuqqhi
-  __fractuqqsi
-  __fractuqqdi
-  __fractuqqti
-  __fractuqqsf
-  __fractuqqdf
-  __fractuhqqq
-  __fractuhqhq
-  __fractuhqsq
-  __fractuhqdq
-  __fractuhqtq
-  __fractuhqha
-  __fractuhqsa
-  __fractuhqda
-  __fractuhqta
-  __fractuhquqq2
-  __fractuhqusq2
-  __fractuhqudq2
-  __fractuhqutq2
-  __fractuhquha
-  __fractuhqusa
-  __fractuhquda
-  __fractuhquta
-  __fractuhqqi
-  __fractuhqhi
-  __fractuhqsi
-  __fractuhqdi
-  __fractuhqti
-  __fractuhqsf
-  __fractuhqdf
-  __fractusqqq
-  __fractusqhq
-  __fractusqsq
-  __fractusqdq
-  __fractusqtq
-  __fractusqha
-  __fractusqsa
-  __fractusqda
-  __fractusqta
-  __fractusquqq2
-  __fractusquhq2
-  __fractusqudq2
-  __fractusqutq2
-  __fractusquha
-  __fractusqusa
-  __fractusquda
-  __fractusquta
-  __fractusqqi
-  __fractusqhi
-  __fractusqsi
-  __fractusqdi
-  __fractusqti
-  __fractusqsf
-  __fractusqdf
-  __fractudqqq
-  __fractudqhq
-  __fractudqsq
-  __fractudqdq
-  __fractudqtq
-  __fractudqha
-  __fractudqsa
-  __fractudqda
-  __fractudqta
-  __fractudquqq2
-  __fractudquhq2
-  __fractudqusq2
-  __fractudqutq2
-  __fractudquha
-  __fractudqusa
-  __fractudquda
-  __fractudquta
-  __fractudqqi
-  __fractudqhi
-  __fractudqsi
-  __fractudqdi
-  __fractudqti
-  __fractudqsf
-  __fractudqdf
-  __fractutqqq
-  __fractutqhq
-  __fractutqsq
-  __fractutqdq
-  __fractutqtq
-  __fractutqha
-  __fractutqsa
-  __fractutqda
-  __fractutqta
-  __fractutquqq2
-  __fractutquhq2
-  __fractutqusq2
-  __fractutqudq2
-  __fractutquha
-  __fractutqusa
-  __fractutquda
-  __fractutquta
-  __fractutqqi
-  __fractutqhi
-  __fractutqsi
-  __fractutqdi
-  __fractutqti
-  __fractutqsf
-  __fractutqdf
-  __fractuhaqq
-  __fractuhahq
-  __fractuhasq
-  __fractuhadq
-  __fractuhatq
-  __fractuhaha
-  __fractuhasa
-  __fractuhada
-  __fractuhata
-  __fractuhauqq
-  __fractuhauhq
-  __fractuhausq
-  __fractuhaudq
-  __fractuhautq
-  __fractuhausa2
-  __fractuhauda2
-  __fractuhauta2
-  __fractuhaqi
-  __fractuhahi
-  __fractuhasi
-  __fractuhadi
-  __fractuhati
-  __fractuhasf
-  __fractuhadf
-  __fractusaqq
-  __fractusahq
-  __fractusasq
-  __fractusadq
-  __fractusatq
-  __fractusaha
-  __fractusasa
-  __fractusada
-  __fractusata
-  __fractusauqq
-  __fractusauhq
-  __fractusausq
-  __fractusaudq
-  __fractusautq
-  __fractusauha2
-  __fractusauda2
-  __fractusauta2
-  __fractusaqi
-  __fractusahi
-  __fractusasi
-  __fractusadi
-  __fractusati
-  __fractusasf
-  __fractusadf
-  __fractudaqq
-  __fractudahq
-  __fractudasq
-  __fractudadq
-  __fractudatq
-  __fractudaha
-  __fractudasa
-  __fractudada
-  __fractudata
-  __fractudauqq
-  __fractudauhq
-  __fractudausq
-  __fractudaudq
-  __fractudautq
-  __fractudauha2
-  __fractudausa2
-  __fractudauta2
-  __fractudaqi
-  __fractudahi
-  __fractudasi
-  __fractudadi
-  __fractudati
-  __fractudasf
-  __fractudadf
-  __fractutaqq
-  __fractutahq
-  __fractutasq
-  __fractutadq
-  __fractutatq
-  __fractutaha
-  __fractutasa
-  __fractutada
-  __fractutata
-  __fractutauqq
-  __fractutauhq
-  __fractutausq
-  __fractutaudq
-  __fractutautq
-  __fractutauha2
-  __fractutausa2
-  __fractutauda2
-  __fractutaqi
-  __fractutahi
-  __fractutasi
-  __fractutadi
-  __fractutati
-  __fractutasf
-  __fractutadf
-  __fractqiqq
-  __fractqihq
-  __fractqisq
-  __fractqidq
-  __fractqitq
-  __fractqiha
-  __fractqisa
-  __fractqida
-  __fractqita
-  __fractqiuqq
-  __fractqiuhq
-  __fractqiusq
-  __fractqiudq
-  __fractqiutq
-  __fractqiuha
-  __fractqiusa
-  __fractqiuda
-  __fractqiuta
-  __fracthiqq
-  __fracthihq
-  __fracthisq
-  __fracthidq
-  __fracthitq
-  __fracthiha
-  __fracthisa
-  __fracthida
-  __fracthita
-  __fracthiuqq
-  __fracthiuhq
-  __fracthiusq
-  __fracthiudq
-  __fracthiutq
-  __fracthiuha
-  __fracthiusa
-  __fracthiuda
-  __fracthiuta
-  __fractsiqq
-  __fractsihq
-  __fractsisq
-  __fractsidq
-  __fractsitq
-  __fractsiha
-  __fractsisa
-  __fractsida
-  __fractsita
-  __fractsiuqq
-  __fractsiuhq
-  __fractsiusq
-  __fractsiudq
-  __fractsiutq
-  __fractsiuha
-  __fractsiusa
-  __fractsiuda
-  __fractsiuta
-  __fractdiqq
-  __fractdihq
-  __fractdisq
-  __fractdidq
-  __fractditq
-  __fractdiha
-  __fractdisa
-  __fractdida
-  __fractdita
-  __fractdiuqq
-  __fractdiuhq
-  __fractdiusq
-  __fractdiudq
-  __fractdiutq
-  __fractdiuha
-  __fractdiusa
-  __fractdiuda
-  __fractdiuta
-  __fracttiqq
-  __fracttihq
-  __fracttisq
-  __fracttidq
-  __fracttitq
-  __fracttiha
-  __fracttisa
-  __fracttida
-  __fracttita
-  __fracttiuqq
-  __fracttiuhq
-  __fracttiusq
-  __fracttiudq
-  __fracttiutq
-  __fracttiuha
-  __fracttiusa
-  __fracttiuda
-  __fracttiuta
-  __fractsfqq
-  __fractsfhq
-  __fractsfsq
-  __fractsfdq
-  __fractsftq
-  __fractsfha
-  __fractsfsa
-  __fractsfda
-  __fractsfta
-  __fractsfuqq
-  __fractsfuhq
-  __fractsfusq
-  __fractsfudq
-  __fractsfutq
-  __fractsfuha
-  __fractsfusa
-  __fractsfuda
-  __fractsfuta
-  __fractdfqq
-  __fractdfhq
-  __fractdfsq
-  __fractdfdq
-  __fractdftq
-  __fractdfha
-  __fractdfsa
-  __fractdfda
-  __fractdfta
-  __fractdfuqq
-  __fractdfuhq
-  __fractdfusq
-  __fractdfudq
-  __fractdfutq
-  __fractdfuha
-  __fractdfusa
-  __fractdfuda
-  __fractdfuta
-  __satfractqqhq2
-  __satfractqqsq2
-  __satfractqqdq2
-  __satfractqqtq2
-  __satfractqqha
-  __satfractqqsa
-  __satfractqqda
-  __satfractqqta
-  __satfractqquqq
-  __satfractqquhq
-  __satfractqqusq
-  __satfractqqudq
-  __satfractqqutq
-  __satfractqquha
-  __satfractqqusa
-  __satfractqquda
-  __satfractqquta
-  __satfracthqqq2
-  __satfracthqsq2
-  __satfracthqdq2
-  __satfracthqtq2
-  __satfracthqha
-  __satfracthqsa
-  __satfracthqda
-  __satfracthqta
-  __satfracthquqq
-  __satfracthquhq
-  __satfracthqusq
-  __satfracthqudq
-  __satfracthqutq
-  __satfracthquha
-  __satfracthqusa
-  __satfracthquda
-  __satfracthquta
-  __satfractsqqq2
-  __satfractsqhq2
-  __satfractsqdq2
-  __satfractsqtq2
-  __satfractsqha
-  __satfractsqsa
-  __satfractsqda
-  __satfractsqta
-  __satfractsquqq
-  __satfractsquhq
-  __satfractsqusq
-  __satfractsqudq
-  __satfractsqutq
-  __satfractsquha
-  __satfractsqusa
-  __satfractsquda
-  __satfractsquta
-  __satfractdqqq2
-  __satfractdqhq2
-  __satfractdqsq2
-  __satfractdqtq2
-  __satfractdqha
-  __satfractdqsa
-  __satfractdqda
-  __satfractdqta
-  __satfractdquqq
-  __satfractdquhq
-  __satfractdqusq
-  __satfractdqudq
-  __satfractdqutq
-  __satfractdquha
-  __satfractdqusa
-  __satfractdquda
-  __satfractdquta
-  __satfracttqqq2
-  __satfracttqhq2
-  __satfracttqsq2
-  __satfracttqdq2
-  __satfracttqha
-  __satfracttqsa
-  __satfracttqda
-  __satfracttqta
-  __satfracttquqq
-  __satfracttquhq
-  __satfracttqusq
-  __satfracttqudq
-  __satfracttqutq
-  __satfracttquha
-  __satfracttqusa
-  __satfracttquda
-  __satfracttquta
-  __satfracthaqq
-  __satfracthahq
-  __satfracthasq
-  __satfracthadq
-  __satfracthatq
-  __satfracthasa2
-  __satfracthada2
-  __satfracthata2
-  __satfracthauqq
-  __satfracthauhq
-  __satfracthausq
-  __satfracthaudq
-  __satfracthautq
-  __satfracthauha
-  __satfracthausa
-  __satfracthauda
-  __satfracthauta
-  __satfractsaqq
-  __satfractsahq
-  __satfractsasq
-  __satfractsadq
-  __satfractsatq
-  __satfractsaha2
-  __satfractsada2
-  __satfractsata2
-  __satfractsauqq
-  __satfractsauhq
-  __satfractsausq
-  __satfractsaudq
-  __satfractsautq
-  __satfractsauha
-  __satfractsausa
-  __satfractsauda
-  __satfractsauta
-  __satfractdaqq
-  __satfractdahq
-  __satfractdasq
-  __satfractdadq
-  __satfractdatq
-  __satfractdaha2
-  __satfractdasa2
-  __satfractdata2
-  __satfractdauqq
-  __satfractdauhq
-  __satfractdausq
-  __satfractdaudq
-  __satfractdautq
-  __satfractdauha
-  __satfractdausa
-  __satfractdauda
-  __satfractdauta
-  __satfracttaqq
-  __satfracttahq
-  __satfracttasq
-  __satfracttadq
-  __satfracttatq
-  __satfracttaha2
-  __satfracttasa2
-  __satfracttada2
-  __satfracttauqq
-  __satfracttauhq
-  __satfracttausq
-  __satfracttaudq
-  __satfracttautq
-  __satfracttauha
-  __satfracttausa
-  __satfracttauda
-  __satfracttauta
-  __satfractuqqqq
-  __satfractuqqhq
-  __satfractuqqsq
-  __satfractuqqdq
-  __satfractuqqtq
-  __satfractuqqha
-  __satfractuqqsa
-  __satfractuqqda
-  __satfractuqqta
-  __satfractuqquhq2
-  __satfractuqqusq2
-  __satfractuqqudq2
-  __satfractuqqutq2
-  __satfractuqquha
-  __satfractuqqusa
-  __satfractuqquda
-  __satfractuqquta
-  __satfractuhqqq
-  __satfractuhqhq
-  __satfractuhqsq
-  __satfractuhqdq
-  __satfractuhqtq
-  __satfractuhqha
-  __satfractuhqsa
-  __satfractuhqda
-  __satfractuhqta
-  __satfractuhquqq2
-  __satfractuhqusq2
-  __satfractuhqudq2
-  __satfractuhqutq2
-  __satfractuhquha
-  __satfractuhqusa
-  __satfractuhquda
-  __satfractuhquta
-  __satfractusqqq
-  __satfractusqhq
-  __satfractusqsq
-  __satfractusqdq
-  __satfractusqtq
-  __satfractusqha
-  __satfractusqsa
-  __satfractusqda
-  __satfractusqta
-  __satfractusquqq2
-  __satfractusquhq2
-  __satfractusqudq2
-  __satfractusqutq2
-  __satfractusquha
-  __satfractusqusa
-  __satfractusquda
-  __satfractusquta
-  __satfractudqqq
-  __satfractudqhq
-  __satfractudqsq
-  __satfractudqdq
-  __satfractudqtq
-  __satfractudqha
-  __satfractudqsa
-  __satfractudqda
-  __satfractudqta
-  __satfractudquqq2
-  __satfractudquhq2
-  __satfractudqusq2
-  __satfractudqutq2
-  __satfractudquha
-  __satfractudqusa
-  __satfractudquda
-  __satfractudquta
-  __satfractutqqq
-  __satfractutqhq
-  __satfractutqsq
-  __satfractutqdq
-  __satfractutqtq
-  __satfractutqha
-  __satfractutqsa
-  __satfractutqda
-  __satfractutqta
-  __satfractutquqq2
-  __satfractutquhq2
-  __satfractutqusq2
-  __satfractutqudq2
-  __satfractutquha
-  __satfractutqusa
-  __satfractutquda
-  __satfractutquta
-  __satfractuhaqq
-  __satfractuhahq
-  __satfractuhasq
-  __satfractuhadq
-  __satfractuhatq
-  __satfractuhaha
-  __satfractuhasa
-  __satfractuhada
-  __satfractuhata
-  __satfractuhauqq
-  __satfractuhauhq
-  __satfractuhausq
-  __satfractuhaudq
-  __satfractuhautq
-  __satfractuhausa2
-  __satfractuhauda2
-  __satfractuhauta2
-  __satfractusaqq
-  __satfractusahq
-  __satfractusasq
-  __satfractusadq
-  __satfractusatq
-  __satfractusaha
-  __satfractusasa
-  __satfractusada
-  __satfractusata
-  __satfractusauqq
-  __satfractusauhq
-  __satfractusausq
-  __satfractusaudq
-  __satfractusautq
-  __satfractusauha2
-  __satfractusauda2
-  __satfractusauta2
-  __satfractudaqq
-  __satfractudahq
-  __satfractudasq
-  __satfractudadq
-  __satfractudatq
-  __satfractudaha
-  __satfractudasa
-  __satfractudada
-  __satfractudata
-  __satfractudauqq
-  __satfractudauhq
-  __satfractudausq
-  __satfractudaudq
-  __satfractudautq
-  __satfractudauha2
-  __satfractudausa2
-  __satfractudauta2
-  __satfractutaqq
-  __satfractutahq
-  __satfractutasq
-  __satfractutadq
-  __satfractutatq
-  __satfractutaha
-  __satfractutasa
-  __satfractutada
-  __satfractutata
-  __satfractutauqq
-  __satfractutauhq
-  __satfractutausq
-  __satfractutaudq
-  __satfractutautq
-  __satfractutauha2
-  __satfractutausa2
-  __satfractutauda2
-  __satfractqiqq
-  __satfractqihq
-  __satfractqisq
-  __satfractqidq
-  __satfractqitq
-  __satfractqiha
-  __satfractqisa
-  __satfractqida
-  __satfractqita
-  __satfractqiuqq
-  __satfractqiuhq
-  __satfractqiusq
-  __satfractqiudq
-  __satfractqiutq
-  __satfractqiuha
-  __satfractqiusa
-  __satfractqiuda
-  __satfractqiuta
-  __satfracthiqq
-  __satfracthihq
-  __satfracthisq
-  __satfracthidq
-  __satfracthitq
-  __satfracthiha
-  __satfracthisa
-  __satfracthida
-  __satfracthita
-  __satfracthiuqq
-  __satfracthiuhq
-  __satfracthiusq
-  __satfracthiudq
-  __satfracthiutq
-  __satfracthiuha
-  __satfracthiusa
-  __satfracthiuda
-  __satfracthiuta
-  __satfractsiqq
-  __satfractsihq
-  __satfractsisq
-  __satfractsidq
-  __satfractsitq
-  __satfractsiha
-  __satfractsisa
-  __satfractsida
-  __satfractsita
-  __satfractsiuqq
-  __satfractsiuhq
-  __satfractsiusq
-  __satfractsiudq
-  __satfractsiutq
-  __satfractsiuha
-  __satfractsiusa
-  __satfractsiuda
-  __satfractsiuta
-  __satfractdiqq
-  __satfractdihq
-  __satfractdisq
-  __satfractdidq
-  __satfractditq
-  __satfractdiha
-  __satfractdisa
-  __satfractdida
-  __satfractdita
-  __satfractdiuqq
-  __satfractdiuhq
-  __satfractdiusq
-  __satfractdiudq
-  __satfractdiutq
-  __satfractdiuha
-  __satfractdiusa
-  __satfractdiuda
-  __satfractdiuta
-  __satfracttiqq
-  __satfracttihq
-  __satfracttisq
-  __satfracttidq
-  __satfracttitq
-  __satfracttiha
-  __satfracttisa
-  __satfracttida
-  __satfracttita
-  __satfracttiuqq
-  __satfracttiuhq
-  __satfracttiusq
-  __satfracttiudq
-  __satfracttiutq
-  __satfracttiuha
-  __satfracttiusa
-  __satfracttiuda
-  __satfracttiuta
-  __satfractsfqq
-  __satfractsfhq
-  __satfractsfsq
-  __satfractsfdq
-  __satfractsftq
-  __satfractsfha
-  __satfractsfsa
-  __satfractsfda
-  __satfractsfta
-  __satfractsfuqq
-  __satfractsfuhq
-  __satfractsfusq
-  __satfractsfudq
-  __satfractsfutq
-  __satfractsfuha
-  __satfractsfusa
-  __satfractsfuda
-  __satfractsfuta
-  __satfractdfqq
-  __satfractdfhq
-  __satfractdfsq
-  __satfractdfdq
-  __satfractdftq
-  __satfractdfha
-  __satfractdfsa
-  __satfractdfda
-  __satfractdfta
-  __satfractdfuqq
-  __satfractdfuhq
-  __satfractdfusq
-  __satfractdfudq
-  __satfractdfutq
-  __satfractdfuha
-  __satfractdfusa
-  __satfractdfuda
-  __satfractdfuta
-  __fractunsqqqi
-  __fractunsqqhi
-  __fractunsqqsi
-  __fractunsqqdi
-  __fractunsqqti
-  __fractunshqqi
-  __fractunshqhi
-  __fractunshqsi
-  __fractunshqdi
-  __fractunshqti
-  __fractunssqqi
-  __fractunssqhi
-  __fractunssqsi
-  __fractunssqdi
-  __fractunssqti
-  __fractunsdqqi
-  __fractunsdqhi
-  __fractunsdqsi
-  __fractunsdqdi
-  __fractunsdqti
-  __fractunstqqi
-  __fractunstqhi
-  __fractunstqsi
-  __fractunstqdi
-  __fractunstqti
-  __fractunshaqi
-  __fractunshahi
-  __fractunshasi
-  __fractunshadi
-  __fractunshati
-  __fractunssaqi
-  __fractunssahi
-  __fractunssasi
-  __fractunssadi
-  __fractunssati
-  __fractunsdaqi
-  __fractunsdahi
-  __fractunsdasi
-  __fractunsdadi
-  __fractunsdati
-  __fractunstaqi
-  __fractunstahi
-  __fractunstasi
-  __fractunstadi
-  __fractunstati
-  __fractunsuqqqi
-  __fractunsuqqhi
-  __fractunsuqqsi
-  __fractunsuqqdi
-  __fractunsuqqti
-  __fractunsuhqqi
-  __fractunsuhqhi
-  __fractunsuhqsi
-  __fractunsuhqdi
-  __fractunsuhqti
-  __fractunsusqqi
-  __fractunsusqhi
-  __fractunsusqsi
-  __fractunsusqdi
-  __fractunsusqti
-  __fractunsudqqi
-  __fractunsudqhi
-  __fractunsudqsi
-  __fractunsudqdi
-  __fractunsudqti
-  __fractunsutqqi
-  __fractunsutqhi
-  __fractunsutqsi
-  __fractunsutqdi
-  __fractunsutqti
-  __fractunsuhaqi
-  __fractunsuhahi
-  __fractunsuhasi
-  __fractunsuhadi
-  __fractunsuhati
-  __fractunsusaqi
-  __fractunsusahi
-  __fractunsusasi
-  __fractunsusadi
-  __fractunsusati
-  __fractunsudaqi
-  __fractunsudahi
-  __fractunsudasi
-  __fractunsudadi
-  __fractunsudati
-  __fractunsutaqi
-  __fractunsutahi
-  __fractunsutasi
-  __fractunsutadi
-  __fractunsutati
-  __fractunsqiqq
-  __fractunsqihq
-  __fractunsqisq
-  __fractunsqidq
-  __fractunsqitq
-  __fractunsqiha
-  __fractunsqisa
-  __fractunsqida
-  __fractunsqita
-  __fractunsqiuqq
-  __fractunsqiuhq
-  __fractunsqiusq
-  __fractunsqiudq
-  __fractunsqiutq
-  __fractunsqiuha
-  __fractunsqiusa
-  __fractunsqiuda
-  __fractunsqiuta
-  __fractunshiqq
-  __fractunshihq
-  __fractunshisq
-  __fractunshidq
-  __fractunshitq
-  __fractunshiha
-  __fractunshisa
-  __fractunshida
-  __fractunshita
-  __fractunshiuqq
-  __fractunshiuhq
-  __fractunshiusq
-  __fractunshiudq
-  __fractunshiutq
-  __fractunshiuha
-  __fractunshiusa
-  __fractunshiuda
-  __fractunshiuta
-  __fractunssiqq
-  __fractunssihq
-  __fractunssisq
-  __fractunssidq
-  __fractunssitq
-  __fractunssiha
-  __fractunssisa
-  __fractunssida
-  __fractunssita
-  __fractunssiuqq
-  __fractunssiuhq
-  __fractunssiusq
-  __fractunssiudq
-  __fractunssiutq
-  __fractunssiuha
-  __fractunssiusa
-  __fractunssiuda
-  __fractunssiuta
-  __fractunsdiqq
-  __fractunsdihq
-  __fractunsdisq
-  __fractunsdidq
-  __fractunsditq
-  __fractunsdiha
-  __fractunsdisa
-  __fractunsdida
-  __fractunsdita
-  __fractunsdiuqq
-  __fractunsdiuhq
-  __fractunsdiusq
-  __fractunsdiudq
-  __fractunsdiutq
-  __fractunsdiuha
-  __fractunsdiusa
-  __fractunsdiuda
-  __fractunsdiuta
-  __fractunstiqq
-  __fractunstihq
-  __fractunstisq
-  __fractunstidq
-  __fractunstitq
-  __fractunstiha
-  __fractunstisa
-  __fractunstida
-  __fractunstita
-  __fractunstiuqq
-  __fractunstiuhq
-  __fractunstiusq
-  __fractunstiudq
-  __fractunstiutq
-  __fractunstiuha
-  __fractunstiusa
-  __fractunstiuda
-  __fractunstiuta
-  __satfractunsqiqq
-  __satfractunsqihq
-  __satfractunsqisq
-  __satfractunsqidq
-  __satfractunsqitq
-  __satfractunsqiha
-  __satfractunsqisa
-  __satfractunsqida
-  __satfractunsqita
-  __satfractunsqiuqq
-  __satfractunsqiuhq
-  __satfractunsqiusq
-  __satfractunsqiudq
-  __satfractunsqiutq
-  __satfractunsqiuha
-  __satfractunsqiusa
-  __satfractunsqiuda
-  __satfractunsqiuta
-  __satfractunshiqq
-  __satfractunshihq
-  __satfractunshisq
-  __satfractunshidq
-  __satfractunshitq
-  __satfractunshiha
-  __satfractunshisa
-  __satfractunshida
-  __satfractunshita
-  __satfractunshiuqq
-  __satfractunshiuhq
-  __satfractunshiusq
-  __satfractunshiudq
-  __satfractunshiutq
-  __satfractunshiuha
-  __satfractunshiusa
-  __satfractunshiuda
-  __satfractunshiuta
-  __satfractunssiqq
-  __satfractunssihq
-  __satfractunssisq
-  __satfractunssidq
-  __satfractunssitq
-  __satfractunssiha
-  __satfractunssisa
-  __satfractunssida
-  __satfractunssita
-  __satfractunssiuqq
-  __satfractunssiuhq
-  __satfractunssiusq
-  __satfractunssiudq
-  __satfractunssiutq
-  __satfractunssiuha
-  __satfractunssiusa
-  __satfractunssiuda
-  __satfractunssiuta
-  __satfractunsdiqq
-  __satfractunsdihq
-  __satfractunsdisq
-  __satfractunsdidq
-  __satfractunsditq
-  __satfractunsdiha
-  __satfractunsdisa
-  __satfractunsdida
-  __satfractunsdita
-  __satfractunsdiuqq
-  __satfractunsdiuhq
-  __satfractunsdiusq
-  __satfractunsdiudq
-  __satfractunsdiutq
-  __satfractunsdiuha
-  __satfractunsdiusa
-  __satfractunsdiuda
-  __satfractunsdiuta
-  __satfractunstiqq
-  __satfractunstihq
-  __satfractunstisq
-  __satfractunstidq
-  __satfractunstitq
-  __satfractunstiha
-  __satfractunstisa
-  __satfractunstida
-  __satfractunstita
-  __satfractunstiuqq
-  __satfractunstiuhq
-  __satfractunstiusq
-  __satfractunstiudq
-  __satfractunstiutq
-  __satfractunstiuha
-  __satfractunstiusa
-  __satfractunstiuda
-  __satfractunstiuta
-}
-
-%inherit GCC_4.4.0 GCC_4.3.0
-GCC_4.4.0 {
-  __sync_fetch_and_add_1
-  __sync_fetch_and_sub_1
-  __sync_fetch_and_or_1
-  __sync_fetch_and_and_1
-  __sync_fetch_and_xor_1
-  __sync_fetch_and_nand_1
-  __sync_add_and_fetch_1
-  __sync_sub_and_fetch_1
-  __sync_or_and_fetch_1
-  __sync_and_and_fetch_1
-  __sync_xor_and_fetch_1
-  __sync_nand_and_fetch_1
-  __sync_bool_compare_and_swap_1
-  __sync_val_compare_and_swap_1
-  __sync_lock_test_and_set_1
-
-  __sync_fetch_and_add_2
-  __sync_fetch_and_sub_2
-  __sync_fetch_and_or_2
-  __sync_fetch_and_and_2
-  __sync_fetch_and_xor_2
-  __sync_fetch_and_nand_2
-  __sync_add_and_fetch_2
-  __sync_sub_and_fetch_2
-  __sync_or_and_fetch_2
-  __sync_and_and_fetch_2
-  __sync_xor_and_fetch_2
-  __sync_nand_and_fetch_2
-  __sync_bool_compare_and_swap_2
-  __sync_val_compare_and_swap_2
-  __sync_lock_test_and_set_2
-
-  __sync_fetch_and_add_4
-  __sync_fetch_and_sub_4
-  __sync_fetch_and_or_4
-  __sync_fetch_and_and_4
-  __sync_fetch_and_xor_4
-  __sync_fetch_and_nand_4
-  __sync_add_and_fetch_4
-  __sync_sub_and_fetch_4
-  __sync_or_and_fetch_4
-  __sync_and_and_fetch_4
-  __sync_xor_and_fetch_4
-  __sync_nand_and_fetch_4
-  __sync_bool_compare_and_swap_4
-  __sync_val_compare_and_swap_4
-  __sync_lock_test_and_set_4
-
-  __sync_fetch_and_add_8
-  __sync_fetch_and_sub_8
-  __sync_fetch_and_or_8
-  __sync_fetch_and_and_8
-  __sync_fetch_and_xor_8
-  __sync_fetch_and_nand_8
-  __sync_add_and_fetch_8
-  __sync_sub_and_fetch_8
-  __sync_or_and_fetch_8
-  __sync_and_and_fetch_8
-  __sync_xor_and_fetch_8
-  __sync_nand_and_fetch_8
-  __sync_bool_compare_and_swap_8
-  __sync_val_compare_and_swap_8
-  __sync_lock_test_and_set_8
-
-  __sync_fetch_and_add_16
-  __sync_fetch_and_sub_16
-  __sync_fetch_and_or_16
-  __sync_fetch_and_and_16
-  __sync_fetch_and_xor_16
-  __sync_fetch_and_nand_16
-  __sync_add_and_fetch_16
-  __sync_sub_and_fetch_16
-  __sync_or_and_fetch_16
-  __sync_and_and_fetch_16
-  __sync_xor_and_fetch_16
-  __sync_nand_and_fetch_16
-  __sync_bool_compare_and_swap_16
-  __sync_val_compare_and_swap_16
-  __sync_lock_test_and_set_16
-
-  __sync_synchronize
-}
-
-%inherit GCC_4.5.0 GCC_4.4.0
-GCC_4.5.0 {
-  __unordxf2
-  __unordtf2
-}
-
-%inherit GCC_4.6.0 GCC_4.5.0
-GCC_4.6.0 {
-  __morestack_segments
-  __morestack_current_segment
-  __morestack_initial_sp
-  __splitstack_find
-}
Index: trunk/libgcc/libgcc-std.ver.in
===================================================================
--- /dev/null
+++ trunk/libgcc/libgcc-std.ver.in
@@ -0,0 +1,1922 @@
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+# 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+GCC_3.0 {
+  # libgcc1 integer symbols
+  _PFX0__PFX1__absvsi2
+  _PFX0__PFX1__addvsi3
+  _PFX0__PFX1__ashlsi3
+  _PFX0__PFX1__ashrsi3
+  _PFX0__PFX1__divsi3
+  _PFX0__PFX1__lshrsi3
+  _PFX0__PFX1__modsi3
+  _PFX0__PFX1__mulsi3
+  _PFX0__PFX1__mulvsi3
+  _PFX0__PFX1__negvsi2
+  _PFX0__PFX1__subvsi3
+  _PFX0__PFX1__udivsi3
+  _PFX0__PFX1__umodsi3
+
+  # libgcc1 floating point symbols
+  _PFX0__PFX1__addsf3
+  _PFX0__PFX1__adddf3
+  _PFX0__PFX1__addxf3
+  _PFX0__PFX1__addtf3
+  _PFX0__PFX1__divsf3
+  _PFX0__PFX1__divdf3
+  _PFX0__PFX1__divxf3
+  _PFX0__PFX1__divtf3
+  _PFX0__PFX1__eqsf2
+  _PFX0__PFX1__eqdf2
+  _PFX0__PFX1__eqxf2
+  _PFX0__PFX1__eqtf2
+  _PFX0__PFX1__extenddfxf2
+  _PFX0__PFX1__extenddftf2
+  _PFX0__PFX1__extendsfdf2
+  _PFX0__PFX1__extendsfxf2
+  _PFX0__PFX1__extendsftf2
+  _PFX0__PFX1__fixsfsi
+  _PFX0__PFX1__fixdfsi
+  _PFX0__PFX1__fixxfsi
+  _PFX0__PFX1__fixtfsi
+  _PFX0__PFX1__floatsisf
+  _PFX0__PFX1__floatsidf
+  _PFX0__PFX1__floatsixf
+  _PFX0__PFX1__floatsitf
+  _PFX0__PFX1__gesf2
+  _PFX0__PFX1__gedf2
+  _PFX0__PFX1__gexf2
+  _PFX0__PFX1__getf2
+  _PFX0__PFX1__gtsf2
+  _PFX0__PFX1__gtdf2
+  _PFX0__PFX1__gtxf2
+  _PFX0__PFX1__gttf2
+  _PFX0__PFX1__lesf2
+  _PFX0__PFX1__ledf2
+  _PFX0__PFX1__lexf2
+  _PFX0__PFX1__letf2
+  _PFX0__PFX1__ltsf2
+  _PFX0__PFX1__ltdf2
+  _PFX0__PFX1__ltxf2
+  _PFX0__PFX1__lttf2
+  _PFX0__PFX1__mulsf3
+  _PFX0__PFX1__muldf3
+  _PFX0__PFX1__mulxf3
+  _PFX0__PFX1__multf3
+  _PFX0__PFX1__negsf2
+  _PFX0__PFX1__negdf2
+  _PFX0__PFX1__negxf2
+  _PFX0__PFX1__negtf2
+  _PFX0__PFX1__nesf2
+  _PFX0__PFX1__nedf2
+  _PFX0__PFX1__nexf2
+  _PFX0__PFX1__netf2
+  _PFX0__PFX1__subsf3
+  _PFX0__PFX1__subdf3
+  _PFX0__PFX1__subxf3
+  _PFX0__PFX1__subtf3
+  _PFX0__PFX1__truncdfsf2
+  _PFX0__PFX1__truncxfsf2
+  _PFX0__PFX1__trunctfsf2
+  _PFX0__PFX1__truncxfdf2
+  _PFX0__PFX1__trunctfdf2
+
+  # libgcc2 DImode arithmetic (for 32-bit targets).
+  _PFX0__PFX1__absvdi2
+  _PFX0__PFX1__addvdi3
+  _PFX0__PFX1__ashldi3
+  _PFX0__PFX1__ashrdi3
+  _PFX0__PFX1__cmpdi2
+  _PFX0__PFX1__divdi3
+  _PFX0__PFX1__ffsdi2
+  _PFX0__PFX1__fixdfdi
+  _PFX0__PFX1__fixsfdi
+  _PFX0__PFX1__fixtfdi
+  _PFX0__PFX1__fixxfdi
+  _PFX0__PFX1__fixunsdfdi
+  _PFX0__PFX1__fixunsdfsi
+  _PFX0__PFX1__fixunssfsi
+  _PFX0__PFX1__fixunssfdi
+  _PFX0__PFX1__fixunstfdi
+  _PFX0__PFX1__fixunstfsi
+  _PFX0__PFX1__fixunsxfdi
+  _PFX0__PFX1__fixunsxfsi
+  _PFX0__PFX1__floatdidf
+  _PFX0__PFX1__floatdisf
+  _PFX0__PFX1__floatdixf
+  _PFX0__PFX1__floatditf
+  _PFX0__PFX1__lshrdi3
+  _PFX0__PFX1__moddi3
+  _PFX0__PFX1__muldi3
+  _PFX0__PFX1__mulvdi3
+  _PFX0__PFX1__negdi2
+  _PFX0__PFX1__negvdi2
+  _PFX0__PFX1__subvdi3
+  _PFX0__PFX1__ucmpdi2
+  _PFX0__PFX1__udivdi3
+  _PFX0__PFX1__udivmoddi4
+  _PFX0__PFX1__umoddi3
+
+  # libgcc2 TImode arithmetic (for 64-bit targets).
+  _PFX0__PFX1__ashlti3
+  _PFX0__PFX1__ashrti3
+  _PFX0__PFX1__cmpti2
+  _PFX0__PFX1__divti3
+  _PFX0__PFX1__ffsti2
+  _PFX0__PFX1__fixdfti
+  _PFX0__PFX1__fixsfti
+  _PFX0__PFX1__fixtfti
+  _PFX0__PFX1__fixxfti
+  _PFX0__PFX1__lshrti3
+  _PFX0__PFX1__modti3
+  _PFX0__PFX1__multi3
+  _PFX0__PFX1__negti2
+  _PFX0__PFX1__ucmpti2
+  _PFX0__PFX1__udivmodti4
+  _PFX0__PFX1__udivti3
+  _PFX0__PFX1__umodti3
+  _PFX0__PFX1__fixunsdfti
+  _PFX0__PFX1__fixunssfti
+  _PFX0__PFX1__fixunstfti
+  _PFX0__PFX1__fixunsxfti
+  _PFX0__PFX1__floattidf
+  _PFX0__PFX1__floattisf
+  _PFX0__PFX1__floattixf
+  _PFX0__PFX1__floattitf
+
+  # Used to deal with trampoline initialization on some platforms
+  _PFX0__PFX1__clear_cache
+
+  # EH symbols
+  _PFX0_Unwind_DeleteException
+  _PFX0_Unwind_Find_FDE
+  _PFX0_Unwind_ForcedUnwind
+  _PFX0_Unwind_GetGR
+  _PFX0_Unwind_GetIP
+  _PFX0_Unwind_GetLanguageSpecificData
+  _PFX0_Unwind_GetRegionStart
+  _PFX0_Unwind_GetTextRelBase
+  _PFX0_Unwind_GetDataRelBase
+  _PFX0_Unwind_RaiseException
+  _PFX0_Unwind_Resume
+  _PFX0_Unwind_SetGR
+  _PFX0_Unwind_SetIP
+  _PFX0__deregister_frame
+  _PFX0__deregister_frame_info
+  _PFX0__deregister_frame_info_bases
+  _PFX0__register_frame
+  _PFX0__register_frame_info
+  _PFX0__register_frame_info_bases
+  _PFX0__register_frame_info_table
+  _PFX0__register_frame_info_table_bases
+  _PFX0__register_frame_table
+
+  # SjLj EH symbols
+  _PFX0_Unwind_SjLj_Register
+  _PFX0_Unwind_SjLj_Unregister
+  _PFX0_Unwind_SjLj_RaiseException
+  _PFX0_Unwind_SjLj_ForcedUnwind
+  _PFX0_Unwind_SjLj_Resume
+}
+
+%inherit GCC_3.3 GCC_3.0
+GCC_3.3 {
+  _PFX0_Unwind_FindEnclosingFunction
+  _PFX0_Unwind_GetCFA
+  _PFX0_Unwind_Backtrace
+  _PFX0_Unwind_Resume_or_Rethrow
+  _PFX0_Unwind_SjLj_Resume_or_Rethrow
+}
+
+%inherit GCC_3.3.1 GCC_3.3
+GCC_3.3.1 {
+  _PFX0__gcc_personality_sj0
+  _PFX0__gcc_personality_v0
+}
+
+%inherit GCC_3.3.2 GCC_3.3.1
+GCC_3.3.2 {
+}
+
+%inherit GCC_3.3.4 GCC_3.3.2
+GCC_3.3.4 {
+  _PFX0__PFX1__unorddf2
+  _PFX0__PFX1__unordsf2
+}
+
+%inherit GCC_3.4 GCC_3.3.4
+GCC_3.4 {
+  # bit scanning and counting built-ins
+  _PFX0__PFX1__clzsi2
+  _PFX0__PFX1__clzdi2
+  _PFX0__PFX1__clzti2
+  _PFX0__PFX1__ctzsi2
+  _PFX0__PFX1__ctzdi2
+  _PFX0__PFX1__ctzti2
+  _PFX0__PFX1__popcountsi2
+  _PFX0__PFX1__popcountdi2
+  _PFX0__PFX1__popcountti2
+  _PFX0__PFX1__paritysi2
+  _PFX0__PFX1__paritydi2
+  _PFX0__PFX1__parityti2
+}
+
+%inherit GCC_3.4.2 GCC_3.4
+GCC_3.4.2 {
+  # Used to deal with trampoline initialization on some platforms
+  _PFX0__PFX1__enable_execute_stack
+  _PFX0__trampoline_setup
+}
+
+%inherit GCC_3.4.4 GCC_3.4.2
+GCC_3.4.4 {
+  # libgcc2 TImode arithmetic (for 64-bit targets).
+  _PFX0__PFX1__absvti2
+  _PFX0__PFX1__addvti3
+  _PFX0__PFX1__mulvti3
+  _PFX0__PFX1__negvti2
+  _PFX0__PFX1__subvti3
+}
+
+%inherit GCC_4.0.0 GCC_3.4.4
+GCC_4.0.0 {
+  # libgcc2 __builtin_powi helpers.
+  _PFX0__PFX1__powisf2
+  _PFX0__PFX1__powidf2
+  _PFX0__PFX1__powixf2
+  _PFX0__PFX1__powitf2
+
+  # c99 compliant complex arithmetic
+  _PFX0__PFX1__divsc3
+  _PFX0__PFX1__divdc3
+  _PFX0__PFX1__divxc3
+  _PFX0__PFX1__divtc3
+  _PFX0__PFX1__mulsc3
+  _PFX0__PFX1__muldc3
+  _PFX0__PFX1__mulxc3
+  _PFX0__PFX1__multc3
+}
+
+%inherit GCC_4.1.0 GCC_4.0.0
+GCC_4.1.0 {
+}
+
+%inherit GCC_4.2.0 GCC_4.1.0
+GCC_4.2.0 {
+  # unsigned-to-floating conversions
+  _PFX0__PFX1__floatunsisf
+  _PFX0__PFX1__floatunsidf
+  _PFX0__PFX1__floatunsixf
+  _PFX0__PFX1__floatunsitf
+  _PFX0__PFX1__floatundidf
+  _PFX0__PFX1__floatundisf
+  _PFX0__PFX1__floatundixf
+  _PFX0__PFX1__floatunditf
+  _PFX0__PFX1__floatuntidf
+  _PFX0__PFX1__floatuntisf
+  _PFX0__PFX1__floatuntixf
+  _PFX0__PFX1__floatuntitf
+  _PFX0_Unwind_GetIPInfo
+}
+
+%inherit GCC_4.3.0 GCC_4.2.0
+GCC_4.3.0 {
+  # byte swapping routines
+  _PFX0__PFX1__bswapsi2
+  _PFX0__PFX1__bswapdi2
+
+  _PFX0__emutls_get_address
+  _PFX0__emutls_register_common
+  _PFX0__PFX1__ffssi2
+  _PFX0__PFX1__extendxftf2
+  _PFX0__PFX1__trunctfxf2
+
+  # fixed-point routines
+  _PFX0__PFX1__addqq3
+  _PFX0__PFX1__addhq3
+  _PFX0__PFX1__addsq3
+  _PFX0__PFX1__adddq3
+  _PFX0__PFX1__addtq3
+  _PFX0__PFX1__adduqq3
+  _PFX0__PFX1__adduhq3
+  _PFX0__PFX1__addusq3
+  _PFX0__PFX1__addudq3
+  _PFX0__PFX1__addutq3
+  _PFX0__PFX1__addha3
+  _PFX0__PFX1__addsa3
+  _PFX0__PFX1__addda3
+  _PFX0__PFX1__addta3
+  _PFX0__PFX1__adduha3
+  _PFX0__PFX1__addusa3
+  _PFX0__PFX1__adduda3
+  _PFX0__PFX1__adduta3
+  _PFX0__PFX1__ssaddqq3
+  _PFX0__PFX1__ssaddhq3
+  _PFX0__PFX1__ssaddsq3
+  _PFX0__PFX1__ssadddq3
+  _PFX0__PFX1__ssaddtq3
+  _PFX0__PFX1__ssaddha3
+  _PFX0__PFX1__ssaddsa3
+  _PFX0__PFX1__ssaddda3
+  _PFX0__PFX1__ssaddta3
+  _PFX0__PFX1__usadduqq3
+  _PFX0__PFX1__usadduhq3
+  _PFX0__PFX1__usaddusq3
+  _PFX0__PFX1__usaddudq3
+  _PFX0__PFX1__usaddutq3
+  _PFX0__PFX1__usadduha3
+  _PFX0__PFX1__usaddusa3
+  _PFX0__PFX1__usadduda3
+  _PFX0__PFX1__usadduta3
+  _PFX0__PFX1__subqq3
+  _PFX0__PFX1__subhq3
+  _PFX0__PFX1__subsq3
+  _PFX0__PFX1__subdq3
+  _PFX0__PFX1__subtq3
+  _PFX0__PFX1__subuqq3
+  _PFX0__PFX1__subuhq3
+  _PFX0__PFX1__subusq3
+  _PFX0__PFX1__subudq3
+  _PFX0__PFX1__subutq3
+  _PFX0__PFX1__subha3
+  _PFX0__PFX1__subsa3
+  _PFX0__PFX1__subda3
+  _PFX0__PFX1__subta3
+  _PFX0__PFX1__subuha3
+  _PFX0__PFX1__subusa3
+  _PFX0__PFX1__subuda3
+  _PFX0__PFX1__subuta3
+  _PFX0__PFX1__sssubqq3
+  _PFX0__PFX1__sssubhq3
+  _PFX0__PFX1__sssubsq3
+  _PFX0__PFX1__sssubdq3
+  _PFX0__PFX1__sssubtq3
+  _PFX0__PFX1__sssubha3
+  _PFX0__PFX1__sssubsa3
+  _PFX0__PFX1__sssubda3
+  _PFX0__PFX1__sssubta3
+  _PFX0__PFX1__ussubuqq3
+  _PFX0__PFX1__ussubuhq3
+  _PFX0__PFX1__ussubusq3
+  _PFX0__PFX1__ussubudq3
+  _PFX0__PFX1__ussubutq3
+  _PFX0__PFX1__ussubuha3
+  _PFX0__PFX1__ussubusa3
+  _PFX0__PFX1__ussubuda3
+  _PFX0__PFX1__ussubuta3
+  _PFX0__PFX1__mulqq3
+  _PFX0__PFX1__mulhq3
+  _PFX0__PFX1__mulsq3
+  _PFX0__PFX1__muldq3
+  _PFX0__PFX1__multq3
+  _PFX0__PFX1__muluqq3
+  _PFX0__PFX1__muluhq3
+  _PFX0__PFX1__mulusq3
+  _PFX0__PFX1__muludq3
+  _PFX0__PFX1__mulutq3
+  _PFX0__PFX1__mulha3
+  _PFX0__PFX1__mulsa3
+  _PFX0__PFX1__mulda3
+  _PFX0__PFX1__multa3
+  _PFX0__PFX1__muluha3
+  _PFX0__PFX1__mulusa3
+  _PFX0__PFX1__muluda3
+  _PFX0__PFX1__muluta3
+  _PFX0__PFX1__ssmulqq3
+  _PFX0__PFX1__ssmulhq3
+  _PFX0__PFX1__ssmulsq3
+  _PFX0__PFX1__ssmuldq3
+  _PFX0__PFX1__ssmultq3
+  _PFX0__PFX1__ssmulha3
+  _PFX0__PFX1__ssmulsa3
+  _PFX0__PFX1__ssmulda3
+  _PFX0__PFX1__ssmulta3
+  _PFX0__PFX1__usmuluqq3
+  _PFX0__PFX1__usmuluhq3
+  _PFX0__PFX1__usmulusq3
+  _PFX0__PFX1__usmuludq3
+  _PFX0__PFX1__usmulutq3
+  _PFX0__PFX1__usmuluha3
+  _PFX0__PFX1__usmulusa3
+  _PFX0__PFX1__usmuluda3
+  _PFX0__PFX1__usmuluta3
+  _PFX0__PFX1__divqq3
+  _PFX0__PFX1__divhq3
+  _PFX0__PFX1__divsq3
+  _PFX0__PFX1__divdq3
+  _PFX0__PFX1__divtq3
+  _PFX0__PFX1__divha3
+  _PFX0__PFX1__divsa3
+  _PFX0__PFX1__divda3
+  _PFX0__PFX1__divta3
+  _PFX0__PFX1__udivuqq3
+  _PFX0__PFX1__udivuhq3
+  _PFX0__PFX1__udivusq3
+  _PFX0__PFX1__udivudq3
+  _PFX0__PFX1__udivutq3
+  _PFX0__PFX1__udivuha3
+  _PFX0__PFX1__udivusa3
+  _PFX0__PFX1__udivuda3
+  _PFX0__PFX1__udivuta3
+  _PFX0__PFX1__ssdivqq3
+  _PFX0__PFX1__ssdivhq3
+  _PFX0__PFX1__ssdivsq3
+  _PFX0__PFX1__ssdivdq3
+  _PFX0__PFX1__ssdivtq3
+  _PFX0__PFX1__ssdivha3
+  _PFX0__PFX1__ssdivsa3
+  _PFX0__PFX1__ssdivda3
+  _PFX0__PFX1__ssdivta3
+  _PFX0__PFX1__usdivuqq3
+  _PFX0__PFX1__usdivuhq3
+  _PFX0__PFX1__usdivusq3
+  _PFX0__PFX1__usdivudq3
+  _PFX0__PFX1__usdivutq3
+  _PFX0__PFX1__usdivuha3
+  _PFX0__PFX1__usdivusa3
+  _PFX0__PFX1__usdivuda3
+  _PFX0__PFX1__usdivuta3
+  _PFX0__PFX1__negqq2
+  _PFX0__PFX1__neghq2
+  _PFX0__PFX1__negsq2
+  _PFX0__PFX1__negdq2
+  _PFX0__PFX1__negtq2
+  _PFX0__PFX1__neguqq2
+  _PFX0__PFX1__neguhq2
+  _PFX0__PFX1__negusq2
+  _PFX0__PFX1__negudq2
+  _PFX0__PFX1__negutq2
+  _PFX0__PFX1__negha2
+  _PFX0__PFX1__negsa2
+  _PFX0__PFX1__negda2
+  _PFX0__PFX1__negta2
+  _PFX0__PFX1__neguha2
+  _PFX0__PFX1__negusa2
+  _PFX0__PFX1__neguda2
+  _PFX0__PFX1__neguta2
+  _PFX0__PFX1__ssnegqq2
+  _PFX0__PFX1__ssneghq2
+  _PFX0__PFX1__ssnegsq2
+  _PFX0__PFX1__ssnegdq2
+  _PFX0__PFX1__ssnegtq2
+  _PFX0__PFX1__ssnegha2
+  _PFX0__PFX1__ssnegsa2
+  _PFX0__PFX1__ssnegda2
+  _PFX0__PFX1__ssnegta2
+  _PFX0__PFX1__usneguqq2
+  _PFX0__PFX1__usneguhq2
+  _PFX0__PFX1__usnegusq2
+  _PFX0__PFX1__usnegudq2
+  _PFX0__PFX1__usnegutq2
+  _PFX0__PFX1__usneguha2
+  _PFX0__PFX1__usnegusa2
+  _PFX0__PFX1__usneguda2
+  _PFX0__PFX1__usneguta2
+  _PFX0__PFX1__ashlqq3
+  _PFX0__PFX1__ashlhq3
+  _PFX0__PFX1__ashlsq3
+  _PFX0__PFX1__ashldq3
+  _PFX0__PFX1__ashltq3
+  _PFX0__PFX1__ashluqq3
+  _PFX0__PFX1__ashluhq3
+  _PFX0__PFX1__ashlusq3
+  _PFX0__PFX1__ashludq3
+  _PFX0__PFX1__ashlutq3
+  _PFX0__PFX1__ashlha3
+  _PFX0__PFX1__ashlsa3
+  _PFX0__PFX1__ashlda3
+  _PFX0__PFX1__ashlta3
+  _PFX0__PFX1__ashluha3
+  _PFX0__PFX1__ashlusa3
+  _PFX0__PFX1__ashluda3
+  _PFX0__PFX1__ashluta3
+  _PFX0__PFX1__ashrqq3
+  _PFX0__PFX1__ashrhq3
+  _PFX0__PFX1__ashrsq3
+  _PFX0__PFX1__ashrdq3
+  _PFX0__PFX1__ashrtq3
+  _PFX0__PFX1__ashrha3
+  _PFX0__PFX1__ashrsa3
+  _PFX0__PFX1__ashrda3
+  _PFX0__PFX1__ashrta3
+  _PFX0__PFX1__lshruqq3
+  _PFX0__PFX1__lshruhq3
+  _PFX0__PFX1__lshrusq3
+  _PFX0__PFX1__lshrudq3
+  _PFX0__PFX1__lshrutq3
+  _PFX0__PFX1__lshruha3
+  _PFX0__PFX1__lshrusa3
+  _PFX0__PFX1__lshruda3
+  _PFX0__PFX1__lshruta3
+  _PFX0__PFX1__ssashlqq3
+  _PFX0__PFX1__ssashlhq3
+  _PFX0__PFX1__ssashlsq3
+  _PFX0__PFX1__ssashldq3
+  _PFX0__PFX1__ssashltq3
+  _PFX0__PFX1__ssashlha3
+  _PFX0__PFX1__ssashlsa3
+  _PFX0__PFX1__ssashlda3
+  _PFX0__PFX1__ssashlta3
+  _PFX0__PFX1__usashluqq3
+  _PFX0__PFX1__usashluhq3
+  _PFX0__PFX1__usashlusq3
+  _PFX0__PFX1__usashludq3
+  _PFX0__PFX1__usashlutq3
+  _PFX0__PFX1__usashluha3
+  _PFX0__PFX1__usashlusa3
+  _PFX0__PFX1__usashluda3
+  _PFX0__PFX1__usashluta3
+  _PFX0__PFX1__cmpqq2
+  _PFX0__PFX1__cmphq2
+  _PFX0__PFX1__cmpsq2
+  _PFX0__PFX1__cmpdq2
+  _PFX0__PFX1__cmptq2
+  _PFX0__PFX1__cmpuqq2
+  _PFX0__PFX1__cmpuhq2
+  _PFX0__PFX1__cmpusq2
+  _PFX0__PFX1__cmpudq2
+  _PFX0__PFX1__cmputq2
+  _PFX0__PFX1__cmpha2
+  _PFX0__PFX1__cmpsa2
+  _PFX0__PFX1__cmpda2
+  _PFX0__PFX1__cmpta2
+  _PFX0__PFX1__cmpuha2
+  _PFX0__PFX1__cmpusa2
+  _PFX0__PFX1__cmpuda2
+  _PFX0__PFX1__cmputa2
+  _PFX0__PFX1__fractqqhq2
+  _PFX0__PFX1__fractqqsq2
+  _PFX0__PFX1__fractqqdq2
+  _PFX0__PFX1__fractqqtq2
+  _PFX0__PFX1__fractqqha
+  _PFX0__PFX1__fractqqsa
+  _PFX0__PFX1__fractqqda
+  _PFX0__PFX1__fractqqta
+  _PFX0__PFX1__fractqquqq
+  _PFX0__PFX1__fractqquhq
+  _PFX0__PFX1__fractqqusq
+  _PFX0__PFX1__fractqqudq
+  _PFX0__PFX1__fractqqutq
+  _PFX0__PFX1__fractqquha
+  _PFX0__PFX1__fractqqusa
+  _PFX0__PFX1__fractqquda
+  _PFX0__PFX1__fractqquta
+  _PFX0__PFX1__fractqqqi
+  _PFX0__PFX1__fractqqhi
+  _PFX0__PFX1__fractqqsi
+  _PFX0__PFX1__fractqqdi
+  _PFX0__PFX1__fractqqti
+  _PFX0__PFX1__fractqqsf
+  _PFX0__PFX1__fractqqdf
+  _PFX0__PFX1__fracthqqq2
+  _PFX0__PFX1__fracthqsq2
+  _PFX0__PFX1__fracthqdq2
+  _PFX0__PFX1__fracthqtq2
+  _PFX0__PFX1__fracthqha
+  _PFX0__PFX1__fracthqsa
+  _PFX0__PFX1__fracthqda
+  _PFX0__PFX1__fracthqta
+  _PFX0__PFX1__fracthquqq
+  _PFX0__PFX1__fracthquhq
+  _PFX0__PFX1__fracthqusq
+  _PFX0__PFX1__fracthqudq
+  _PFX0__PFX1__fracthqutq
+  _PFX0__PFX1__fracthquha
+  _PFX0__PFX1__fracthqusa
+  _PFX0__PFX1__fracthquda
+  _PFX0__PFX1__fracthquta
+  _PFX0__PFX1__fracthqqi
+  _PFX0__PFX1__fracthqhi
+  _PFX0__PFX1__fracthqsi
+  _PFX0__PFX1__fracthqdi
+  _PFX0__PFX1__fracthqti
+  _PFX0__PFX1__fracthqsf
+  _PFX0__PFX1__fracthqdf
+  _PFX0__PFX1__fractsqqq2
+  _PFX0__PFX1__fractsqhq2
+  _PFX0__PFX1__fractsqdq2
+  _PFX0__PFX1__fractsqtq2
+  _PFX0__PFX1__fractsqha
+  _PFX0__PFX1__fractsqsa
+  _PFX0__PFX1__fractsqda
+  _PFX0__PFX1__fractsqta
+  _PFX0__PFX1__fractsquqq
+  _PFX0__PFX1__fractsquhq
+  _PFX0__PFX1__fractsqusq
+  _PFX0__PFX1__fractsqudq
+  _PFX0__PFX1__fractsqutq
+  _PFX0__PFX1__fractsquha
+  _PFX0__PFX1__fractsqusa
+  _PFX0__PFX1__fractsquda
+  _PFX0__PFX1__fractsquta
+  _PFX0__PFX1__fractsqqi
+  _PFX0__PFX1__fractsqhi
+  _PFX0__PFX1__fractsqsi
+  _PFX0__PFX1__fractsqdi
+  _PFX0__PFX1__fractsqti
+  _PFX0__PFX1__fractsqsf
+  _PFX0__PFX1__fractsqdf
+  _PFX0__PFX1__fractdqqq2
+  _PFX0__PFX1__fractdqhq2
+  _PFX0__PFX1__fractdqsq2
+  _PFX0__PFX1__fractdqtq2
+  _PFX0__PFX1__fractdqha
+  _PFX0__PFX1__fractdqsa
+  _PFX0__PFX1__fractdqda
+  _PFX0__PFX1__fractdqta
+  _PFX0__PFX1__fractdquqq
+  _PFX0__PFX1__fractdquhq
+  _PFX0__PFX1__fractdqusq
+  _PFX0__PFX1__fractdqudq
+  _PFX0__PFX1__fractdqutq
+  _PFX0__PFX1__fractdquha
+  _PFX0__PFX1__fractdqusa
+  _PFX0__PFX1__fractdquda
+  _PFX0__PFX1__fractdquta
+  _PFX0__PFX1__fractdqqi
+  _PFX0__PFX1__fractdqhi
+  _PFX0__PFX1__fractdqsi
+  _PFX0__PFX1__fractdqdi
+  _PFX0__PFX1__fractdqti
+  _PFX0__PFX1__fractdqsf
+  _PFX0__PFX1__fractdqdf
+  _PFX0__PFX1__fracttqqq2
+  _PFX0__PFX1__fracttqhq2
+  _PFX0__PFX1__fracttqsq2
+  _PFX0__PFX1__fracttqdq2
+  _PFX0__PFX1__fracttqha
+  _PFX0__PFX1__fracttqsa
+  _PFX0__PFX1__fracttqda
+  _PFX0__PFX1__fracttqta
+  _PFX0__PFX1__fracttquqq
+  _PFX0__PFX1__fracttquhq
+  _PFX0__PFX1__fracttqusq
+  _PFX0__PFX1__fracttqudq
+  _PFX0__PFX1__fracttqutq
+  _PFX0__PFX1__fracttquha
+  _PFX0__PFX1__fracttqusa
+  _PFX0__PFX1__fracttquda
+  _PFX0__PFX1__fracttquta
+  _PFX0__PFX1__fracttqqi
+  _PFX0__PFX1__fracttqhi
+  _PFX0__PFX1__fracttqsi
+  _PFX0__PFX1__fracttqdi
+  _PFX0__PFX1__fracttqti
+  _PFX0__PFX1__fracttqsf
+  _PFX0__PFX1__fracttqdf
+  _PFX0__PFX1__fracthaqq
+  _PFX0__PFX1__fracthahq
+  _PFX0__PFX1__fracthasq
+  _PFX0__PFX1__fracthadq
+  _PFX0__PFX1__fracthatq
+  _PFX0__PFX1__fracthasa2
+  _PFX0__PFX1__fracthada2
+  _PFX0__PFX1__fracthata2
+  _PFX0__PFX1__fracthauqq
+  _PFX0__PFX1__fracthauhq
+  _PFX0__PFX1__fracthausq
+  _PFX0__PFX1__fracthaudq
+  _PFX0__PFX1__fracthautq
+  _PFX0__PFX1__fracthauha
+  _PFX0__PFX1__fracthausa
+  _PFX0__PFX1__fracthauda
+  _PFX0__PFX1__fracthauta
+  _PFX0__PFX1__fracthaqi
+  _PFX0__PFX1__fracthahi
+  _PFX0__PFX1__fracthasi
+  _PFX0__PFX1__fracthadi
+  _PFX0__PFX1__fracthati
+  _PFX0__PFX1__fracthasf
+  _PFX0__PFX1__fracthadf
+  _PFX0__PFX1__fractsaqq
+  _PFX0__PFX1__fractsahq
+  _PFX0__PFX1__fractsasq
+  _PFX0__PFX1__fractsadq
+  _PFX0__PFX1__fractsatq
+  _PFX0__PFX1__fractsaha2
+  _PFX0__PFX1__fractsada2
+  _PFX0__PFX1__fractsata2
+  _PFX0__PFX1__fractsauqq
+  _PFX0__PFX1__fractsauhq
+  _PFX0__PFX1__fractsausq
+  _PFX0__PFX1__fractsaudq
+  _PFX0__PFX1__fractsautq
+  _PFX0__PFX1__fractsauha
+  _PFX0__PFX1__fractsausa
+  _PFX0__PFX1__fractsauda
+  _PFX0__PFX1__fractsauta
+  _PFX0__PFX1__fractsaqi
+  _PFX0__PFX1__fractsahi
+  _PFX0__PFX1__fractsasi
+  _PFX0__PFX1__fractsadi
+  _PFX0__PFX1__fractsati
+  _PFX0__PFX1__fractsasf
+  _PFX0__PFX1__fractsadf
+  _PFX0__PFX1__fractdaqq
+  _PFX0__PFX1__fractdahq
+  _PFX0__PFX1__fractdasq
+  _PFX0__PFX1__fractdadq
+  _PFX0__PFX1__fractdatq
+  _PFX0__PFX1__fractdaha2
+  _PFX0__PFX1__fractdasa2
+  _PFX0__PFX1__fractdata2
+  _PFX0__PFX1__fractdauqq
+  _PFX0__PFX1__fractdauhq
+  _PFX0__PFX1__fractdausq
+  _PFX0__PFX1__fractdaudq
+  _PFX0__PFX1__fractdautq
+  _PFX0__PFX1__fractdauha
+  _PFX0__PFX1__fractdausa
+  _PFX0__PFX1__fractdauda
+  _PFX0__PFX1__fractdauta
+  _PFX0__PFX1__fractdaqi
+  _PFX0__PFX1__fractdahi
+  _PFX0__PFX1__fractdasi
+  _PFX0__PFX1__fractdadi
+  _PFX0__PFX1__fractdati
+  _PFX0__PFX1__fractdasf
+  _PFX0__PFX1__fractdadf
+  _PFX0__PFX1__fracttaqq
+  _PFX0__PFX1__fracttahq
+  _PFX0__PFX1__fracttasq
+  _PFX0__PFX1__fracttadq
+  _PFX0__PFX1__fracttatq
+  _PFX0__PFX1__fracttaha2
+  _PFX0__PFX1__fracttasa2
+  _PFX0__PFX1__fracttada2
+  _PFX0__PFX1__fracttauqq
+  _PFX0__PFX1__fracttauhq
+  _PFX0__PFX1__fracttausq
+  _PFX0__PFX1__fracttaudq
+  _PFX0__PFX1__fracttautq
+  _PFX0__PFX1__fracttauha
+  _PFX0__PFX1__fracttausa
+  _PFX0__PFX1__fracttauda
+  _PFX0__PFX1__fracttauta
+  _PFX0__PFX1__fracttaqi
+  _PFX0__PFX1__fracttahi
+  _PFX0__PFX1__fracttasi
+  _PFX0__PFX1__fracttadi
+  _PFX0__PFX1__fracttati
+  _PFX0__PFX1__fracttasf
+  _PFX0__PFX1__fracttadf
+  _PFX0__PFX1__fractuqqqq
+  _PFX0__PFX1__fractuqqhq
+  _PFX0__PFX1__fractuqqsq
+  _PFX0__PFX1__fractuqqdq
+  _PFX0__PFX1__fractuqqtq
+  _PFX0__PFX1__fractuqqha
+  _PFX0__PFX1__fractuqqsa
+  _PFX0__PFX1__fractuqqda
+  _PFX0__PFX1__fractuqqta
+  _PFX0__PFX1__fractuqquhq2
+  _PFX0__PFX1__fractuqqusq2
+  _PFX0__PFX1__fractuqqudq2
+  _PFX0__PFX1__fractuqqutq2
+  _PFX0__PFX1__fractuqquha
+  _PFX0__PFX1__fractuqqusa
+  _PFX0__PFX1__fractuqquda
+  _PFX0__PFX1__fractuqquta
+  _PFX0__PFX1__fractuqqqi
+  _PFX0__PFX1__fractuqqhi
+  _PFX0__PFX1__fractuqqsi
+  _PFX0__PFX1__fractuqqdi
+  _PFX0__PFX1__fractuqqti
+  _PFX0__PFX1__fractuqqsf
+  _PFX0__PFX1__fractuqqdf
+  _PFX0__PFX1__fractuhqqq
+  _PFX0__PFX1__fractuhqhq
+  _PFX0__PFX1__fractuhqsq
+  _PFX0__PFX1__fractuhqdq
+  _PFX0__PFX1__fractuhqtq
+  _PFX0__PFX1__fractuhqha
+  _PFX0__PFX1__fractuhqsa
+  _PFX0__PFX1__fractuhqda
+  _PFX0__PFX1__fractuhqta
+  _PFX0__PFX1__fractuhquqq2
+  _PFX0__PFX1__fractuhqusq2
+  _PFX0__PFX1__fractuhqudq2
+  _PFX0__PFX1__fractuhqutq2
+  _PFX0__PFX1__fractuhquha
+  _PFX0__PFX1__fractuhqusa
+  _PFX0__PFX1__fractuhquda
+  _PFX0__PFX1__fractuhquta
+  _PFX0__PFX1__fractuhqqi
+  _PFX0__PFX1__fractuhqhi
+  _PFX0__PFX1__fractuhqsi
+  _PFX0__PFX1__fractuhqdi
+  _PFX0__PFX1__fractuhqti
+  _PFX0__PFX1__fractuhqsf
+  _PFX0__PFX1__fractuhqdf
+  _PFX0__PFX1__fractusqqq
+  _PFX0__PFX1__fractusqhq
+  _PFX0__PFX1__fractusqsq
+  _PFX0__PFX1__fractusqdq
+  _PFX0__PFX1__fractusqtq
+  _PFX0__PFX1__fractusqha
+  _PFX0__PFX1__fractusqsa
+  _PFX0__PFX1__fractusqda
+  _PFX0__PFX1__fractusqta
+  _PFX0__PFX1__fractusquqq2
+  _PFX0__PFX1__fractusquhq2
+  _PFX0__PFX1__fractusqudq2
+  _PFX0__PFX1__fractusqutq2
+  _PFX0__PFX1__fractusquha
+  _PFX0__PFX1__fractusqusa
+  _PFX0__PFX1__fractusquda
+  _PFX0__PFX1__fractusquta
+  _PFX0__PFX1__fractusqqi
+  _PFX0__PFX1__fractusqhi
+  _PFX0__PFX1__fractusqsi
+  _PFX0__PFX1__fractusqdi
+  _PFX0__PFX1__fractusqti
+  _PFX0__PFX1__fractusqsf
+  _PFX0__PFX1__fractusqdf
+  _PFX0__PFX1__fractudqqq
+  _PFX0__PFX1__fractudqhq
+  _PFX0__PFX1__fractudqsq
+  _PFX0__PFX1__fractudqdq
+  _PFX0__PFX1__fractudqtq
+  _PFX0__PFX1__fractudqha
+  _PFX0__PFX1__fractudqsa
+  _PFX0__PFX1__fractudqda
+  _PFX0__PFX1__fractudqta
+  _PFX0__PFX1__fractudquqq2
+  _PFX0__PFX1__fractudquhq2
+  _PFX0__PFX1__fractudqusq2
+  _PFX0__PFX1__fractudqutq2
+  _PFX0__PFX1__fractudquha
+  _PFX0__PFX1__fractudqusa
+  _PFX0__PFX1__fractudquda
+  _PFX0__PFX1__fractudquta
+  _PFX0__PFX1__fractudqqi
+  _PFX0__PFX1__fractudqhi
+  _PFX0__PFX1__fractudqsi
+  _PFX0__PFX1__fractudqdi
+  _PFX0__PFX1__fractudqti
+  _PFX0__PFX1__fractudqsf
+  _PFX0__PFX1__fractudqdf
+  _PFX0__PFX1__fractutqqq
+  _PFX0__PFX1__fractutqhq
+  _PFX0__PFX1__fractutqsq
+  _PFX0__PFX1__fractutqdq
+  _PFX0__PFX1__fractutqtq
+  _PFX0__PFX1__fractutqha
+  _PFX0__PFX1__fractutqsa
+  _PFX0__PFX1__fractutqda
+  _PFX0__PFX1__fractutqta
+  _PFX0__PFX1__fractutquqq2
+  _PFX0__PFX1__fractutquhq2
+  _PFX0__PFX1__fractutqusq2
+  _PFX0__PFX1__fractutqudq2
+  _PFX0__PFX1__fractutquha
+  _PFX0__PFX1__fractutqusa
+  _PFX0__PFX1__fractutquda
+  _PFX0__PFX1__fractutquta
+  _PFX0__PFX1__fractutqqi
+  _PFX0__PFX1__fractutqhi
+  _PFX0__PFX1__fractutqsi
+  _PFX0__PFX1__fractutqdi
+  _PFX0__PFX1__fractutqti
+  _PFX0__PFX1__fractutqsf
+  _PFX0__PFX1__fractutqdf
+  _PFX0__PFX1__fractuhaqq
+  _PFX0__PFX1__fractuhahq
+  _PFX0__PFX1__fractuhasq
+  _PFX0__PFX1__fractuhadq
+  _PFX0__PFX1__fractuhatq
+  _PFX0__PFX1__fractuhaha
+  _PFX0__PFX1__fractuhasa
+  _PFX0__PFX1__fractuhada
+  _PFX0__PFX1__fractuhata
+  _PFX0__PFX1__fractuhauqq
+  _PFX0__PFX1__fractuhauhq
+  _PFX0__PFX1__fractuhausq
+  _PFX0__PFX1__fractuhaudq
+  _PFX0__PFX1__fractuhautq
+  _PFX0__PFX1__fractuhausa2
+  _PFX0__PFX1__fractuhauda2
+  _PFX0__PFX1__fractuhauta2
+  _PFX0__PFX1__fractuhaqi
+  _PFX0__PFX1__fractuhahi
+  _PFX0__PFX1__fractuhasi
+  _PFX0__PFX1__fractuhadi
+  _PFX0__PFX1__fractuhati
+  _PFX0__PFX1__fractuhasf
+  _PFX0__PFX1__fractuhadf
+  _PFX0__PFX1__fractusaqq
+  _PFX0__PFX1__fractusahq
+  _PFX0__PFX1__fractusasq
+  _PFX0__PFX1__fractusadq
+  _PFX0__PFX1__fractusatq
+  _PFX0__PFX1__fractusaha
+  _PFX0__PFX1__fractusasa
+  _PFX0__PFX1__fractusada
+  _PFX0__PFX1__fractusata
+  _PFX0__PFX1__fractusauqq
+  _PFX0__PFX1__fractusauhq
+  _PFX0__PFX1__fractusausq
+  _PFX0__PFX1__fractusaudq
+  _PFX0__PFX1__fractusautq
+  _PFX0__PFX1__fractusauha2
+  _PFX0__PFX1__fractusauda2
+  _PFX0__PFX1__fractusauta2
+  _PFX0__PFX1__fractusaqi
+  _PFX0__PFX1__fractusahi
+  _PFX0__PFX1__fractusasi
+  _PFX0__PFX1__fractusadi
+  _PFX0__PFX1__fractusati
+  _PFX0__PFX1__fractusasf
+  _PFX0__PFX1__fractusadf
+  _PFX0__PFX1__fractudaqq
+  _PFX0__PFX1__fractudahq
+  _PFX0__PFX1__fractudasq
+  _PFX0__PFX1__fractudadq
+  _PFX0__PFX1__fractudatq
+  _PFX0__PFX1__fractudaha
+  _PFX0__PFX1__fractudasa
+  _PFX0__PFX1__fractudada
+  _PFX0__PFX1__fractudata
+  _PFX0__PFX1__fractudauqq
+  _PFX0__PFX1__fractudauhq
+  _PFX0__PFX1__fractudausq
+  _PFX0__PFX1__fractudaudq
+  _PFX0__PFX1__fractudautq
+  _PFX0__PFX1__fractudauha2
+  _PFX0__PFX1__fractudausa2
+  _PFX0__PFX1__fractudauta2
+  _PFX0__PFX1__fractudaqi
+  _PFX0__PFX1__fractudahi
+  _PFX0__PFX1__fractudasi
+  _PFX0__PFX1__fractudadi
+  _PFX0__PFX1__fractudati
+  _PFX0__PFX1__fractudasf
+  _PFX0__PFX1__fractudadf
+  _PFX0__PFX1__fractutaqq
+  _PFX0__PFX1__fractutahq
+  _PFX0__PFX1__fractutasq
+  _PFX0__PFX1__fractutadq
+  _PFX0__PFX1__fractutatq
+  _PFX0__PFX1__fractutaha
+  _PFX0__PFX1__fractutasa
+  _PFX0__PFX1__fractutada
+  _PFX0__PFX1__fractutata
+  _PFX0__PFX1__fractutauqq
+  _PFX0__PFX1__fractutauhq
+  _PFX0__PFX1__fractutausq
+  _PFX0__PFX1__fractutaudq
+  _PFX0__PFX1__fractutautq
+  _PFX0__PFX1__fractutauha2
+  _PFX0__PFX1__fractutausa2
+  _PFX0__PFX1__fractutauda2
+  _PFX0__PFX1__fractutaqi
+  _PFX0__PFX1__fractutahi
+  _PFX0__PFX1__fractutasi
+  _PFX0__PFX1__fractutadi
+  _PFX0__PFX1__fractutati
+  _PFX0__PFX1__fractutasf
+  _PFX0__PFX1__fractutadf
+  _PFX0__PFX1__fractqiqq
+  _PFX0__PFX1__fractqihq
+  _PFX0__PFX1__fractqisq
+  _PFX0__PFX1__fractqidq
+  _PFX0__PFX1__fractqitq
+  _PFX0__PFX1__fractqiha
+  _PFX0__PFX1__fractqisa
+  _PFX0__PFX1__fractqida
+  _PFX0__PFX1__fractqita
+  _PFX0__PFX1__fractqiuqq
+  _PFX0__PFX1__fractqiuhq
+  _PFX0__PFX1__fractqiusq
+  _PFX0__PFX1__fractqiudq
+  _PFX0__PFX1__fractqiutq
+  _PFX0__PFX1__fractqiuha
+  _PFX0__PFX1__fractqiusa
+  _PFX0__PFX1__fractqiuda
+  _PFX0__PFX1__fractqiuta
+  _PFX0__PFX1__fracthiqq
+  _PFX0__PFX1__fracthihq
+  _PFX0__PFX1__fracthisq
+  _PFX0__PFX1__fracthidq
+  _PFX0__PFX1__fracthitq
+  _PFX0__PFX1__fracthiha
+  _PFX0__PFX1__fracthisa
+  _PFX0__PFX1__fracthida
+  _PFX0__PFX1__fracthita
+  _PFX0__PFX1__fracthiuqq
+  _PFX0__PFX1__fracthiuhq
+  _PFX0__PFX1__fracthiusq
+  _PFX0__PFX1__fracthiudq
+  _PFX0__PFX1__fracthiutq
+  _PFX0__PFX1__fracthiuha
+  _PFX0__PFX1__fracthiusa
+  _PFX0__PFX1__fracthiuda
+  _PFX0__PFX1__fracthiuta
+  _PFX0__PFX1__fractsiqq
+  _PFX0__PFX1__fractsihq
+  _PFX0__PFX1__fractsisq
+  _PFX0__PFX1__fractsidq
+  _PFX0__PFX1__fractsitq
+  _PFX0__PFX1__fractsiha
+  _PFX0__PFX1__fractsisa
+  _PFX0__PFX1__fractsida
+  _PFX0__PFX1__fractsita
+  _PFX0__PFX1__fractsiuqq
+  _PFX0__PFX1__fractsiuhq
+  _PFX0__PFX1__fractsiusq
+  _PFX0__PFX1__fractsiudq
+  _PFX0__PFX1__fractsiutq
+  _PFX0__PFX1__fractsiuha
+  _PFX0__PFX1__fractsiusa
+  _PFX0__PFX1__fractsiuda
+  _PFX0__PFX1__fractsiuta
+  _PFX0__PFX1__fractdiqq
+  _PFX0__PFX1__fractdihq
+  _PFX0__PFX1__fractdisq
+  _PFX0__PFX1__fractdidq
+  _PFX0__PFX1__fractditq
+  _PFX0__PFX1__fractdiha
+  _PFX0__PFX1__fractdisa
+  _PFX0__PFX1__fractdida
+  _PFX0__PFX1__fractdita
+  _PFX0__PFX1__fractdiuqq
+  _PFX0__PFX1__fractdiuhq
+  _PFX0__PFX1__fractdiusq
+  _PFX0__PFX1__fractdiudq
+  _PFX0__PFX1__fractdiutq
+  _PFX0__PFX1__fractdiuha
+  _PFX0__PFX1__fractdiusa
+  _PFX0__PFX1__fractdiuda
+  _PFX0__PFX1__fractdiuta
+  _PFX0__PFX1__fracttiqq
+  _PFX0__PFX1__fracttihq
+  _PFX0__PFX1__fracttisq
+  _PFX0__PFX1__fracttidq
+  _PFX0__PFX1__fracttitq
+  _PFX0__PFX1__fracttiha
+  _PFX0__PFX1__fracttisa
+  _PFX0__PFX1__fracttida
+  _PFX0__PFX1__fracttita
+  _PFX0__PFX1__fracttiuqq
+  _PFX0__PFX1__fracttiuhq
+  _PFX0__PFX1__fracttiusq
+  _PFX0__PFX1__fracttiudq
+  _PFX0__PFX1__fracttiutq
+  _PFX0__PFX1__fracttiuha
+  _PFX0__PFX1__fracttiusa
+  _PFX0__PFX1__fracttiuda
+  _PFX0__PFX1__fracttiuta
+  _PFX0__PFX1__fractsfqq
+  _PFX0__PFX1__fractsfhq
+  _PFX0__PFX1__fractsfsq
+  _PFX0__PFX1__fractsfdq
+  _PFX0__PFX1__fractsftq
+  _PFX0__PFX1__fractsfha
+  _PFX0__PFX1__fractsfsa
+  _PFX0__PFX1__fractsfda
+  _PFX0__PFX1__fractsfta
+  _PFX0__PFX1__fractsfuqq
+  _PFX0__PFX1__fractsfuhq
+  _PFX0__PFX1__fractsfusq
+  _PFX0__PFX1__fractsfudq
+  _PFX0__PFX1__fractsfutq
+  _PFX0__PFX1__fractsfuha
+  _PFX0__PFX1__fractsfusa
+  _PFX0__PFX1__fractsfuda
+  _PFX0__PFX1__fractsfuta
+  _PFX0__PFX1__fractdfqq
+  _PFX0__PFX1__fractdfhq
+  _PFX0__PFX1__fractdfsq
+  _PFX0__PFX1__fractdfdq
+  _PFX0__PFX1__fractdftq
+  _PFX0__PFX1__fractdfha
+  _PFX0__PFX1__fractdfsa
+  _PFX0__PFX1__fractdfda
+  _PFX0__PFX1__fractdfta
+  _PFX0__PFX1__fractdfuqq
+  _PFX0__PFX1__fractdfuhq
+  _PFX0__PFX1__fractdfusq
+  _PFX0__PFX1__fractdfudq
+  _PFX0__PFX1__fractdfutq
+  _PFX0__PFX1__fractdfuha
+  _PFX0__PFX1__fractdfusa
+  _PFX0__PFX1__fractdfuda
+  _PFX0__PFX1__fractdfuta
+  _PFX0__PFX1__satfractqqhq2
+  _PFX0__PFX1__satfractqqsq2
+  _PFX0__PFX1__satfractqqdq2
+  _PFX0__PFX1__satfractqqtq2
+  _PFX0__PFX1__satfractqqha
+  _PFX0__PFX1__satfractqqsa
+  _PFX0__PFX1__satfractqqda
+  _PFX0__PFX1__satfractqqta
+  _PFX0__PFX1__satfractqquqq
+  _PFX0__PFX1__satfractqquhq
+  _PFX0__PFX1__satfractqqusq
+  _PFX0__PFX1__satfractqqudq
+  _PFX0__PFX1__satfractqqutq
+  _PFX0__PFX1__satfractqquha
+  _PFX0__PFX1__satfractqqusa
+  _PFX0__PFX1__satfractqquda
+  _PFX0__PFX1__satfractqquta
+  _PFX0__PFX1__satfracthqqq2
+  _PFX0__PFX1__satfracthqsq2
+  _PFX0__PFX1__satfracthqdq2
+  _PFX0__PFX1__satfracthqtq2
+  _PFX0__PFX1__satfracthqha
+  _PFX0__PFX1__satfracthqsa
+  _PFX0__PFX1__satfracthqda
+  _PFX0__PFX1__satfracthqta
+  _PFX0__PFX1__satfracthquqq
+  _PFX0__PFX1__satfracthquhq
+  _PFX0__PFX1__satfracthqusq
+  _PFX0__PFX1__satfracthqudq
+  _PFX0__PFX1__satfracthqutq
+  _PFX0__PFX1__satfracthquha
+  _PFX0__PFX1__satfracthqusa
+  _PFX0__PFX1__satfracthquda
+  _PFX0__PFX1__satfracthquta
+  _PFX0__PFX1__satfractsqqq2
+  _PFX0__PFX1__satfractsqhq2
+  _PFX0__PFX1__satfractsqdq2
+  _PFX0__PFX1__satfractsqtq2
+  _PFX0__PFX1__satfractsqha
+  _PFX0__PFX1__satfractsqsa
+  _PFX0__PFX1__satfractsqda
+  _PFX0__PFX1__satfractsqta
+  _PFX0__PFX1__satfractsquqq
+  _PFX0__PFX1__satfractsquhq
+  _PFX0__PFX1__satfractsqusq
+  _PFX0__PFX1__satfractsqudq
+  _PFX0__PFX1__satfractsqutq
+  _PFX0__PFX1__satfractsquha
+  _PFX0__PFX1__satfractsqusa
+  _PFX0__PFX1__satfractsquda
+  _PFX0__PFX1__satfractsquta
+  _PFX0__PFX1__satfractdqqq2
+  _PFX0__PFX1__satfractdqhq2
+  _PFX0__PFX1__satfractdqsq2
+  _PFX0__PFX1__satfractdqtq2
+  _PFX0__PFX1__satfractdqha
+  _PFX0__PFX1__satfractdqsa
+  _PFX0__PFX1__satfractdqda
+  _PFX0__PFX1__satfractdqta
+  _PFX0__PFX1__satfractdquqq
+  _PFX0__PFX1__satfractdquhq
+  _PFX0__PFX1__satfractdqusq
+  _PFX0__PFX1__satfractdqudq
+  _PFX0__PFX1__satfractdqutq
+  _PFX0__PFX1__satfractdquha
+  _PFX0__PFX1__satfractdqusa
+  _PFX0__PFX1__satfractdquda
+  _PFX0__PFX1__satfractdquta
+  _PFX0__PFX1__satfracttqqq2
+  _PFX0__PFX1__satfracttqhq2
+  _PFX0__PFX1__satfracttqsq2
+  _PFX0__PFX1__satfracttqdq2
+  _PFX0__PFX1__satfracttqha
+  _PFX0__PFX1__satfracttqsa
+  _PFX0__PFX1__satfracttqda
+  _PFX0__PFX1__satfracttqta
+  _PFX0__PFX1__satfracttquqq
+  _PFX0__PFX1__satfracttquhq
+  _PFX0__PFX1__satfracttqusq
+  _PFX0__PFX1__satfracttqudq
+  _PFX0__PFX1__satfracttqutq
+  _PFX0__PFX1__satfracttquha
+  _PFX0__PFX1__satfracttqusa
+  _PFX0__PFX1__satfracttquda
+  _PFX0__PFX1__satfracttquta
+  _PFX0__PFX1__satfracthaqq
+  _PFX0__PFX1__satfracthahq
+  _PFX0__PFX1__satfracthasq
+  _PFX0__PFX1__satfracthadq
+  _PFX0__PFX1__satfracthatq
+  _PFX0__PFX1__satfracthasa2
+  _PFX0__PFX1__satfracthada2
+  _PFX0__PFX1__satfracthata2
+  _PFX0__PFX1__satfracthauqq
+  _PFX0__PFX1__satfracthauhq
+  _PFX0__PFX1__satfracthausq
+  _PFX0__PFX1__satfracthaudq
+  _PFX0__PFX1__satfracthautq
+  _PFX0__PFX1__satfracthauha
+  _PFX0__PFX1__satfracthausa
+  _PFX0__PFX1__satfracthauda
+  _PFX0__PFX1__satfracthauta
+  _PFX0__PFX1__satfractsaqq
+  _PFX0__PFX1__satfractsahq
+  _PFX0__PFX1__satfractsasq
+  _PFX0__PFX1__satfractsadq
+  _PFX0__PFX1__satfractsatq
+  _PFX0__PFX1__satfractsaha2
+  _PFX0__PFX1__satfractsada2
+  _PFX0__PFX1__satfractsata2
+  _PFX0__PFX1__satfractsauqq
+  _PFX0__PFX1__satfractsauhq
+  _PFX0__PFX1__satfractsausq
+  _PFX0__PFX1__satfractsaudq
+  _PFX0__PFX1__satfractsautq
+  _PFX0__PFX1__satfractsauha
+  _PFX0__PFX1__satfractsausa
+  _PFX0__PFX1__satfractsauda
+  _PFX0__PFX1__satfractsauta
+  _PFX0__PFX1__satfractdaqq
+  _PFX0__PFX1__satfractdahq
+  _PFX0__PFX1__satfractdasq
+  _PFX0__PFX1__satfractdadq
+  _PFX0__PFX1__satfractdatq
+  _PFX0__PFX1__satfractdaha2
+  _PFX0__PFX1__satfractdasa2
+  _PFX0__PFX1__satfractdata2
+  _PFX0__PFX1__satfractdauqq
+  _PFX0__PFX1__satfractdauhq
+  _PFX0__PFX1__satfractdausq
+  _PFX0__PFX1__satfractdaudq
+  _PFX0__PFX1__satfractdautq
+  _PFX0__PFX1__satfractdauha
+  _PFX0__PFX1__satfractdausa
+  _PFX0__PFX1__satfractdauda
+  _PFX0__PFX1__satfractdauta
+  _PFX0__PFX1__satfracttaqq
+  _PFX0__PFX1__satfracttahq
+  _PFX0__PFX1__satfracttasq
+  _PFX0__PFX1__satfracttadq
+  _PFX0__PFX1__satfracttatq
+  _PFX0__PFX1__satfracttaha2
+  _PFX0__PFX1__satfracttasa2
+  _PFX0__PFX1__satfracttada2
+  _PFX0__PFX1__satfracttauqq
+  _PFX0__PFX1__satfracttauhq
+  _PFX0__PFX1__satfracttausq
+  _PFX0__PFX1__satfracttaudq
+  _PFX0__PFX1__satfracttautq
+  _PFX0__PFX1__satfracttauha
+  _PFX0__PFX1__satfracttausa
+  _PFX0__PFX1__satfracttauda
+  _PFX0__PFX1__satfracttauta
+  _PFX0__PFX1__satfractuqqqq
+  _PFX0__PFX1__satfractuqqhq
+  _PFX0__PFX1__satfractuqqsq
+  _PFX0__PFX1__satfractuqqdq
+  _PFX0__PFX1__satfractuqqtq
+  _PFX0__PFX1__satfractuqqha
+  _PFX0__PFX1__satfractuqqsa
+  _PFX0__PFX1__satfractuqqda
+  _PFX0__PFX1__satfractuqqta
+  _PFX0__PFX1__satfractuqquhq2
+  _PFX0__PFX1__satfractuqqusq2
+  _PFX0__PFX1__satfractuqqudq2
+  _PFX0__PFX1__satfractuqqutq2
+  _PFX0__PFX1__satfractuqquha
+  _PFX0__PFX1__satfractuqqusa
+  _PFX0__PFX1__satfractuqquda
+  _PFX0__PFX1__satfractuqquta
+  _PFX0__PFX1__satfractuhqqq
+  _PFX0__PFX1__satfractuhqhq
+  _PFX0__PFX1__satfractuhqsq
+  _PFX0__PFX1__satfractuhqdq
+  _PFX0__PFX1__satfractuhqtq
+  _PFX0__PFX1__satfractuhqha
+  _PFX0__PFX1__satfractuhqsa
+  _PFX0__PFX1__satfractuhqda
+  _PFX0__PFX1__satfractuhqta
+  _PFX0__PFX1__satfractuhquqq2
+  _PFX0__PFX1__satfractuhqusq2
+  _PFX0__PFX1__satfractuhqudq2
+  _PFX0__PFX1__satfractuhqutq2
+  _PFX0__PFX1__satfractuhquha
+  _PFX0__PFX1__satfractuhqusa
+  _PFX0__PFX1__satfractuhquda
+  _PFX0__PFX1__satfractuhquta
+  _PFX0__PFX1__satfractusqqq
+  _PFX0__PFX1__satfractusqhq
+  _PFX0__PFX1__satfractusqsq
+  _PFX0__PFX1__satfractusqdq
+  _PFX0__PFX1__satfractusqtq
+  _PFX0__PFX1__satfractusqha
+  _PFX0__PFX1__satfractusqsa
+  _PFX0__PFX1__satfractusqda
+  _PFX0__PFX1__satfractusqta
+  _PFX0__PFX1__satfractusquqq2
+  _PFX0__PFX1__satfractusquhq2
+  _PFX0__PFX1__satfractusqudq2
+  _PFX0__PFX1__satfractusqutq2
+  _PFX0__PFX1__satfractusquha
+  _PFX0__PFX1__satfractusqusa
+  _PFX0__PFX1__satfractusquda
+  _PFX0__PFX1__satfractusquta
+  _PFX0__PFX1__satfractudqqq
+  _PFX0__PFX1__satfractudqhq
+  _PFX0__PFX1__satfractudqsq
+  _PFX0__PFX1__satfractudqdq
+  _PFX0__PFX1__satfractudqtq
+  _PFX0__PFX1__satfractudqha
+  _PFX0__PFX1__satfractudqsa
+  _PFX0__PFX1__satfractudqda
+  _PFX0__PFX1__satfractudqta
+  _PFX0__PFX1__satfractudquqq2
+  _PFX0__PFX1__satfractudquhq2
+  _PFX0__PFX1__satfractudqusq2
+  _PFX0__PFX1__satfractudqutq2
+  _PFX0__PFX1__satfractudquha
+  _PFX0__PFX1__satfractudqusa
+  _PFX0__PFX1__satfractudquda
+  _PFX0__PFX1__satfractudquta
+  _PFX0__PFX1__satfractutqqq
+  _PFX0__PFX1__satfractutqhq
+  _PFX0__PFX1__satfractutqsq
+  _PFX0__PFX1__satfractutqdq
+  _PFX0__PFX1__satfractutqtq
+  _PFX0__PFX1__satfractutqha
+  _PFX0__PFX1__satfractutqsa
+  _PFX0__PFX1__satfractutqda
+  _PFX0__PFX1__satfractutqta
+  _PFX0__PFX1__satfractutquqq2
+  _PFX0__PFX1__satfractutquhq2
+  _PFX0__PFX1__satfractutqusq2
+  _PFX0__PFX1__satfractutqudq2
+  _PFX0__PFX1__satfractutquha
+  _PFX0__PFX1__satfractutqusa
+  _PFX0__PFX1__satfractutquda
+  _PFX0__PFX1__satfractutquta
+  _PFX0__PFX1__satfractuhaqq
+  _PFX0__PFX1__satfractuhahq
+  _PFX0__PFX1__satfractuhasq
+  _PFX0__PFX1__satfractuhadq
+  _PFX0__PFX1__satfractuhatq
+  _PFX0__PFX1__satfractuhaha
+  _PFX0__PFX1__satfractuhasa
+  _PFX0__PFX1__satfractuhada
+  _PFX0__PFX1__satfractuhata
+  _PFX0__PFX1__satfractuhauqq
+  _PFX0__PFX1__satfractuhauhq
+  _PFX0__PFX1__satfractuhausq
+  _PFX0__PFX1__satfractuhaudq
+  _PFX0__PFX1__satfractuhautq
+  _PFX0__PFX1__satfractuhausa2
+  _PFX0__PFX1__satfractuhauda2
+  _PFX0__PFX1__satfractuhauta2
+  _PFX0__PFX1__satfractusaqq
+  _PFX0__PFX1__satfractusahq
+  _PFX0__PFX1__satfractusasq
+  _PFX0__PFX1__satfractusadq
+  _PFX0__PFX1__satfractusatq
+  _PFX0__PFX1__satfractusaha
+  _PFX0__PFX1__satfractusasa
+  _PFX0__PFX1__satfractusada
+  _PFX0__PFX1__satfractusata
+  _PFX0__PFX1__satfractusauqq
+  _PFX0__PFX1__satfractusauhq
+  _PFX0__PFX1__satfractusausq
+  _PFX0__PFX1__satfractusaudq
+  _PFX0__PFX1__satfractusautq
+  _PFX0__PFX1__satfractusauha2
+  _PFX0__PFX1__satfractusauda2
+  _PFX0__PFX1__satfractusauta2
+  _PFX0__PFX1__satfractudaqq
+  _PFX0__PFX1__satfractudahq
+  _PFX0__PFX1__satfractudasq
+  _PFX0__PFX1__satfractudadq
+  _PFX0__PFX1__satfractudatq
+  _PFX0__PFX1__satfractudaha
+  _PFX0__PFX1__satfractudasa
+  _PFX0__PFX1__satfractudada
+  _PFX0__PFX1__satfractudata
+  _PFX0__PFX1__satfractudauqq
+  _PFX0__PFX1__satfractudauhq
+  _PFX0__PFX1__satfractudausq
+  _PFX0__PFX1__satfractudaudq
+  _PFX0__PFX1__satfractudautq
+  _PFX0__PFX1__satfractudauha2
+  _PFX0__PFX1__satfractudausa2
+  _PFX0__PFX1__satfractudauta2
+  _PFX0__PFX1__satfractutaqq
+  _PFX0__PFX1__satfractutahq
+  _PFX0__PFX1__satfractutasq
+  _PFX0__PFX1__satfractutadq
+  _PFX0__PFX1__satfractutatq
+  _PFX0__PFX1__satfractutaha
+  _PFX0__PFX1__satfractutasa
+  _PFX0__PFX1__satfractutada
+  _PFX0__PFX1__satfractutata
+  _PFX0__PFX1__satfractutauqq
+  _PFX0__PFX1__satfractutauhq
+  _PFX0__PFX1__satfractutausq
+  _PFX0__PFX1__satfractutaudq
+  _PFX0__PFX1__satfractutautq
+  _PFX0__PFX1__satfractutauha2
+  _PFX0__PFX1__satfractutausa2
+  _PFX0__PFX1__satfractutauda2
+  _PFX0__PFX1__satfractqiqq
+  _PFX0__PFX1__satfractqihq
+  _PFX0__PFX1__satfractqisq
+  _PFX0__PFX1__satfractqidq
+  _PFX0__PFX1__satfractqitq
+  _PFX0__PFX1__satfractqiha
+  _PFX0__PFX1__satfractqisa
+  _PFX0__PFX1__satfractqida
+  _PFX0__PFX1__satfractqita
+  _PFX0__PFX1__satfractqiuqq
+  _PFX0__PFX1__satfractqiuhq
+  _PFX0__PFX1__satfractqiusq
+  _PFX0__PFX1__satfractqiudq
+  _PFX0__PFX1__satfractqiutq
+  _PFX0__PFX1__satfractqiuha
+  _PFX0__PFX1__satfractqiusa
+  _PFX0__PFX1__satfractqiuda
+  _PFX0__PFX1__satfractqiuta
+  _PFX0__PFX1__satfracthiqq
+  _PFX0__PFX1__satfracthihq
+  _PFX0__PFX1__satfracthisq
+  _PFX0__PFX1__satfracthidq
+  _PFX0__PFX1__satfracthitq
+  _PFX0__PFX1__satfracthiha
+  _PFX0__PFX1__satfracthisa
+  _PFX0__PFX1__satfracthida
+  _PFX0__PFX1__satfracthita
+  _PFX0__PFX1__satfracthiuqq
+  _PFX0__PFX1__satfracthiuhq
+  _PFX0__PFX1__satfracthiusq
+  _PFX0__PFX1__satfracthiudq
+  _PFX0__PFX1__satfracthiutq
+  _PFX0__PFX1__satfracthiuha
+  _PFX0__PFX1__satfracthiusa
+  _PFX0__PFX1__satfracthiuda
+  _PFX0__PFX1__satfracthiuta
+  _PFX0__PFX1__satfractsiqq
+  _PFX0__PFX1__satfractsihq
+  _PFX0__PFX1__satfractsisq
+  _PFX0__PFX1__satfractsidq
+  _PFX0__PFX1__satfractsitq
+  _PFX0__PFX1__satfractsiha
+  _PFX0__PFX1__satfractsisa
+  _PFX0__PFX1__satfractsida
+  _PFX0__PFX1__satfractsita
+  _PFX0__PFX1__satfractsiuqq
+  _PFX0__PFX1__satfractsiuhq
+  _PFX0__PFX1__satfractsiusq
+  _PFX0__PFX1__satfractsiudq
+  _PFX0__PFX1__satfractsiutq
+  _PFX0__PFX1__satfractsiuha
+  _PFX0__PFX1__satfractsiusa
+  _PFX0__PFX1__satfractsiuda
+  _PFX0__PFX1__satfractsiuta
+  _PFX0__PFX1__satfractdiqq
+  _PFX0__PFX1__satfractdihq
+  _PFX0__PFX1__satfractdisq
+  _PFX0__PFX1__satfractdidq
+  _PFX0__PFX1__satfractditq
+  _PFX0__PFX1__satfractdiha
+  _PFX0__PFX1__satfractdisa
+  _PFX0__PFX1__satfractdida
+  _PFX0__PFX1__satfractdita
+  _PFX0__PFX1__satfractdiuqq
+  _PFX0__PFX1__satfractdiuhq
+  _PFX0__PFX1__satfractdiusq
+  _PFX0__PFX1__satfractdiudq
+  _PFX0__PFX1__satfractdiutq
+  _PFX0__PFX1__satfractdiuha
+  _PFX0__PFX1__satfractdiusa
+  _PFX0__PFX1__satfractdiuda
+  _PFX0__PFX1__satfractdiuta
+  _PFX0__PFX1__satfracttiqq
+  _PFX0__PFX1__satfracttihq
+  _PFX0__PFX1__satfracttisq
+  _PFX0__PFX1__satfracttidq
+  _PFX0__PFX1__satfracttitq
+  _PFX0__PFX1__satfracttiha
+  _PFX0__PFX1__satfracttisa
+  _PFX0__PFX1__satfracttida
+  _PFX0__PFX1__satfracttita
+  _PFX0__PFX1__satfracttiuqq
+  _PFX0__PFX1__satfracttiuhq
+  _PFX0__PFX1__satfracttiusq
+  _PFX0__PFX1__satfracttiudq
+  _PFX0__PFX1__satfracttiutq
+  _PFX0__PFX1__satfracttiuha
+  _PFX0__PFX1__satfracttiusa
+  _PFX0__PFX1__satfracttiuda
+  _PFX0__PFX1__satfracttiuta
+  _PFX0__PFX1__satfractsfqq
+  _PFX0__PFX1__satfractsfhq
+  _PFX0__PFX1__satfractsfsq
+  _PFX0__PFX1__satfractsfdq
+  _PFX0__PFX1__satfractsftq
+  _PFX0__PFX1__satfractsfha
+  _PFX0__PFX1__satfractsfsa
+  _PFX0__PFX1__satfractsfda
+  _PFX0__PFX1__satfractsfta
+  _PFX0__PFX1__satfractsfuqq
+  _PFX0__PFX1__satfractsfuhq
+  _PFX0__PFX1__satfractsfusq
+  _PFX0__PFX1__satfractsfudq
+  _PFX0__PFX1__satfractsfutq
+  _PFX0__PFX1__satfractsfuha
+  _PFX0__PFX1__satfractsfusa
+  _PFX0__PFX1__satfractsfuda
+  _PFX0__PFX1__satfractsfuta
+  _PFX0__PFX1__satfractdfqq
+  _PFX0__PFX1__satfractdfhq
+  _PFX0__PFX1__satfractdfsq
+  _PFX0__PFX1__satfractdfdq
+  _PFX0__PFX1__satfractdftq
+  _PFX0__PFX1__satfractdfha
+  _PFX0__PFX1__satfractdfsa
+  _PFX0__PFX1__satfractdfda
+  _PFX0__PFX1__satfractdfta
+  _PFX0__PFX1__satfractdfuqq
+  _PFX0__PFX1__satfractdfuhq
+  _PFX0__PFX1__satfractdfusq
+  _PFX0__PFX1__satfractdfudq
+  _PFX0__PFX1__satfractdfutq
+  _PFX0__PFX1__satfractdfuha
+  _PFX0__PFX1__satfractdfusa
+  _PFX0__PFX1__satfractdfuda
+  _PFX0__PFX1__satfractdfuta
+  _PFX0__PFX1__fractunsqqqi
+  _PFX0__PFX1__fractunsqqhi
+  _PFX0__PFX1__fractunsqqsi
+  _PFX0__PFX1__fractunsqqdi
+  _PFX0__PFX1__fractunsqqti
+  _PFX0__PFX1__fractunshqqi
+  _PFX0__PFX1__fractunshqhi
+  _PFX0__PFX1__fractunshqsi
+  _PFX0__PFX1__fractunshqdi
+  _PFX0__PFX1__fractunshqti
+  _PFX0__PFX1__fractunssqqi
+  _PFX0__PFX1__fractunssqhi
+  _PFX0__PFX1__fractunssqsi
+  _PFX0__PFX1__fractunssqdi
+  _PFX0__PFX1__fractunssqti
+  _PFX0__PFX1__fractunsdqqi
+  _PFX0__PFX1__fractunsdqhi
+  _PFX0__PFX1__fractunsdqsi
+  _PFX0__PFX1__fractunsdqdi
+  _PFX0__PFX1__fractunsdqti
+  _PFX0__PFX1__fractunstqqi
+  _PFX0__PFX1__fractunstqhi
+  _PFX0__PFX1__fractunstqsi
+  _PFX0__PFX1__fractunstqdi
+  _PFX0__PFX1__fractunstqti
+  _PFX0__PFX1__fractunshaqi
+  _PFX0__PFX1__fractunshahi
+  _PFX0__PFX1__fractunshasi
+  _PFX0__PFX1__fractunshadi
+  _PFX0__PFX1__fractunshati
+  _PFX0__PFX1__fractunssaqi
+  _PFX0__PFX1__fractunssahi
+  _PFX0__PFX1__fractunssasi
+  _PFX0__PFX1__fractunssadi
+  _PFX0__PFX1__fractunssati
+  _PFX0__PFX1__fractunsdaqi
+  _PFX0__PFX1__fractunsdahi
+  _PFX0__PFX1__fractunsdasi
+  _PFX0__PFX1__fractunsdadi
+  _PFX0__PFX1__fractunsdati
+  _PFX0__PFX1__fractunstaqi
+  _PFX0__PFX1__fractunstahi
+  _PFX0__PFX1__fractunstasi
+  _PFX0__PFX1__fractunstadi
+  _PFX0__PFX1__fractunstati
+  _PFX0__PFX1__fractunsuqqqi
+  _PFX0__PFX1__fractunsuqqhi
+  _PFX0__PFX1__fractunsuqqsi
+  _PFX0__PFX1__fractunsuqqdi
+  _PFX0__PFX1__fractunsuqqti
+  _PFX0__PFX1__fractunsuhqqi
+  _PFX0__PFX1__fractunsuhqhi
+  _PFX0__PFX1__fractunsuhqsi
+  _PFX0__PFX1__fractunsuhqdi
+  _PFX0__PFX1__fractunsuhqti
+  _PFX0__PFX1__fractunsusqqi
+  _PFX0__PFX1__fractunsusqhi
+  _PFX0__PFX1__fractunsusqsi
+  _PFX0__PFX1__fractunsusqdi
+  _PFX0__PFX1__fractunsusqti
+  _PFX0__PFX1__fractunsudqqi
+  _PFX0__PFX1__fractunsudqhi
+  _PFX0__PFX1__fractunsudqsi
+  _PFX0__PFX1__fractunsudqdi
+  _PFX0__PFX1__fractunsudqti
+  _PFX0__PFX1__fractunsutqqi
+  _PFX0__PFX1__fractunsutqhi
+  _PFX0__PFX1__fractunsutqsi
+  _PFX0__PFX1__fractunsutqdi
+  _PFX0__PFX1__fractunsutqti
+  _PFX0__PFX1__fractunsuhaqi
+  _PFX0__PFX1__fractunsuhahi
+  _PFX0__PFX1__fractunsuhasi
+  _PFX0__PFX1__fractunsuhadi
+  _PFX0__PFX1__fractunsuhati
+  _PFX0__PFX1__fractunsusaqi
+  _PFX0__PFX1__fractunsusahi
+  _PFX0__PFX1__fractunsusasi
+  _PFX0__PFX1__fractunsusadi
+  _PFX0__PFX1__fractunsusati
+  _PFX0__PFX1__fractunsudaqi
+  _PFX0__PFX1__fractunsudahi
+  _PFX0__PFX1__fractunsudasi
+  _PFX0__PFX1__fractunsudadi
+  _PFX0__PFX1__fractunsudati
+  _PFX0__PFX1__fractunsutaqi
+  _PFX0__PFX1__fractunsutahi
+  _PFX0__PFX1__fractunsutasi
+  _PFX0__PFX1__fractunsutadi
+  _PFX0__PFX1__fractunsutati
+  _PFX0__PFX1__fractunsqiqq
+  _PFX0__PFX1__fractunsqihq
+  _PFX0__PFX1__fractunsqisq
+  _PFX0__PFX1__fractunsqidq
+  _PFX0__PFX1__fractunsqitq
+  _PFX0__PFX1__fractunsqiha
+  _PFX0__PFX1__fractunsqisa
+  _PFX0__PFX1__fractunsqida
+  _PFX0__PFX1__fractunsqita
+  _PFX0__PFX1__fractunsqiuqq
+  _PFX0__PFX1__fractunsqiuhq
+  _PFX0__PFX1__fractunsqiusq
+  _PFX0__PFX1__fractunsqiudq
+  _PFX0__PFX1__fractunsqiutq
+  _PFX0__PFX1__fractunsqiuha
+  _PFX0__PFX1__fractunsqiusa
+  _PFX0__PFX1__fractunsqiuda
+  _PFX0__PFX1__fractunsqiuta
+  _PFX0__PFX1__fractunshiqq
+  _PFX0__PFX1__fractunshihq
+  _PFX0__PFX1__fractunshisq
+  _PFX0__PFX1__fractunshidq
+  _PFX0__PFX1__fractunshitq
+  _PFX0__PFX1__fractunshiha
+  _PFX0__PFX1__fractunshisa
+  _PFX0__PFX1__fractunshida
+  _PFX0__PFX1__fractunshita
+  _PFX0__PFX1__fractunshiuqq
+  _PFX0__PFX1__fractunshiuhq
+  _PFX0__PFX1__fractunshiusq
+  _PFX0__PFX1__fractunshiudq
+  _PFX0__PFX1__fractunshiutq
+  _PFX0__PFX1__fractunshiuha
+  _PFX0__PFX1__fractunshiusa
+  _PFX0__PFX1__fractunshiuda
+  _PFX0__PFX1__fractunshiuta
+  _PFX0__PFX1__fractunssiqq
+  _PFX0__PFX1__fractunssihq
+  _PFX0__PFX1__fractunssisq
+  _PFX0__PFX1__fractunssidq
+  _PFX0__PFX1__fractunssitq
+  _PFX0__PFX1__fractunssiha
+  _PFX0__PFX1__fractunssisa
+  _PFX0__PFX1__fractunssida
+  _PFX0__PFX1__fractunssita
+  _PFX0__PFX1__fractunssiuqq
+  _PFX0__PFX1__fractunssiuhq
+  _PFX0__PFX1__fractunssiusq
+  _PFX0__PFX1__fractunssiudq
+  _PFX0__PFX1__fractunssiutq
+  _PFX0__PFX1__fractunssiuha
+  _PFX0__PFX1__fractunssiusa
+  _PFX0__PFX1__fractunssiuda
+  _PFX0__PFX1__fractunssiuta
+  _PFX0__PFX1__fractunsdiqq
+  _PFX0__PFX1__fractunsdihq
+  _PFX0__PFX1__fractunsdisq
+  _PFX0__PFX1__fractunsdidq
+  _PFX0__PFX1__fractunsditq
+  _PFX0__PFX1__fractunsdiha
+  _PFX0__PFX1__fractunsdisa
+  _PFX0__PFX1__fractunsdida
+  _PFX0__PFX1__fractunsdita
+  _PFX0__PFX1__fractunsdiuqq
+  _PFX0__PFX1__fractunsdiuhq
+  _PFX0__PFX1__fractunsdiusq
+  _PFX0__PFX1__fractunsdiudq
+  _PFX0__PFX1__fractunsdiutq
+  _PFX0__PFX1__fractunsdiuha
+  _PFX0__PFX1__fractunsdiusa
+  _PFX0__PFX1__fractunsdiuda
+  _PFX0__PFX1__fractunsdiuta
+  _PFX0__PFX1__fractunstiqq
+  _PFX0__PFX1__fractunstihq
+  _PFX0__PFX1__fractunstisq
+  _PFX0__PFX1__fractunstidq
+  _PFX0__PFX1__fractunstitq
+  _PFX0__PFX1__fractunstiha
+  _PFX0__PFX1__fractunstisa
+  _PFX0__PFX1__fractunstida
+  _PFX0__PFX1__fractunstita
+  _PFX0__PFX1__fractunstiuqq
+  _PFX0__PFX1__fractunstiuhq
+  _PFX0__PFX1__fractunstiusq
+  _PFX0__PFX1__fractunstiudq
+  _PFX0__PFX1__fractunstiutq
+  _PFX0__PFX1__fractunstiuha
+  _PFX0__PFX1__fractunstiusa
+  _PFX0__PFX1__fractunstiuda
+  _PFX0__PFX1__fractunstiuta
+  _PFX0__PFX1__satfractunsqiqq
+  _PFX0__PFX1__satfractunsqihq
+  _PFX0__PFX1__satfractunsqisq
+  _PFX0__PFX1__satfractunsqidq
+  _PFX0__PFX1__satfractunsqitq
+  _PFX0__PFX1__satfractunsqiha
+  _PFX0__PFX1__satfractunsqisa
+  _PFX0__PFX1__satfractunsqida
+  _PFX0__PFX1__satfractunsqita
+  _PFX0__PFX1__satfractunsqiuqq
+  _PFX0__PFX1__satfractunsqiuhq
+  _PFX0__PFX1__satfractunsqiusq
+  _PFX0__PFX1__satfractunsqiudq
+  _PFX0__PFX1__satfractunsqiutq
+  _PFX0__PFX1__satfractunsqiuha
+  _PFX0__PFX1__satfractunsqiusa
+  _PFX0__PFX1__satfractunsqiuda
+  _PFX0__PFX1__satfractunsqiuta
+  _PFX0__PFX1__satfractunshiqq
+  _PFX0__PFX1__satfractunshihq
+  _PFX0__PFX1__satfractunshisq
+  _PFX0__PFX1__satfractunshidq
+  _PFX0__PFX1__satfractunshitq
+  _PFX0__PFX1__satfractunshiha
+  _PFX0__PFX1__satfractunshisa
+  _PFX0__PFX1__satfractunshida
+  _PFX0__PFX1__satfractunshita
+  _PFX0__PFX1__satfractunshiuqq
+  _PFX0__PFX1__satfractunshiuhq
+  _PFX0__PFX1__satfractunshiusq
+  _PFX0__PFX1__satfractunshiudq
+  _PFX0__PFX1__satfractunshiutq
+  _PFX0__PFX1__satfractunshiuha
+  _PFX0__PFX1__satfractunshiusa
+  _PFX0__PFX1__satfractunshiuda
+  _PFX0__PFX1__satfractunshiuta
+  _PFX0__PFX1__satfractunssiqq
+  _PFX0__PFX1__satfractunssihq
+  _PFX0__PFX1__satfractunssisq
+  _PFX0__PFX1__satfractunssidq
+  _PFX0__PFX1__satfractunssitq
+  _PFX0__PFX1__satfractunssiha
+  _PFX0__PFX1__satfractunssisa
+  _PFX0__PFX1__satfractunssida
+  _PFX0__PFX1__satfractunssita
+  _PFX0__PFX1__satfractunssiuqq
+  _PFX0__PFX1__satfractunssiuhq
+  _PFX0__PFX1__satfractunssiusq
+  _PFX0__PFX1__satfractunssiudq
+  _PFX0__PFX1__satfractunssiutq
+  _PFX0__PFX1__satfractunssiuha
+  _PFX0__PFX1__satfractunssiusa
+  _PFX0__PFX1__satfractunssiuda
+  _PFX0__PFX1__satfractunssiuta
+  _PFX0__PFX1__satfractunsdiqq
+  _PFX0__PFX1__satfractunsdihq
+  _PFX0__PFX1__satfractunsdisq
+  _PFX0__PFX1__satfractunsdidq
+  _PFX0__PFX1__satfractunsditq
+  _PFX0__PFX1__satfractunsdiha
+  _PFX0__PFX1__satfractunsdisa
+  _PFX0__PFX1__satfractunsdida
+  _PFX0__PFX1__satfractunsdita
+  _PFX0__PFX1__satfractunsdiuqq
+  _PFX0__PFX1__satfractunsdiuhq
+  _PFX0__PFX1__satfractunsdiusq
+  _PFX0__PFX1__satfractunsdiudq
+  _PFX0__PFX1__satfractunsdiutq
+  _PFX0__PFX1__satfractunsdiuha
+  _PFX0__PFX1__satfractunsdiusa
+  _PFX0__PFX1__satfractunsdiuda
+  _PFX0__PFX1__satfractunsdiuta
+  _PFX0__PFX1__satfractunstiqq
+  _PFX0__PFX1__satfractunstihq
+  _PFX0__PFX1__satfractunstisq
+  _PFX0__PFX1__satfractunstidq
+  _PFX0__PFX1__satfractunstitq
+  _PFX0__PFX1__satfractunstiha
+  _PFX0__PFX1__satfractunstisa
+  _PFX0__PFX1__satfractunstida
+  _PFX0__PFX1__satfractunstita
+  _PFX0__PFX1__satfractunstiuqq
+  _PFX0__PFX1__satfractunstiuhq
+  _PFX0__PFX1__satfractunstiusq
+  _PFX0__PFX1__satfractunstiudq
+  _PFX0__PFX1__satfractunstiutq
+  _PFX0__PFX1__satfractunstiuha
+  _PFX0__PFX1__satfractunstiusa
+  _PFX0__PFX1__satfractunstiuda
+  _PFX0__PFX1__satfractunstiuta
+}
+
+%inherit GCC_4.4.0 GCC_4.3.0
+GCC_4.4.0 {
+  _PFX0__sync_fetch_and_add_1
+  _PFX0__sync_fetch_and_sub_1
+  _PFX0__sync_fetch_and_or_1
+  _PFX0__sync_fetch_and_and_1
+  _PFX0__sync_fetch_and_xor_1
+  _PFX0__sync_fetch_and_nand_1
+  _PFX0__sync_add_and_fetch_1
+  _PFX0__sync_sub_and_fetch_1
+  _PFX0__sync_or_and_fetch_1
+  _PFX0__sync_and_and_fetch_1
+  _PFX0__sync_xor_and_fetch_1
+  _PFX0__sync_nand_and_fetch_1
+  _PFX0__sync_bool_compare_and_swap_1
+  _PFX0__sync_val_compare_and_swap_1
+  _PFX0__sync_lock_test_and_set_1
+
+  _PFX0__sync_fetch_and_add_2
+  _PFX0__sync_fetch_and_sub_2
+  _PFX0__sync_fetch_and_or_2
+  _PFX0__sync_fetch_and_and_2
+  _PFX0__sync_fetch_and_xor_2
+  _PFX0__sync_fetch_and_nand_2
+  _PFX0__sync_add_and_fetch_2
+  _PFX0__sync_sub_and_fetch_2
+  _PFX0__sync_or_and_fetch_2
+  _PFX0__sync_and_and_fetch_2
+  _PFX0__sync_xor_and_fetch_2
+  _PFX0__sync_nand_and_fetch_2
+  _PFX0__sync_bool_compare_and_swap_2
+  _PFX0__sync_val_compare_and_swap_2
+  _PFX0__sync_lock_test_and_set_2
+
+  _PFX0__sync_fetch_and_add_4
+  _PFX0__sync_fetch_and_sub_4
+  _PFX0__sync_fetch_and_or_4
+  _PFX0__sync_fetch_and_and_4
+  _PFX0__sync_fetch_and_xor_4
+  _PFX0__sync_fetch_and_nand_4
+  _PFX0__sync_add_and_fetch_4
+  _PFX0__sync_sub_and_fetch_4
+  _PFX0__sync_or_and_fetch_4
+  _PFX0__sync_and_and_fetch_4
+  _PFX0__sync_xor_and_fetch_4
+  _PFX0__sync_nand_and_fetch_4
+  _PFX0__sync_bool_compare_and_swap_4
+  _PFX0__sync_val_compare_and_swap_4
+  _PFX0__sync_lock_test_and_set_4
+
+  _PFX0__sync_fetch_and_add_8
+  _PFX0__sync_fetch_and_sub_8
+  _PFX0__sync_fetch_and_or_8
+  _PFX0__sync_fetch_and_and_8
+  _PFX0__sync_fetch_and_xor_8
+  _PFX0__sync_fetch_and_nand_8
+  _PFX0__sync_add_and_fetch_8
+  _PFX0__sync_sub_and_fetch_8
+  _PFX0__sync_or_and_fetch_8
+  _PFX0__sync_and_and_fetch_8
+  _PFX0__sync_xor_and_fetch_8
+  _PFX0__sync_nand_and_fetch_8
+  _PFX0__sync_bool_compare_and_swap_8
+  _PFX0__sync_val_compare_and_swap_8
+  _PFX0__sync_lock_test_and_set_8
+
+  _PFX0__sync_fetch_and_add_16
+  _PFX0__sync_fetch_and_sub_16
+  _PFX0__sync_fetch_and_or_16
+  _PFX0__sync_fetch_and_and_16
+  _PFX0__sync_fetch_and_xor_16
+  _PFX0__sync_fetch_and_nand_16
+  _PFX0__sync_add_and_fetch_16
+  _PFX0__sync_sub_and_fetch_16
+  _PFX0__sync_or_and_fetch_16
+  _PFX0__sync_and_and_fetch_16
+  _PFX0__sync_xor_and_fetch_16
+  _PFX0__sync_nand_and_fetch_16
+  _PFX0__sync_bool_compare_and_swap_16
+  _PFX0__sync_val_compare_and_swap_16
+  _PFX0__sync_lock_test_and_set_16
+
+  _PFX0__sync_synchronize
+}
+
+%inherit GCC_4.5.0 GCC_4.4.0
+GCC_4.5.0 {
+  _PFX0__unordxf2
+  _PFX0__unordtf2
+}
+
+%inherit GCC_4.6.0 GCC_4.5.0
+GCC_4.6.0 {
+  _PFX0__morestack_segments
+  _PFX0__morestack_current_segment
+  _PFX0__morestack_initial_sp
+  _PFX0__splitstack_find
+}
Index: trunk/libgcc/Makefile.in
===================================================================
--- trunk.orig/libgcc/Makefile.in
+++ trunk/libgcc/Makefile.in
@@ -250,6 +250,10 @@ gcc_s_compile = $(gcc_compile) -DSHARED
 objects = $(filter %$(objext),$^)
 
 # Collect any host-specific information from Makefile fragments.
+
+LIBGCC_VER_GNU_PREFIX = __
+LIBGCC_VER_SYMBOLS_PREFIX =
+
 tmake_file = @tmake_file@
 include $(srcdir)/empty.mk $(tmake_file)
 
@@ -795,6 +799,10 @@ libgcc_s$(SHLIB_EXT): libgcc.map
 mapfile = libgcc.map
 endif
 
+libgcc-std.ver: $(srcdir)/libgcc-std.ver.in
+	sed -e 's/__PFX1__/$(LIBGCC_VER_GNU_PREFIX)/g' \
+	    -e 's/_PFX0/$(LIBGCC_VER_SYMBOLS_PREFIX)/g' < $< > $@
+
 libgcc_s$(SHLIB_EXT): $(libgcc-s-objects) $(extra-parts)
 	# @multilib_flags@ is still needed because this may use
 	# $(GCC_FOR_TARGET) and $(LIBGCC2_CFLAGS) directly.
Index: trunk/gcc/Makefile.in
===================================================================
--- trunk.orig/gcc/Makefile.in
+++ trunk/gcc/Makefile.in
@@ -1883,7 +1883,10 @@ LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA)
 # which case they will start with $(srcdir)), or generated into the build
 # directory (in which case they will be relative paths).
 srcdirify = $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
-            $(patsubst %,$$(gcc_objdir)/%,$(filter-out $(srcdir)%,$(1)))
+            $(patsubst $$(libgcc_objdir)/%,%, \
+		$(filter $$(libgcc_objdir)%,$(1))) \
+            $(patsubst %,$$(gcc_objdir)/%, \
+		$(filter-out $(srcdir)% $$(libgcc_objdir)%,$(1)))
 
 # The distinction between these two variables is no longer relevant,
 # so we combine them.  Sort removes duplicates.
Index: trunk/libgcc/config/t-gnu-prefix
===================================================================
--- /dev/null
+++ trunk/libgcc/config/t-gnu-prefix
@@ -0,0 +1 @@
+LIBGCC_VER_GNU_PREFIX = __gnu_
Index: trunk/gcc/config/bfin/libgcc-bfin.ver
===================================================================
--- trunk.orig/gcc/config/bfin/libgcc-bfin.ver
+++ /dev/null
@@ -1,1914 +0,0 @@
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-# 2008, 2009, 2010 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-GCC_3.0 {
-  # libgcc1 integer symbols
-  ___absvsi2
-  ___addvsi3
-  ___ashlsi3
-  ___ashrsi3
-  ___divsi3
-  ___lshrsi3
-  ___modsi3
-  ___mulsi3
-  ___mulvsi3
-  ___negvsi2
-  ___subvsi3
-  ___udivsi3
-  ___umodsi3
-
-  # libgcc1 floating point symbols
-  ___addsf3
-  ___adddf3
-  ___addxf3
-  ___addtf3
-  ___divsf3
-  ___divdf3
-  ___divxf3
-  ___divtf3
-  ___eqsf2
-  ___eqdf2
-  ___eqxf2
-  ___eqtf2
-  ___extenddfxf2
-  ___extenddftf2
-  ___extendsfdf2
-  ___extendsfxf2
-  ___extendsftf2
-  ___fixsfsi
-  ___fixdfsi
-  ___fixxfsi
-  ___fixtfsi
-  ___floatsisf
-  ___floatsidf
-  ___floatsixf
-  ___floatsitf
-  ___gesf2
-  ___gedf2
-  ___gexf2
-  ___getf2
-  ___gtsf2
-  ___gtdf2
-  ___gtxf2
-  ___gttf2
-  ___lesf2
-  ___ledf2
-  ___lexf2
-  ___letf2
-  ___ltsf2
-  ___ltdf2
-  ___ltxf2
-  ___lttf2
-  ___mulsf3
-  ___muldf3
-  ___mulxf3
-  ___multf3
-  ___negsf2
-  ___negdf2
-  ___negxf2
-  ___negtf2
-  ___nesf2
-  ___nedf2
-  ___nexf2
-  ___netf2
-  ___subsf3
-  ___subdf3
-  ___subxf3
-  ___subtf3
-  ___truncdfsf2
-  ___truncxfsf2
-  ___trunctfsf2
-  ___truncxfdf2
-  ___trunctfdf2
-
-  # libgcc2 DImode arithmetic (for 32-bit targets).
-  ___absvdi2
-  ___addvdi3
-  ___ashldi3
-  ___ashrdi3
-  ___cmpdi2
-  ___divdi3
-  ___ffsdi2
-  ___fixdfdi
-  ___fixsfdi
-  ___fixtfdi
-  ___fixxfdi
-  ___fixunsdfdi
-  ___fixunsdfsi
-  ___fixunssfsi
-  ___fixunssfdi
-  ___fixunstfdi
-  ___fixunstfsi
-  ___fixunsxfdi
-  ___fixunsxfsi
-  ___floatdidf
-  ___floatdisf
-  ___floatdixf
-  ___floatditf
-  ___lshrdi3
-  ___moddi3
-  ___muldi3
-  ___mulvdi3
-  ___negdi2
-  ___negvdi2
-  ___subvdi3
-  ___ucmpdi2
-  ___udivdi3
-  ___udivmoddi4
-  ___umoddi3
-
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  ___ashlti3
-  ___ashrti3
-  ___cmpti2
-  ___divti3
-  ___ffsti2
-  ___fixdfti
-  ___fixsfti
-  ___fixtfti
-  ___fixxfti
-  ___lshrti3
-  ___modti3
-  ___multi3
-  ___negti2
-  ___ucmpti2
-  ___udivmodti4
-  ___udivti3
-  ___umodti3
-  ___fixunsdfti
-  ___fixunssfti
-  ___fixunstfti
-  ___fixunsxfti
-  ___floattidf
-  ___floattisf
-  ___floattixf
-  ___floattitf
-
-  # Used to deal with trampoline initialization on some platforms
-  ___clear_cache
-
-  # EH symbols
-  __Unwind_DeleteException
-  __Unwind_Find_FDE
-  __Unwind_ForcedUnwind
-  __Unwind_GetGR
-  __Unwind_GetIP
-  __Unwind_GetLanguageSpecificData
-  __Unwind_GetRegionStart
-  __Unwind_GetTextRelBase
-  __Unwind_GetDataRelBase
-  __Unwind_RaiseException
-  __Unwind_Resume
-  __Unwind_SetGR
-  __Unwind_SetIP
-  ___deregister_frame
-  ___deregister_frame_info
-  ___deregister_frame_info_bases
-  ___register_frame
-  ___register_frame_info
-  ___register_frame_info_bases
-  ___register_frame_info_table
-  ___register_frame_info_table_bases
-  ___register_frame_table
-
-  # SjLj EH symbols
-  __Unwind_SjLj_Register
-  __Unwind_SjLj_Unregister
-  __Unwind_SjLj_RaiseException
-  __Unwind_SjLj_ForcedUnwind
-  __Unwind_SjLj_Resume
-}
-
-%inherit GCC_3.3 GCC_3.0
-GCC_3.3 {
-  __Unwind_FindEnclosingFunction
-  __Unwind_GetCFA
-  __Unwind_Backtrace
-  __Unwind_Resume_or_Rethrow
-  __Unwind_SjLj_Resume_or_Rethrow
-}
-
-%inherit GCC_3.3.1 GCC_3.3
-GCC_3.3.1 {
-  ___gcc_personality_sj0
-  ___gcc_personality_v0
-}
-
-%inherit GCC_3.3.2 GCC_3.3.1
-GCC_3.3.2 {
-}
-%inherit GCC_3.3.4 GCC_3.3.2
-GCC_3.3.4 {
-  ___unorddf2
-  ___unordsf2
-}
-
-%inherit GCC_3.4 GCC_3.3.4
-GCC_3.4 {
-  # bit scanning and counting built-ins
-  ___clzsi2
-  ___clzdi2
-  ___clzti2
-  ___ctzsi2
-  ___ctzdi2
-  ___ctzti2
-  ___popcountsi2
-  ___popcountdi2
-  ___popcountti2
-  ___paritysi2
-  ___paritydi2
-  ___parityti2
-}
-
-%inherit GCC_3.4.2 GCC_3.4
-GCC_3.4.2 {
-  # Used to deal with trampoline initialization on some platforms
-  ___enable_execute_stack
-  ___trampoline_setup
-}
-
-%inherit GCC_3.4.4 GCC_3.4.2
-GCC_3.4.4 {
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  ___absvti2
-  ___addvti3
-  ___mulvti3
-  ___negvti2
-  ___subvti3
-}
-
-%inherit GCC_4.0.0 GCC_3.4.4
-GCC_4.0.0 {
-  # libgcc2 __builtin_powi helpers.
-  ___powisf2
-  ___powidf2
-  ___powixf2
-  ___powitf2
-
-  # c99 compliant complex arithmetic
-  ___divsc3
-  ___divdc3
-  ___divxc3
-  ___divtc3
-  ___mulsc3
-  ___muldc3
-  ___mulxc3
-  ___multc3
-}
-
-%inherit GCC_4.1.0 GCC_4.0.0
-GCC_4.1.0 {
-  ___smulsi3_highpart
-  ___umulsi3_highpart
-}
-
-%inherit GCC_4.2.0 GCC_4.1.0
-GCC_4.2.0 {
-  # unsigned-to-floating conversions
-  ___floatunsisf
-  ___floatunsidf
-  ___floatunsixf
-  ___floatunsitf
-  ___floatundidf
-  ___floatundisf
-  ___floatundixf
-  ___floatunditf
-  ___floatuntidf
-  ___floatuntisf
-  ___floatuntixf
-  ___floatuntitf
-  __Unwind_GetIPInfo
-}
-
-%inherit GCC_4.3.0 GCC_4.2.0
-GCC_4.3.0 {
-  # byte swapping routines
-  ___bswapsi2
-  ___bswapdi2
-  ___emutls_get_address
-  ___emutls_register_common
-  ___ffssi2
-  ___extendxftf2
-  ___trunctfxf2
-
-  # fixed-point routines
-  ___addqq3
-  ___addhq3
-  ___addsq3
-  ___adddq3
-  ___addtq3
-  ___adduqq3
-  ___adduhq3
-  ___addusq3
-  ___addudq3
-  ___addutq3
-  ___addha3
-  ___addsa3
-  ___addda3
-  ___addta3
-  ___adduha3
-  ___addusa3
-  ___adduda3
-  ___adduta3
-  ___ssaddqq3
-  ___ssaddhq3
-  ___ssaddsq3
-  ___ssadddq3
-  ___ssaddtq3
-  ___ssaddha3
-  ___ssaddsa3
-  ___ssaddda3
-  ___ssaddta3
-  ___usadduqq3
-  ___usadduhq3
-  ___usaddusq3
-  ___usaddudq3
-  ___usaddutq3
-  ___usadduha3
-  ___usaddusa3
-  ___usadduda3
-  ___usadduta3
-  ___subqq3
-  ___subhq3
-  ___subsq3
-  ___subdq3
-  ___subtq3
-  ___subuqq3
-  ___subuhq3
-  ___subusq3
-  ___subudq3
-  ___subutq3
-  ___subha3
-  ___subsa3
-  ___subda3
-  ___subta3
-  ___subuha3
-  ___subusa3
-  ___subuda3
-  ___subuta3
-  ___sssubqq3
-  ___sssubhq3
-  ___sssubsq3
-  ___sssubdq3
-  ___sssubtq3
-  ___sssubha3
-  ___sssubsa3
-  ___sssubda3
-  ___sssubta3
-  ___ussubuqq3
-  ___ussubuhq3
-  ___ussubusq3
-  ___ussubudq3
-  ___ussubutq3
-  ___ussubuha3
-  ___ussubusa3
-  ___ussubuda3
-  ___ussubuta3
-  ___mulqq3
-  ___mulhq3
-  ___mulsq3
-  ___muldq3
-  ___multq3
-  ___muluqq3
-  ___muluhq3
-  ___mulusq3
-  ___muludq3
-  ___mulutq3
-  ___mulha3
-  ___mulsa3
-  ___mulda3
-  ___multa3
-  ___muluha3
-  ___mulusa3
-  ___muluda3
-  ___muluta3
-  ___ssmulqq3
-  ___ssmulhq3
-  ___ssmulsq3
-  ___ssmuldq3
-  ___ssmultq3
-  ___ssmulha3
-  ___ssmulsa3
-  ___ssmulda3
-  ___ssmulta3
-  ___usmuluqq3
-  ___usmuluhq3
-  ___usmulusq3
-  ___usmuludq3
-  ___usmulutq3
-  ___usmuluha3
-  ___usmulusa3
-  ___usmuluda3
-  ___usmuluta3
-  ___divqq3
-  ___divhq3
-  ___divsq3
-  ___divdq3
-  ___divtq3
-  ___divha3
-  ___divsa3
-  ___divda3
-  ___divta3
-  ___udivuqq3
-  ___udivuhq3
-  ___udivusq3
-  ___udivudq3
-  ___udivutq3
-  ___udivuha3
-  ___udivusa3
-  ___udivuda3
-  ___udivuta3
-  ___ssdivqq3
-  ___ssdivhq3
-  ___ssdivsq3
-  ___ssdivdq3
-  ___ssdivtq3
-  ___ssdivha3
-  ___ssdivsa3
-  ___ssdivda3
-  ___ssdivta3
-  ___usdivuqq3
-  ___usdivuhq3
-  ___usdivusq3
-  ___usdivudq3
-  ___usdivutq3
-  ___usdivuha3
-  ___usdivusa3
-  ___usdivuda3
-  ___usdivuta3
-  ___negqq2
-  ___neghq2
-  ___negsq2
-  ___negdq2
-  ___negtq2
-  ___neguqq2
-  ___neguhq2
-  ___negusq2
-  ___negudq2
-  ___negutq2
-  ___negha2
-  ___negsa2
-  ___negda2
-  ___negta2
-  ___neguha2
-  ___negusa2
-  ___neguda2
-  ___neguta2
-  ___ssnegqq2
-  ___ssneghq2
-  ___ssnegsq2
-  ___ssnegdq2
-  ___ssnegtq2
-  ___ssnegha2
-  ___ssnegsa2
-  ___ssnegda2
-  ___ssnegta2
-  ___usneguqq2
-  ___usneguhq2
-  ___usnegusq2
-  ___usnegudq2
-  ___usnegutq2
-  ___usneguha2
-  ___usnegusa2
-  ___usneguda2
-  ___usneguta2
-  ___ashlqq3
-  ___ashlhq3
-  ___ashlsq3
-  ___ashldq3
-  ___ashltq3
-  ___ashluqq3
-  ___ashluhq3
-  ___ashlusq3
-  ___ashludq3
-  ___ashlutq3
-  ___ashlha3
-  ___ashlsa3
-  ___ashlda3
-  ___ashlta3
-  ___ashluha3
-  ___ashlusa3
-  ___ashluda3
-  ___ashluta3
-  ___ashrqq3
-  ___ashrhq3
-  ___ashrsq3
-  ___ashrdq3
-  ___ashrtq3
-  ___ashrha3
-  ___ashrsa3
-  ___ashrda3
-  ___ashrta3
-  ___lshruqq3
-  ___lshruhq3
-  ___lshrusq3
-  ___lshrudq3
-  ___lshrutq3
-  ___lshruha3
-  ___lshrusa3
-  ___lshruda3
-  ___lshruta3
-  ___ssashlqq3
-  ___ssashlhq3
-  ___ssashlsq3
-  ___ssashldq3
-  ___ssashltq3
-  ___ssashlha3
-  ___ssashlsa3
-  ___ssashlda3
-  ___ssashlta3
-  ___usashluqq3
-  ___usashluhq3
-  ___usashlusq3
-  ___usashludq3
-  ___usashlutq3
-  ___usashluha3
-  ___usashlusa3
-  ___usashluda3
-  ___usashluta3
-  ___cmpqq2
-  ___cmphq2
-  ___cmpsq2
-  ___cmpdq2
-  ___cmptq2
-  ___cmpuqq2
-  ___cmpuhq2
-  ___cmpusq2
-  ___cmpudq2
-  ___cmputq2
-  ___cmpha2
-  ___cmpsa2
-  ___cmpda2
-  ___cmpta2
-  ___cmpuha2
-  ___cmpusa2
-  ___cmpuda2
-  ___cmputa2
-  ___fractqqhq2
-  ___fractqqsq2
-  ___fractqqdq2
-  ___fractqqtq2
-  ___fractqqha
-  ___fractqqsa
-  ___fractqqda
-  ___fractqqta
-  ___fractqquqq
-  ___fractqquhq
-  ___fractqqusq
-  ___fractqqudq
-  ___fractqqutq
-  ___fractqquha
-  ___fractqqusa
-  ___fractqquda
-  ___fractqquta
-  ___fractqqqi
-  ___fractqqhi
-  ___fractqqsi
-  ___fractqqdi
-  ___fractqqti
-  ___fractqqsf
-  ___fractqqdf
-  ___fracthqqq2
-  ___fracthqsq2
-  ___fracthqdq2
-  ___fracthqtq2
-  ___fracthqha
-  ___fracthqsa
-  ___fracthqda
-  ___fracthqta
-  ___fracthquqq
-  ___fracthquhq
-  ___fracthqusq
-  ___fracthqudq
-  ___fracthqutq
-  ___fracthquha
-  ___fracthqusa
-  ___fracthquda
-  ___fracthquta
-  ___fracthqqi
-  ___fracthqhi
-  ___fracthqsi
-  ___fracthqdi
-  ___fracthqti
-  ___fracthqsf
-  ___fracthqdf
-  ___fractsqqq2
-  ___fractsqhq2
-  ___fractsqdq2
-  ___fractsqtq2
-  ___fractsqha
-  ___fractsqsa
-  ___fractsqda
-  ___fractsqta
-  ___fractsquqq
-  ___fractsquhq
-  ___fractsqusq
-  ___fractsqudq
-  ___fractsqutq
-  ___fractsquha
-  ___fractsqusa
-  ___fractsquda
-  ___fractsquta
-  ___fractsqqi
-  ___fractsqhi
-  ___fractsqsi
-  ___fractsqdi
-  ___fractsqti
-  ___fractsqsf
-  ___fractsqdf
-  ___fractdqqq2
-  ___fractdqhq2
-  ___fractdqsq2
-  ___fractdqtq2
-  ___fractdqha
-  ___fractdqsa
-  ___fractdqda
-  ___fractdqta
-  ___fractdquqq
-  ___fractdquhq
-  ___fractdqusq
-  ___fractdqudq
-  ___fractdqutq
-  ___fractdquha
-  ___fractdqusa
-  ___fractdquda
-  ___fractdquta
-  ___fractdqqi
-  ___fractdqhi
-  ___fractdqsi
-  ___fractdqdi
-  ___fractdqti
-  ___fractdqsf
-  ___fractdqdf
-  ___fracttqqq2
-  ___fracttqhq2
-  ___fracttqsq2
-  ___fracttqdq2
-  ___fracttqha
-  ___fracttqsa
-  ___fracttqda
-  ___fracttqta
-  ___fracttquqq
-  ___fracttquhq
-  ___fracttqusq
-  ___fracttqudq
-  ___fracttqutq
-  ___fracttquha
-  ___fracttqusa
-  ___fracttquda
-  ___fracttquta
-  ___fracttqqi
-  ___fracttqhi
-  ___fracttqsi
-  ___fracttqdi
-  ___fracttqti
-  ___fracttqsf
-  ___fracttqdf
-  ___fracthaqq
-  ___fracthahq
-  ___fracthasq
-  ___fracthadq
-  ___fracthatq
-  ___fracthasa2
-  ___fracthada2
-  ___fracthata2
-  ___fracthauqq
-  ___fracthauhq
-  ___fracthausq
-  ___fracthaudq
-  ___fracthautq
-  ___fracthauha
-  ___fracthausa
-  ___fracthauda
-  ___fracthauta
-  ___fracthaqi
-  ___fracthahi
-  ___fracthasi
-  ___fracthadi
-  ___fracthati
-  ___fracthasf
-  ___fracthadf
-  ___fractsaqq
-  ___fractsahq
-  ___fractsasq
-  ___fractsadq
-  ___fractsatq
-  ___fractsaha2
-  ___fractsada2
-  ___fractsata2
-  ___fractsauqq
-  ___fractsauhq
-  ___fractsausq
-  ___fractsaudq
-  ___fractsautq
-  ___fractsauha
-  ___fractsausa
-  ___fractsauda
-  ___fractsauta
-  ___fractsaqi
-  ___fractsahi
-  ___fractsasi
-  ___fractsadi
-  ___fractsati
-  ___fractsasf
-  ___fractsadf
-  ___fractdaqq
-  ___fractdahq
-  ___fractdasq
-  ___fractdadq
-  ___fractdatq
-  ___fractdaha2
-  ___fractdasa2
-  ___fractdata2
-  ___fractdauqq
-  ___fractdauhq
-  ___fractdausq
-  ___fractdaudq
-  ___fractdautq
-  ___fractdauha
-  ___fractdausa
-  ___fractdauda
-  ___fractdauta
-  ___fractdaqi
-  ___fractdahi
-  ___fractdasi
-  ___fractdadi
-  ___fractdati
-  ___fractdasf
-  ___fractdadf
-  ___fracttaqq
-  ___fracttahq
-  ___fracttasq
-  ___fracttadq
-  ___fracttatq
-  ___fracttaha2
-  ___fracttasa2
-  ___fracttada2
-  ___fracttauqq
-  ___fracttauhq
-  ___fracttausq
-  ___fracttaudq
-  ___fracttautq
-  ___fracttauha
-  ___fracttausa
-  ___fracttauda
-  ___fracttauta
-  ___fracttaqi
-  ___fracttahi
-  ___fracttasi
-  ___fracttadi
-  ___fracttati
-  ___fracttasf
-  ___fracttadf
-  ___fractuqqqq
-  ___fractuqqhq
-  ___fractuqqsq
-  ___fractuqqdq
-  ___fractuqqtq
-  ___fractuqqha
-  ___fractuqqsa
-  ___fractuqqda
-  ___fractuqqta
-  ___fractuqquhq2
-  ___fractuqqusq2
-  ___fractuqqudq2
-  ___fractuqqutq2
-  ___fractuqquha
-  ___fractuqqusa
-  ___fractuqquda
-  ___fractuqquta
-  ___fractuqqqi
-  ___fractuqqhi
-  ___fractuqqsi
-  ___fractuqqdi
-  ___fractuqqti
-  ___fractuqqsf
-  ___fractuqqdf
-  ___fractuhqqq
-  ___fractuhqhq
-  ___fractuhqsq
-  ___fractuhqdq
-  ___fractuhqtq
-  ___fractuhqha
-  ___fractuhqsa
-  ___fractuhqda
-  ___fractuhqta
-  ___fractuhquqq2
-  ___fractuhqusq2
-  ___fractuhqudq2
-  ___fractuhqutq2
-  ___fractuhquha
-  ___fractuhqusa
-  ___fractuhquda
-  ___fractuhquta
-  ___fractuhqqi
-  ___fractuhqhi
-  ___fractuhqsi
-  ___fractuhqdi
-  ___fractuhqti
-  ___fractuhqsf
-  ___fractuhqdf
-  ___fractusqqq
-  ___fractusqhq
-  ___fractusqsq
-  ___fractusqdq
-  ___fractusqtq
-  ___fractusqha
-  ___fractusqsa
-  ___fractusqda
-  ___fractusqta
-  ___fractusquqq2
-  ___fractusquhq2
-  ___fractusqudq2
-  ___fractusqutq2
-  ___fractusquha
-  ___fractusqusa
-  ___fractusquda
-  ___fractusquta
-  ___fractusqqi
-  ___fractusqhi
-  ___fractusqsi
-  ___fractusqdi
-  ___fractusqti
-  ___fractusqsf
-  ___fractusqdf
-  ___fractudqqq
-  ___fractudqhq
-  ___fractudqsq
-  ___fractudqdq
-  ___fractudqtq
-  ___fractudqha
-  ___fractudqsa
-  ___fractudqda
-  ___fractudqta
-  ___fractudquqq2
-  ___fractudquhq2
-  ___fractudqusq2
-  ___fractudqutq2
-  ___fractudquha
-  ___fractudqusa
-  ___fractudquda
-  ___fractudquta
-  ___fractudqqi
-  ___fractudqhi
-  ___fractudqsi
-  ___fractudqdi
-  ___fractudqti
-  ___fractudqsf
-  ___fractudqdf
-  ___fractutqqq
-  ___fractutqhq
-  ___fractutqsq
-  ___fractutqdq
-  ___fractutqtq
-  ___fractutqha
-  ___fractutqsa
-  ___fractutqda
-  ___fractutqta
-  ___fractutquqq2
-  ___fractutquhq2
-  ___fractutqusq2
-  ___fractutqudq2
-  ___fractutquha
-  ___fractutqusa
-  ___fractutquda
-  ___fractutquta
-  ___fractutqqi
-  ___fractutqhi
-  ___fractutqsi
-  ___fractutqdi
-  ___fractutqti
-  ___fractutqsf
-  ___fractutqdf
-  ___fractuhaqq
-  ___fractuhahq
-  ___fractuhasq
-  ___fractuhadq
-  ___fractuhatq
-  ___fractuhaha
-  ___fractuhasa
-  ___fractuhada
-  ___fractuhata
-  ___fractuhauqq
-  ___fractuhauhq
-  ___fractuhausq
-  ___fractuhaudq
-  ___fractuhautq
-  ___fractuhausa2
-  ___fractuhauda2
-  ___fractuhauta2
-  ___fractuhaqi
-  ___fractuhahi
-  ___fractuhasi
-  ___fractuhadi
-  ___fractuhati
-  ___fractuhasf
-  ___fractuhadf
-  ___fractusaqq
-  ___fractusahq
-  ___fractusasq
-  ___fractusadq
-  ___fractusatq
-  ___fractusaha
-  ___fractusasa
-  ___fractusada
-  ___fractusata
-  ___fractusauqq
-  ___fractusauhq
-  ___fractusausq
-  ___fractusaudq
-  ___fractusautq
-  ___fractusauha2
-  ___fractusauda2
-  ___fractusauta2
-  ___fractusaqi
-  ___fractusahi
-  ___fractusasi
-  ___fractusadi
-  ___fractusati
-  ___fractusasf
-  ___fractusadf
-  ___fractudaqq
-  ___fractudahq
-  ___fractudasq
-  ___fractudadq
-  ___fractudatq
-  ___fractudaha
-  ___fractudasa
-  ___fractudada
-  ___fractudata
-  ___fractudauqq
-  ___fractudauhq
-  ___fractudausq
-  ___fractudaudq
-  ___fractudautq
-  ___fractudauha2
-  ___fractudausa2
-  ___fractudauta2
-  ___fractudaqi
-  ___fractudahi
-  ___fractudasi
-  ___fractudadi
-  ___fractudati
-  ___fractudasf
-  ___fractudadf
-  ___fractutaqq
-  ___fractutahq
-  ___fractutasq
-  ___fractutadq
-  ___fractutatq
-  ___fractutaha
-  ___fractutasa
-  ___fractutada
-  ___fractutata
-  ___fractutauqq
-  ___fractutauhq
-  ___fractutausq
-  ___fractutaudq
-  ___fractutautq
-  ___fractutauha2
-  ___fractutausa2
-  ___fractutauda2
-  ___fractutaqi
-  ___fractutahi
-  ___fractutasi
-  ___fractutadi
-  ___fractutati
-  ___fractutasf
-  ___fractutadf
-  ___fractqiqq
-  ___fractqihq
-  ___fractqisq
-  ___fractqidq
-  ___fractqitq
-  ___fractqiha
-  ___fractqisa
-  ___fractqida
-  ___fractqita
-  ___fractqiuqq
-  ___fractqiuhq
-  ___fractqiusq
-  ___fractqiudq
-  ___fractqiutq
-  ___fractqiuha
-  ___fractqiusa
-  ___fractqiuda
-  ___fractqiuta
-  ___fracthiqq
-  ___fracthihq
-  ___fracthisq
-  ___fracthidq
-  ___fracthitq
-  ___fracthiha
-  ___fracthisa
-  ___fracthida
-  ___fracthita
-  ___fracthiuqq
-  ___fracthiuhq
-  ___fracthiusq
-  ___fracthiudq
-  ___fracthiutq
-  ___fracthiuha
-  ___fracthiusa
-  ___fracthiuda
-  ___fracthiuta
-  ___fractsiqq
-  ___fractsihq
-  ___fractsisq
-  ___fractsidq
-  ___fractsitq
-  ___fractsiha
-  ___fractsisa
-  ___fractsida
-  ___fractsita
-  ___fractsiuqq
-  ___fractsiuhq
-  ___fractsiusq
-  ___fractsiudq
-  ___fractsiutq
-  ___fractsiuha
-  ___fractsiusa
-  ___fractsiuda
-  ___fractsiuta
-  ___fractdiqq
-  ___fractdihq
-  ___fractdisq
-  ___fractdidq
-  ___fractditq
-  ___fractdiha
-  ___fractdisa
-  ___fractdida
-  ___fractdita
-  ___fractdiuqq
-  ___fractdiuhq
-  ___fractdiusq
-  ___fractdiudq
-  ___fractdiutq
-  ___fractdiuha
-  ___fractdiusa
-  ___fractdiuda
-  ___fractdiuta
-  ___fracttiqq
-  ___fracttihq
-  ___fracttisq
-  ___fracttidq
-  ___fracttitq
-  ___fracttiha
-  ___fracttisa
-  ___fracttida
-  ___fracttita
-  ___fracttiuqq
-  ___fracttiuhq
-  ___fracttiusq
-  ___fracttiudq
-  ___fracttiutq
-  ___fracttiuha
-  ___fracttiusa
-  ___fracttiuda
-  ___fracttiuta
-  ___fractsfqq
-  ___fractsfhq
-  ___fractsfsq
-  ___fractsfdq
-  ___fractsftq
-  ___fractsfha
-  ___fractsfsa
-  ___fractsfda
-  ___fractsfta
-  ___fractsfuqq
-  ___fractsfuhq
-  ___fractsfusq
-  ___fractsfudq
-  ___fractsfutq
-  ___fractsfuha
-  ___fractsfusa
-  ___fractsfuda
-  ___fractsfuta
-  ___fractdfqq
-  ___fractdfhq
-  ___fractdfsq
-  ___fractdfdq
-  ___fractdftq
-  ___fractdfha
-  ___fractdfsa
-  ___fractdfda
-  ___fractdfta
-  ___fractdfuqq
-  ___fractdfuhq
-  ___fractdfusq
-  ___fractdfudq
-  ___fractdfutq
-  ___fractdfuha
-  ___fractdfusa
-  ___fractdfuda
-  ___fractdfuta
-  ___satfractqqhq2
-  ___satfractqqsq2
-  ___satfractqqdq2
-  ___satfractqqtq2
-  ___satfractqqha
-  ___satfractqqsa
-  ___satfractqqda
-  ___satfractqqta
-  ___satfractqquqq
-  ___satfractqquhq
-  ___satfractqqusq
-  ___satfractqqudq
-  ___satfractqqutq
-  ___satfractqquha
-  ___satfractqqusa
-  ___satfractqquda
-  ___satfractqquta
-  ___satfracthqqq2
-  ___satfracthqsq2
-  ___satfracthqdq2
-  ___satfracthqtq2
-  ___satfracthqha
-  ___satfracthqsa
-  ___satfracthqda
-  ___satfracthqta
-  ___satfracthquqq
-  ___satfracthquhq
-  ___satfracthqusq
-  ___satfracthqudq
-  ___satfracthqutq
-  ___satfracthquha
-  ___satfracthqusa
-  ___satfracthquda
-  ___satfracthquta
-  ___satfractsqqq2
-  ___satfractsqhq2
-  ___satfractsqdq2
-  ___satfractsqtq2
-  ___satfractsqha
-  ___satfractsqsa
-  ___satfractsqda
-  ___satfractsqta
-  ___satfractsquqq
-  ___satfractsquhq
-  ___satfractsqusq
-  ___satfractsqudq
-  ___satfractsqutq
-  ___satfractsquha
-  ___satfractsqusa
-  ___satfractsquda
-  ___satfractsquta
-  ___satfractdqqq2
-  ___satfractdqhq2
-  ___satfractdqsq2
-  ___satfractdqtq2
-  ___satfractdqha
-  ___satfractdqsa
-  ___satfractdqda
-  ___satfractdqta
-  ___satfractdquqq
-  ___satfractdquhq
-  ___satfractdqusq
-  ___satfractdqudq
-  ___satfractdqutq
-  ___satfractdquha
-  ___satfractdqusa
-  ___satfractdquda
-  ___satfractdquta
-  ___satfracttqqq2
-  ___satfracttqhq2
-  ___satfracttqsq2
-  ___satfracttqdq2
-  ___satfracttqha
-  ___satfracttqsa
-  ___satfracttqda
-  ___satfracttqta
-  ___satfracttquqq
-  ___satfracttquhq
-  ___satfracttqusq
-  ___satfracttqudq
-  ___satfracttqutq
-  ___satfracttquha
-  ___satfracttqusa
-  ___satfracttquda
-  ___satfracttquta
-  ___satfracthaqq
-  ___satfracthahq
-  ___satfracthasq
-  ___satfracthadq
-  ___satfracthatq
-  ___satfracthasa2
-  ___satfracthada2
-  ___satfracthata2
-  ___satfracthauqq
-  ___satfracthauhq
-  ___satfracthausq
-  ___satfracthaudq
-  ___satfracthautq
-  ___satfracthauha
-  ___satfracthausa
-  ___satfracthauda
-  ___satfracthauta
-  ___satfractsaqq
-  ___satfractsahq
-  ___satfractsasq
-  ___satfractsadq
-  ___satfractsatq
-  ___satfractsaha2
-  ___satfractsada2
-  ___satfractsata2
-  ___satfractsauqq
-  ___satfractsauhq
-  ___satfractsausq
-  ___satfractsaudq
-  ___satfractsautq
-  ___satfractsauha
-  ___satfractsausa
-  ___satfractsauda
-  ___satfractsauta
-  ___satfractdaqq
-  ___satfractdahq
-  ___satfractdasq
-  ___satfractdadq
-  ___satfractdatq
-  ___satfractdaha2
-  ___satfractdasa2
-  ___satfractdata2
-  ___satfractdauqq
-  ___satfractdauhq
-  ___satfractdausq
-  ___satfractdaudq
-  ___satfractdautq
-  ___satfractdauha
-  ___satfractdausa
-  ___satfractdauda
-  ___satfractdauta
-  ___satfracttaqq
-  ___satfracttahq
-  ___satfracttasq
-  ___satfracttadq
-  ___satfracttatq
-  ___satfracttaha2
-  ___satfracttasa2
-  ___satfracttada2
-  ___satfracttauqq
-  ___satfracttauhq
-  ___satfracttausq
-  ___satfracttaudq
-  ___satfracttautq
-  ___satfracttauha
-  ___satfracttausa
-  ___satfracttauda
-  ___satfracttauta
-  ___satfractuqqqq
-  ___satfractuqqhq
-  ___satfractuqqsq
-  ___satfractuqqdq
-  ___satfractuqqtq
-  ___satfractuqqha
-  ___satfractuqqsa
-  ___satfractuqqda
-  ___satfractuqqta
-  ___satfractuqquhq2
-  ___satfractuqqusq2
-  ___satfractuqqudq2
-  ___satfractuqqutq2
-  ___satfractuqquha
-  ___satfractuqqusa
-  ___satfractuqquda
-  ___satfractuqquta
-  ___satfractuhqqq
-  ___satfractuhqhq
-  ___satfractuhqsq
-  ___satfractuhqdq
-  ___satfractuhqtq
-  ___satfractuhqha
-  ___satfractuhqsa
-  ___satfractuhqda
-  ___satfractuhqta
-  ___satfractuhquqq2
-  ___satfractuhqusq2
-  ___satfractuhqudq2
-  ___satfractuhqutq2
-  ___satfractuhquha
-  ___satfractuhqusa
-  ___satfractuhquda
-  ___satfractuhquta
-  ___satfractusqqq
-  ___satfractusqhq
-  ___satfractusqsq
-  ___satfractusqdq
-  ___satfractusqtq
-  ___satfractusqha
-  ___satfractusqsa
-  ___satfractusqda
-  ___satfractusqta
-  ___satfractusquqq2
-  ___satfractusquhq2
-  ___satfractusqudq2
-  ___satfractusqutq2
-  ___satfractusquha
-  ___satfractusqusa
-  ___satfractusquda
-  ___satfractusquta
-  ___satfractudqqq
-  ___satfractudqhq
-  ___satfractudqsq
-  ___satfractudqdq
-  ___satfractudqtq
-  ___satfractudqha
-  ___satfractudqsa
-  ___satfractudqda
-  ___satfractudqta
-  ___satfractudquqq2
-  ___satfractudquhq2
-  ___satfractudqusq2
-  ___satfractudqutq2
-  ___satfractudquha
-  ___satfractudqusa
-  ___satfractudquda
-  ___satfractudquta
-  ___satfractutqqq
-  ___satfractutqhq
-  ___satfractutqsq
-  ___satfractutqdq
-  ___satfractutqtq
-  ___satfractutqha
-  ___satfractutqsa
-  ___satfractutqda
-  ___satfractutqta
-  ___satfractutquqq2
-  ___satfractutquhq2
-  ___satfractutqusq2
-  ___satfractutqudq2
-  ___satfractutquha
-  ___satfractutqusa
-  ___satfractutquda
-  ___satfractutquta
-  ___satfractuhaqq
-  ___satfractuhahq
-  ___satfractuhasq
-  ___satfractuhadq
-  ___satfractuhatq
-  ___satfractuhaha
-  ___satfractuhasa
-  ___satfractuhada
-  ___satfractuhata
-  ___satfractuhauqq
-  ___satfractuhauhq
-  ___satfractuhausq
-  ___satfractuhaudq
-  ___satfractuhautq
-  ___satfractuhausa2
-  ___satfractuhauda2
-  ___satfractuhauta2
-  ___satfractusaqq
-  ___satfractusahq
-  ___satfractusasq
-  ___satfractusadq
-  ___satfractusatq
-  ___satfractusaha
-  ___satfractusasa
-  ___satfractusada
-  ___satfractusata
-  ___satfractusauqq
-  ___satfractusauhq
-  ___satfractusausq
-  ___satfractusaudq
-  ___satfractusautq
-  ___satfractusauha2
-  ___satfractusauda2
-  ___satfractusauta2
-  ___satfractudaqq
-  ___satfractudahq
-  ___satfractudasq
-  ___satfractudadq
-  ___satfractudatq
-  ___satfractudaha
-  ___satfractudasa
-  ___satfractudada
-  ___satfractudata
-  ___satfractudauqq
-  ___satfractudauhq
-  ___satfractudausq
-  ___satfractudaudq
-  ___satfractudautq
-  ___satfractudauha2
-  ___satfractudausa2
-  ___satfractudauta2
-  ___satfractutaqq
-  ___satfractutahq
-  ___satfractutasq
-  ___satfractutadq
-  ___satfractutatq
-  ___satfractutaha
-  ___satfractutasa
-  ___satfractutada
-  ___satfractutata
-  ___satfractutauqq
-  ___satfractutauhq
-  ___satfractutausq
-  ___satfractutaudq
-  ___satfractutautq
-  ___satfractutauha2
-  ___satfractutausa2
-  ___satfractutauda2
-  ___satfractqiqq
-  ___satfractqihq
-  ___satfractqisq
-  ___satfractqidq
-  ___satfractqitq
-  ___satfractqiha
-  ___satfractqisa
-  ___satfractqida
-  ___satfractqita
-  ___satfractqiuqq
-  ___satfractqiuhq
-  ___satfractqiusq
-  ___satfractqiudq
-  ___satfractqiutq
-  ___satfractqiuha
-  ___satfractqiusa
-  ___satfractqiuda
-  ___satfractqiuta
-  ___satfracthiqq
-  ___satfracthihq
-  ___satfracthisq
-  ___satfracthidq
-  ___satfracthitq
-  ___satfracthiha
-  ___satfracthisa
-  ___satfracthida
-  ___satfracthita
-  ___satfracthiuqq
-  ___satfracthiuhq
-  ___satfracthiusq
-  ___satfracthiudq
-  ___satfracthiutq
-  ___satfracthiuha
-  ___satfracthiusa
-  ___satfracthiuda
-  ___satfracthiuta
-  ___satfractsiqq
-  ___satfractsihq
-  ___satfractsisq
-  ___satfractsidq
-  ___satfractsitq
-  ___satfractsiha
-  ___satfractsisa
-  ___satfractsida
-  ___satfractsita
-  ___satfractsiuqq
-  ___satfractsiuhq
-  ___satfractsiusq
-  ___satfractsiudq
-  ___satfractsiutq
-  ___satfractsiuha
-  ___satfractsiusa
-  ___satfractsiuda
-  ___satfractsiuta
-  ___satfractdiqq
-  ___satfractdihq
-  ___satfractdisq
-  ___satfractdidq
-  ___satfractditq
-  ___satfractdiha
-  ___satfractdisa
-  ___satfractdida
-  ___satfractdita
-  ___satfractdiuqq
-  ___satfractdiuhq
-  ___satfractdiusq
-  ___satfractdiudq
-  ___satfractdiutq
-  ___satfractdiuha
-  ___satfractdiusa
-  ___satfractdiuda
-  ___satfractdiuta
-  ___satfracttiqq
-  ___satfracttihq
-  ___satfracttisq
-  ___satfracttidq
-  ___satfracttitq
-  ___satfracttiha
-  ___satfracttisa
-  ___satfracttida
-  ___satfracttita
-  ___satfracttiuqq
-  ___satfracttiuhq
-  ___satfracttiusq
-  ___satfracttiudq
-  ___satfracttiutq
-  ___satfracttiuha
-  ___satfracttiusa
-  ___satfracttiuda
-  ___satfracttiuta
-  ___satfractsfqq
-  ___satfractsfhq
-  ___satfractsfsq
-  ___satfractsfdq
-  ___satfractsftq
-  ___satfractsfha
-  ___satfractsfsa
-  ___satfractsfda
-  ___satfractsfta
-  ___satfractsfuqq
-  ___satfractsfuhq
-  ___satfractsfusq
-  ___satfractsfudq
-  ___satfractsfutq
-  ___satfractsfuha
-  ___satfractsfusa
-  ___satfractsfuda
-  ___satfractsfuta
-  ___satfractdfqq
-  ___satfractdfhq
-  ___satfractdfsq
-  ___satfractdfdq
-  ___satfractdftq
-  ___satfractdfha
-  ___satfractdfsa
-  ___satfractdfda
-  ___satfractdfta
-  ___satfractdfuqq
-  ___satfractdfuhq
-  ___satfractdfusq
-  ___satfractdfudq
-  ___satfractdfutq
-  ___satfractdfuha
-  ___satfractdfusa
-  ___satfractdfuda
-  ___satfractdfuta
-  ___fractunsqqqi
-  ___fractunsqqhi
-  ___fractunsqqsi
-  ___fractunsqqdi
-  ___fractunsqqti
-  ___fractunshqqi
-  ___fractunshqhi
-  ___fractunshqsi
-  ___fractunshqdi
-  ___fractunshqti
-  ___fractunssqqi
-  ___fractunssqhi
-  ___fractunssqsi
-  ___fractunssqdi
-  ___fractunssqti
-  ___fractunsdqqi
-  ___fractunsdqhi
-  ___fractunsdqsi
-  ___fractunsdqdi
-  ___fractunsdqti
-  ___fractunstqqi
-  ___fractunstqhi
-  ___fractunstqsi
-  ___fractunstqdi
-  ___fractunstqti
-  ___fractunshaqi
-  ___fractunshahi
-  ___fractunshasi
-  ___fractunshadi
-  ___fractunshati
-  ___fractunssaqi
-  ___fractunssahi
-  ___fractunssasi
-  ___fractunssadi
-  ___fractunssati
-  ___fractunsdaqi
-  ___fractunsdahi
-  ___fractunsdasi
-  ___fractunsdadi
-  ___fractunsdati
-  ___fractunstaqi
-  ___fractunstahi
-  ___fractunstasi
-  ___fractunstadi
-  ___fractunstati
-  ___fractunsuqqqi
-  ___fractunsuqqhi
-  ___fractunsuqqsi
-  ___fractunsuqqdi
-  ___fractunsuqqti
-  ___fractunsuhqqi
-  ___fractunsuhqhi
-  ___fractunsuhqsi
-  ___fractunsuhqdi
-  ___fractunsuhqti
-  ___fractunsusqqi
-  ___fractunsusqhi
-  ___fractunsusqsi
-  ___fractunsusqdi
-  ___fractunsusqti
-  ___fractunsudqqi
-  ___fractunsudqhi
-  ___fractunsudqsi
-  ___fractunsudqdi
-  ___fractunsudqti
-  ___fractunsutqqi
-  ___fractunsutqhi
-  ___fractunsutqsi
-  ___fractunsutqdi
-  ___fractunsutqti
-  ___fractunsuhaqi
-  ___fractunsuhahi
-  ___fractunsuhasi
-  ___fractunsuhadi
-  ___fractunsuhati
-  ___fractunsusaqi
-  ___fractunsusahi
-  ___fractunsusasi
-  ___fractunsusadi
-  ___fractunsusati
-  ___fractunsudaqi
-  ___fractunsudahi
-  ___fractunsudasi
-  ___fractunsudadi
-  ___fractunsudati
-  ___fractunsutaqi
-  ___fractunsutahi
-  ___fractunsutasi
-  ___fractunsutadi
-  ___fractunsutati
-  ___fractunsqiqq
-  ___fractunsqihq
-  ___fractunsqisq
-  ___fractunsqidq
-  ___fractunsqitq
-  ___fractunsqiha
-  ___fractunsqisa
-  ___fractunsqida
-  ___fractunsqita
-  ___fractunsqiuqq
-  ___fractunsqiuhq
-  ___fractunsqiusq
-  ___fractunsqiudq
-  ___fractunsqiutq
-  ___fractunsqiuha
-  ___fractunsqiusa
-  ___fractunsqiuda
-  ___fractunsqiuta
-  ___fractunshiqq
-  ___fractunshihq
-  ___fractunshisq
-  ___fractunshidq
-  ___fractunshitq
-  ___fractunshiha
-  ___fractunshisa
-  ___fractunshida
-  ___fractunshita
-  ___fractunshiuqq
-  ___fractunshiuhq
-  ___fractunshiusq
-  ___fractunshiudq
-  ___fractunshiutq
-  ___fractunshiuha
-  ___fractunshiusa
-  ___fractunshiuda
-  ___fractunshiuta
-  ___fractunssiqq
-  ___fractunssihq
-  ___fractunssisq
-  ___fractunssidq
-  ___fractunssitq
-  ___fractunssiha
-  ___fractunssisa
-  ___fractunssida
-  ___fractunssita
-  ___fractunssiuqq
-  ___fractunssiuhq
-  ___fractunssiusq
-  ___fractunssiudq
-  ___fractunssiutq
-  ___fractunssiuha
-  ___fractunssiusa
-  ___fractunssiuda
-  ___fractunssiuta
-  ___fractunsdiqq
-  ___fractunsdihq
-  ___fractunsdisq
-  ___fractunsdidq
-  ___fractunsditq
-  ___fractunsdiha
-  ___fractunsdisa
-  ___fractunsdida
-  ___fractunsdita
-  ___fractunsdiuqq
-  ___fractunsdiuhq
-  ___fractunsdiusq
-  ___fractunsdiudq
-  ___fractunsdiutq
-  ___fractunsdiuha
-  ___fractunsdiusa
-  ___fractunsdiuda
-  ___fractunsdiuta
-  ___fractunstiqq
-  ___fractunstihq
-  ___fractunstisq
-  ___fractunstidq
-  ___fractunstitq
-  ___fractunstiha
-  ___fractunstisa
-  ___fractunstida
-  ___fractunstita
-  ___fractunstiuqq
-  ___fractunstiuhq
-  ___fractunstiusq
-  ___fractunstiudq
-  ___fractunstiutq
-  ___fractunstiuha
-  ___fractunstiusa
-  ___fractunstiuda
-  ___fractunstiuta
-  ___satfractunsqiqq
-  ___satfractunsqihq
-  ___satfractunsqisq
-  ___satfractunsqidq
-  ___satfractunsqitq
-  ___satfractunsqiha
-  ___satfractunsqisa
-  ___satfractunsqida
-  ___satfractunsqita
-  ___satfractunsqiuqq
-  ___satfractunsqiuhq
-  ___satfractunsqiusq
-  ___satfractunsqiudq
-  ___satfractunsqiutq
-  ___satfractunsqiuha
-  ___satfractunsqiusa
-  ___satfractunsqiuda
-  ___satfractunsqiuta
-  ___satfractunshiqq
-  ___satfractunshihq
-  ___satfractunshisq
-  ___satfractunshidq
-  ___satfractunshitq
-  ___satfractunshiha
-  ___satfractunshisa
-  ___satfractunshida
-  ___satfractunshita
-  ___satfractunshiuqq
-  ___satfractunshiuhq
-  ___satfractunshiusq
-  ___satfractunshiudq
-  ___satfractunshiutq
-  ___satfractunshiuha
-  ___satfractunshiusa
-  ___satfractunshiuda
-  ___satfractunshiuta
-  ___satfractunssiqq
-  ___satfractunssihq
-  ___satfractunssisq
-  ___satfractunssidq
-  ___satfractunssitq
-  ___satfractunssiha
-  ___satfractunssisa
-  ___satfractunssida
-  ___satfractunssita
-  ___satfractunssiuqq
-  ___satfractunssiuhq
-  ___satfractunssiusq
-  ___satfractunssiudq
-  ___satfractunssiutq
-  ___satfractunssiuha
-  ___satfractunssiusa
-  ___satfractunssiuda
-  ___satfractunssiuta
-  ___satfractunsdiqq
-  ___satfractunsdihq
-  ___satfractunsdisq
-  ___satfractunsdidq
-  ___satfractunsditq
-  ___satfractunsdiha
-  ___satfractunsdisa
-  ___satfractunsdida
-  ___satfractunsdita
-  ___satfractunsdiuqq
-  ___satfractunsdiuhq
-  ___satfractunsdiusq
-  ___satfractunsdiudq
-  ___satfractunsdiutq
-  ___satfractunsdiuha
-  ___satfractunsdiusa
-  ___satfractunsdiuda
-  ___satfractunsdiuta
-  ___satfractunstiqq
-  ___satfractunstihq
-  ___satfractunstisq
-  ___satfractunstidq
-  ___satfractunstitq
-  ___satfractunstiha
-  ___satfractunstisa
-  ___satfractunstida
-  ___satfractunstita
-  ___satfractunstiuqq
-  ___satfractunstiuhq
-  ___satfractunstiusq
-  ___satfractunstiudq
-  ___satfractunstiutq
-  ___satfractunstiuha
-  ___satfractunstiusa
-  ___satfractunstiuda
-  ___satfractunstiuta
-}
-
-%inherit GCC_4.4.0 GCC_4.3.0
-GCC_4.4.0 {
-  ___sync_fetch_and_add_1
-  ___sync_fetch_and_sub_1
-  ___sync_fetch_and_or_1
-  ___sync_fetch_and_and_1
-  ___sync_fetch_and_xor_1
-  ___sync_fetch_and_nand_1
-  ___sync_add_and_fetch_1
-  ___sync_sub_and_fetch_1
-  ___sync_or_and_fetch_1
-  ___sync_and_and_fetch_1
-  ___sync_xor_and_fetch_1
-  ___sync_nand_and_fetch_1
-  ___sync_bool_compare_and_swap_1
-  ___sync_val_compare_and_swap_1
-  ___sync_lock_test_and_set_1
-
-  ___sync_fetch_and_add_2
-  ___sync_fetch_and_sub_2
-  ___sync_fetch_and_or_2
-  ___sync_fetch_and_and_2
-  ___sync_fetch_and_xor_2
-  ___sync_fetch_and_nand_2
-  ___sync_add_and_fetch_2
-  ___sync_sub_and_fetch_2
-  ___sync_or_and_fetch_2
-  ___sync_and_and_fetch_2
-  ___sync_xor_and_fetch_2
-  ___sync_nand_and_fetch_2
-  ___sync_bool_compare_and_swap_2
-  ___sync_val_compare_and_swap_2
-  ___sync_lock_test_and_set_2
-
-  ___sync_fetch_and_add_4
-  ___sync_fetch_and_sub_4
-  ___sync_fetch_and_or_4
-  ___sync_fetch_and_and_4
-  ___sync_fetch_and_xor_4
-  ___sync_fetch_and_nand_4
-  ___sync_add_and_fetch_4
-  ___sync_sub_and_fetch_4
-  ___sync_or_and_fetch_4
-  ___sync_and_and_fetch_4
-  ___sync_xor_and_fetch_4
-  ___sync_nand_and_fetch_4
-  ___sync_bool_compare_and_swap_4
-  ___sync_val_compare_and_swap_4
-  ___sync_lock_test_and_set_4
-
-  ___sync_fetch_and_add_8
-  ___sync_fetch_and_sub_8
-  ___sync_fetch_and_or_8
-  ___sync_fetch_and_and_8
-  ___sync_fetch_and_xor_8
-  ___sync_fetch_and_nand_8
-  ___sync_add_and_fetch_8
-  ___sync_sub_and_fetch_8
-  ___sync_or_and_fetch_8
-  ___sync_and_and_fetch_8
-  ___sync_xor_and_fetch_8
-  ___sync_nand_and_fetch_8
-  ___sync_bool_compare_and_swap_8
-  ___sync_val_compare_and_swap_8
-  ___sync_lock_test_and_set_8
-
-  ___sync_fetch_and_add_16
-  ___sync_fetch_and_sub_16
-  ___sync_fetch_and_or_16
-  ___sync_fetch_and_and_16
-  ___sync_fetch_and_xor_16
-  ___sync_fetch_and_nand_16
-  ___sync_add_and_fetch_16
-  ___sync_sub_and_fetch_16
-  ___sync_or_and_fetch_16
-  ___sync_and_and_fetch_16
-  ___sync_xor_and_fetch_16
-  ___sync_nand_and_fetch_16
-  ___sync_bool_compare_and_swap_16
-  ___sync_val_compare_and_swap_16
-  ___sync_lock_test_and_set_16
-
-  ___sync_synchronize
-}
-
-%inherit GCC_4.5.0 GCC_4.4.0
-GCC_4.5.0 {
-  ___unordxf2
-  ___unordtf2
-}
Index: trunk/gcc/config/bfin/t-bfin-linux
===================================================================
--- trunk.orig/gcc/config/bfin/t-bfin-linux
+++ trunk/gcc/config/bfin/t-bfin-linux
@@ -58,8 +58,6 @@ MULTILIB_MATCHES+=mcpu?bf532-none=mcpu?b
 MULTILIB_MATCHES+=mcpu?bf532-none=mcpu?bf549m-none
 MULTILIB_MATCHES+=mcpu?bf532-none=mcpu?bf561-none
 
-SHLIB_MAPFILES=$(srcdir)/config/bfin/libgcc-bfin.ver
-
 EXTRA_MULTILIB_PARTS = crtbegin.o crtend.o crtbeginS.o crtendS.o
 
 # This rule uses MULTILIB_MATCHES to generate a definition of
Index: trunk/libgcc/config/t-underscore-prefix
===================================================================
--- /dev/null
+++ trunk/libgcc/config/t-underscore-prefix
@@ -0,0 +1 @@
+LIBGCC_VER_SYMBOLS_PREFIX = _
Index: trunk/gcc/config/frv/t-linux
===================================================================
--- trunk.orig/gcc/config/frv/t-linux
+++ trunk/gcc/config/frv/t-linux
@@ -29,5 +29,5 @@ EXTRA_MULTILIB_PARTS =
 CRTSTUFF_T_CFLAGS = -fPIC
 TARGET_LIBGCC2_CFLAGS = -fPIC
 
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/frv/libgcc-frv.ver
Index: trunk/gcc/config/i386/t-cygming
===================================================================
--- trunk.orig/gcc/config/i386/t-cygming
+++ trunk/gcc/config/i386/t-cygming
@@ -113,4 +113,4 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
 # We'd like to use SHLIB_SONAME here too, but shlib_base_name
 # does not get substituted before mkmap-flat.awk is run.
 SHLIB_MKMAP_OPTS = -v pe_dll=libgcc_s_$(EH_MODEL)-$(SHLIB_SOVERSION)$(SHLIB_EXT)
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/i386/t-linux
===================================================================
--- trunk.orig/gcc/config/i386/t-linux
+++ trunk/gcc/config/i386/t-linux
@@ -1,5 +1,5 @@
 # On 64bit we do not need any exports for glibc for 64-bit libgcc_s.
 # Need to support TImode for x86.  Override the settings from
 # t-slibgcc-elf-ver and t-linux
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/i386/libgcc-glibc.ver
Index: trunk/gcc/config/mips/t-slibgcc-irix
===================================================================
--- trunk.orig/gcc/config/mips/t-slibgcc-irix
+++ trunk/gcc/config/mips/t-slibgcc-irix
@@ -49,4 +49,4 @@ SHLIB_INSTALL = \
 	$(LN_S) $(SHLIB_SONAME) \
 	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/rs6000/t-aix43
===================================================================
--- trunk.orig/gcc/config/rs6000/t-aix43
+++ trunk/gcc/config/rs6000/t-aix43
@@ -82,7 +82,7 @@ SHLIB_INSTALL = \
 		$$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
 # GCC 128-bit long double support routines.
Index: trunk/gcc/config/rs6000/t-aix52
===================================================================
--- trunk.orig/gcc/config/rs6000/t-aix52
+++ trunk/gcc/config/rs6000/t-aix52
@@ -63,7 +63,7 @@ SHLIB_INSTALL = \
 		$$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
 # GCC 128-bit long double support routines.
Index: trunk/gcc/config/sparc/t-linux
===================================================================
--- trunk.orig/gcc/config/sparc/t-linux
+++ trunk/gcc/config/sparc/t-linux
@@ -1,5 +1,5 @@
 # Override t-slibgcc-elf-ver to export some libgcc symbols with
 # the symbol versions that glibc used.
 # Avoid the t-linux version file.
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/sparc/libgcc-sparc-glibc.ver
Index: trunk/gcc/tree.c
===================================================================
--- trunk.orig/gcc/tree.c
+++ trunk/gcc/tree.c
@@ -9517,6 +9517,10 @@ build_common_builtin_nodes (void)
 	const char *p;
 	enum built_in_function mcode, dcode;
 	tree type, inner_type;
+	const char *prefix = "__";
+
+	if (targetm.libfunc_gnu_prefix)
+	  prefix = "__gnu_";
 
 	type = lang_hooks.types.type_for_mode ((enum machine_mode) mode, 0);
 	if (type == NULL)
@@ -9535,13 +9539,17 @@ build_common_builtin_nodes (void)
 	  *q = TOLOWER (*p);
 	*q = '\0';
 
-	built_in_names[mcode] = concat ("__mul", mode_name_buf, "3", NULL);
+	built_in_names[mcode] = concat (prefix, "mul", mode_name_buf, "3",
+					NULL);
         local_define_builtin (built_in_names[mcode], ftype, mcode,
-			      built_in_names[mcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+			      built_in_names[mcode],
+			      ECF_CONST | ECF_NOTHROW | ECF_LEAF);
 
-	built_in_names[dcode] = concat ("__div", mode_name_buf, "3", NULL);
+	built_in_names[dcode] = concat (prefix, "div", mode_name_buf, "3",
+					NULL);
         local_define_builtin (built_in_names[dcode], ftype, dcode,
-			      built_in_names[dcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+			      built_in_names[dcode],
+			      ECF_CONST | ECF_NOTHROW | ECF_LEAF);
       }
   }
 }
Index: trunk/gcc/config/fixed-bit.h
===================================================================
--- trunk.orig/gcc/config/fixed-bit.h
+++ trunk/gcc/config/fixed-bit.h
@@ -445,35 +445,39 @@ typedef union
 #define IBITS		IBITS2(MODE_NAME)
 #define I_F_BITS	(FBITS + IBITS)
 
-#define FIXED_OP(OP,MODE,NUM)	OP ## MODE ## NUM
+#ifdef LIBGCC2_GNU_PREFIX
+#define FIXED_OP(OP,MODE,NUM)	__gnu_ ## OP ## MODE ## NUM
+#else
+#define FIXED_OP(OP,MODE,NUM)	__ ## OP ## MODE ## NUM
+#endif
 
-#define FIXED_SATURATE1_TEMP(NAME)	FIXED_OP(__saturate1,NAME,)
-#define FIXED_SATURATE2_TEMP(NAME)	FIXED_OP(__saturate2,NAME,)
-#define FIXED_MULHELPER_TEMP(NAME)	FIXED_OP(__mulhelper,NAME,)
-#define FIXED_DIVHELPER_TEMP(NAME)	FIXED_OP(__divhelper,NAME,)
-#define FIXED_ASHLHELPER_TEMP(NAME)	FIXED_OP(__ashlhelper,NAME,)
-#define FIXED_ADD_TEMP(NAME)	FIXED_OP(__add,NAME,3)
-#define FIXED_SSADD_TEMP(NAME)	FIXED_OP(__ssadd,NAME,3)
-#define FIXED_USADD_TEMP(NAME)	FIXED_OP(__usadd,NAME,3)
-#define FIXED_SUB_TEMP(NAME)	FIXED_OP(__sub,NAME,3)
-#define FIXED_SSSUB_TEMP(NAME)	FIXED_OP(__sssub,NAME,3)
-#define FIXED_USSUB_TEMP(NAME)	FIXED_OP(__ussub,NAME,3)
-#define FIXED_MUL_TEMP(NAME)	FIXED_OP(__mul,NAME,3)
-#define FIXED_SSMUL_TEMP(NAME)	FIXED_OP(__ssmul,NAME,3)
-#define FIXED_USMUL_TEMP(NAME)	FIXED_OP(__usmul,NAME,3)
-#define FIXED_DIV_TEMP(NAME)	FIXED_OP(__div,NAME,3)
-#define FIXED_UDIV_TEMP(NAME)	FIXED_OP(__udiv,NAME,3)
-#define FIXED_SSDIV_TEMP(NAME)	FIXED_OP(__ssdiv,NAME,3)
-#define FIXED_USDIV_TEMP(NAME)	FIXED_OP(__usdiv,NAME,3)
-#define FIXED_NEG_TEMP(NAME)	FIXED_OP(__neg,NAME,2)
-#define FIXED_SSNEG_TEMP(NAME)	FIXED_OP(__ssneg,NAME,2)
-#define FIXED_USNEG_TEMP(NAME)	FIXED_OP(__usneg,NAME,2)
-#define FIXED_ASHL_TEMP(NAME)	FIXED_OP(__ashl,NAME,3)
-#define FIXED_ASHR_TEMP(NAME)	FIXED_OP(__ashr,NAME,3)
-#define FIXED_LSHR_TEMP(NAME)	FIXED_OP(__lshr,NAME,3)
-#define FIXED_SSASHL_TEMP(NAME)	FIXED_OP(__ssashl,NAME,3)
-#define FIXED_USASHL_TEMP(NAME)	FIXED_OP(__usashl,NAME,3)
-#define FIXED_CMP_TEMP(NAME)	FIXED_OP(__cmp,NAME,2)
+#define FIXED_SATURATE1_TEMP(NAME)	FIXED_OP(saturate1,NAME,)
+#define FIXED_SATURATE2_TEMP(NAME)	FIXED_OP(saturate2,NAME,)
+#define FIXED_MULHELPER_TEMP(NAME)	FIXED_OP(mulhelper,NAME,)
+#define FIXED_DIVHELPER_TEMP(NAME)	FIXED_OP(divhelper,NAME,)
+#define FIXED_ASHLHELPER_TEMP(NAME)	FIXED_OP(ashlhelper,NAME,)
+#define FIXED_ADD_TEMP(NAME)	FIXED_OP(add,NAME,3)
+#define FIXED_SSADD_TEMP(NAME)	FIXED_OP(ssadd,NAME,3)
+#define FIXED_USADD_TEMP(NAME)	FIXED_OP(usadd,NAME,3)
+#define FIXED_SUB_TEMP(NAME)	FIXED_OP(sub,NAME,3)
+#define FIXED_SSSUB_TEMP(NAME)	FIXED_OP(sssub,NAME,3)
+#define FIXED_USSUB_TEMP(NAME)	FIXED_OP(ussub,NAME,3)
+#define FIXED_MUL_TEMP(NAME)	FIXED_OP(mul,NAME,3)
+#define FIXED_SSMUL_TEMP(NAME)	FIXED_OP(ssmul,NAME,3)
+#define FIXED_USMUL_TEMP(NAME)	FIXED_OP(usmul,NAME,3)
+#define FIXED_DIV_TEMP(NAME)	FIXED_OP(div,NAME,3)
+#define FIXED_UDIV_TEMP(NAME)	FIXED_OP(udiv,NAME,3)
+#define FIXED_SSDIV_TEMP(NAME)	FIXED_OP(ssdiv,NAME,3)
+#define FIXED_USDIV_TEMP(NAME)	FIXED_OP(usdiv,NAME,3)
+#define FIXED_NEG_TEMP(NAME)	FIXED_OP(neg,NAME,2)
+#define FIXED_SSNEG_TEMP(NAME)	FIXED_OP(ssneg,NAME,2)
+#define FIXED_USNEG_TEMP(NAME)	FIXED_OP(usneg,NAME,2)
+#define FIXED_ASHL_TEMP(NAME)	FIXED_OP(ashl,NAME,3)
+#define FIXED_ASHR_TEMP(NAME)	FIXED_OP(ashr,NAME,3)
+#define FIXED_LSHR_TEMP(NAME)	FIXED_OP(lshr,NAME,3)
+#define FIXED_SSASHL_TEMP(NAME)	FIXED_OP(ssashl,NAME,3)
+#define FIXED_USASHL_TEMP(NAME)	FIXED_OP(usashl,NAME,3)
+#define FIXED_CMP_TEMP(NAME)	FIXED_OP(cmp,NAME,2)
 
 #if defined (MODE_NAME)
 #if defined (DINT_C_TYPE)
@@ -1146,14 +1150,19 @@ extern FIXED_C_TYPE FIXED_USASHL (FIXED_
 #define TO_HAVE_PADDING_BITS	(TO_PADDING_BITS > 0)
 #endif /* TO_TYPE == 4  */
 
-#define FIXED_CONVERT_OP(OP,FROM,TO)	OP ## FROM ## TO
-#define FIXED_CONVERT_OP2(OP,FROM,TO)	OP ## FROM ## TO ## 2
-#define FRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(__fract,N1,N2)
-#define FRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(__fract,N1,N2)
-#define SATFRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(__satfract,N1,N2)
-#define SATFRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(__satfract,N1,N2)
-#define FRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(__fractuns,N1,N2)
-#define SATFRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(__satfractuns,N1,N2)
+#ifdef LIBGCC2_GNU_PREFIX
+#define FIXED_CONVERT_OP(OP,FROM,TO)	__gnu_ ## OP ## FROM ## TO
+#define FIXED_CONVERT_OP2(OP,FROM,TO)	__gnu_ ## OP ## FROM ## TO ## 2
+#else
+#define FIXED_CONVERT_OP(OP,FROM,TO)	__ OP ## FROM ## TO
+#define FIXED_CONVERT_OP2(OP,FROM,TO)	__ OP ## FROM ## TO ## 2
+#endif
+#define FRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(fract,N1,N2)
+#define FRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(fract,N1,N2)
+#define SATFRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(satfract,N1,N2)
+#define SATFRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(satfract,N1,N2)
+#define FRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(fractuns,N1,N2)
+#define SATFRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(satfractuns,N1,N2)
 
 /* Define conversions from fixed-point to fixed-point.  */
 #if FROM_TYPE == 4 && TO_TYPE == 4

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 12/11: htdocs
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (11 preceding siblings ...)
  2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
@ 2011-05-13 14:26 ` Bernd Schmidt
  2011-05-13 15:53   ` Joseph S. Myers
  2011-05-23 10:26 ` The TI C6X port Bernd Schmidt
                   ` (3 subsequent siblings)
  16 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 14:26 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 76 bytes --]

As requested by Joseph, here are wwwdocs changes for the C6X port.


Bernd


[-- Attachment #2: c6x-htdocs.diff --]
[-- Type: text/plain, Size: 2414 bytes --]

Index: htdocs/backends.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/backends.html,v
retrieving revision 1.39
diff -c -p -r1.39 backends.html
*** htdocs/backends.html	3 Jan 2011 15:57:04 -0000	1.39
--- htdocs/backends.html	12 May 2011 13:29:53 -0000
*************** arm      |                      da  s
*** 72,77 ****
--- 72,78 ----
  avr      |    L  FI    l  c f m
  bfin     |       F         p g  da
  c4x      |  ??  N I BD       g  d  e 
+ c6x      |   S     CB      p g bda 
  cris     |       F  B     cp g b a  s
  fr30     | ??    FI B        gm     s
  frv      | ??       B      p    da  s
Index: htdocs/index.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/index.html,v
retrieving revision 1.801
diff -c -p -r1.801 index.html
*** htdocs/index.html	9 May 2011 00:31:43 -0000	1.801
--- htdocs/index.html	12 May 2011 13:29:53 -0000
*************** mission statement</a>.</p>
*** 53,58 ****
--- 53,62 ----
  
  <dl class="news">
  
+ <dt>May 13, 2011</dt>
+ <dd>A port for the TI C6X family of processors has been contributed by
+ CodeSourcery.</dd>
+ 
  <dt>April 28, 2011</dt>
  <dd><a href="gcc-4.5/">GCC 4.5.3</a> has been released.</dd>
  
Index: htdocs/readings.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/readings.html,v
retrieving revision 1.214
diff -c -p -r1.214 readings.html
*** htdocs/readings.html	24 Apr 2011 09:02:00 -0000	1.214
--- htdocs/readings.html	12 May 2011 13:29:53 -0000
*************** names.
*** 99,105 ****
     <br />Exact chip name: TMS320C4X
     <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
   </li>
!  
   <li>CRIS
     <br />Manufacturer: Axis Communications
     <br />Acronym stands for: Code Reduced Instruction Set
--- 99,112 ----
     <br />Exact chip name: TMS320C4X
     <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
   </li>
! 
!  <li>C6X
!    <br />Manufacturer: Texas Instruments
!    <br />Exact chip name: TMS320C6X
!    <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
!    <br /><a href="http://linux-c6x.org/">Site for the Linux on C6X project</a>
!  </li>
! 
   <li>CRIS
     <br />Manufacturer: Axis Communications
     <br />Acronym stands for: Code Reduced Instruction Set

^ permalink raw reply	[flat|nested] 99+ messages in thread

* C6X port 13/11: MAINTAINERS
  2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
  2011-05-11 12:18   ` Bernd Schmidt
@ 2011-05-13 14:57   ` Bernd Schmidt
  2011-05-22 18:26     ` Gerald Pfeifer
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 14:57 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, GCC List

[-- Attachment #1: Type: text/plain, Size: 311 bytes --]

On 05/10/2011 06:51 PM, Joseph S. Myers wrote:

> * If you are volunteering to be maintainer of the port, make that explicit 
> (and probably post to gcc@ for the attention of the SC; maintainership 
> needs approving by the SC, separately from the technical review of the 
> patches).

Patch appended.


Bernd

[-- Attachment #2: c6x-maint.diff --]
[-- Type: text/plain, Size: 576 bytes --]

	* MAINTAINERS (c6x port): New entry.

Index: MAINTAINERS
===================================================================
--- MAINTAINERS	(revision 173563)
+++ MAINTAINERS	(working copy)
@@ -50,6 +50,7 @@ avr port		Anatoly Sokolov		aesok@post.ru
 avr port		Eric Weddington		eric.weddington@atmel.com
 bfin port		Bernd Schmidt		bernds@codesourcery.com
 bfin port		Jie Zhang		jzhang918@gmail.com
+c6x port		Bernd Schmidt		bernds@codesourcery.com
 cris port		Hans-Peter Nilsson	hp@axis.com
 fr30 port		Nick Clifton		nickc@redhat.com
 frv port		Nick Clifton		nickc@redhat.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
@ 2011-05-13 15:23   ` Joseph S. Myers
  2011-05-13 18:24     ` Bernd Schmidt
  2011-05-17  7:20   ` Paolo Bonzini
  2011-05-24 10:33   ` Ian Lance Taylor
  2 siblings, 1 reply; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-13 15:23 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Henderson, Stuart, Mike Frysinger

On Fri, 13 May 2011, Bernd Schmidt wrote:

> The following patch adds a target hook and a corresponding LIBGCC2_
> macro which control the generation of library function names. It also
> makes libgcc-std.ver a generated file, built from libgcc-std.ver.in by
> replacing some placeholders with the correct prefixes. While I was
> there, I also added functionality to generate a version of this file
> with an extra underscore for the Blackfin port.

But the linker was changed to use C symbol names in linker scripts and I 
was told that this script in GCC would be removed in consequence.

http://sourceware.org/ml/binutils/2010-12/msg00375.html

Any new target macro for use only in target libraries should, in my view, 
be poisoned in the host system.h from the start to ensure that no-one 
accidentally adds definitions to the host tm.h.  This would be alongside 
the existing

/* Target macros only used for code built for the target, that have
   moved to libgcc-tm.h.  */
 #pragma GCC poison DECLARE_LIBRARY_RENAMES

or just change the comment on that pragma so it doesn't imply that the 
macro was once defined in tm.h.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-13 13:59     ` Bernd Schmidt
@ 2011-05-13 15:52       ` Joseph S. Myers
  2011-05-13 16:00         ` Bernd Schmidt
  2011-05-16 18:45         ` Bernd Schmidt
  0 siblings, 2 replies; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-13 15:52 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Paul Brook

On Fri, 13 May 2011, Bernd Schmidt wrote:

> On 05/10/2011 09:53 PM, Joseph S. Myers wrote:
> > General comment: there are lots of new files here that are built for the 
> > target, and if possible it's preferable for such sources to be under 
> > libgcc/config/ with associated build rules also located there not in the 
> > gcc/ directory.
> 
> I've made an attempt to move over the floating-point library functions,
> but this doesn't work since the include paths aren't set up properly -
> sfp-machine.h isn't found regardless of where it is placed. So I've left
> things in place for now.

I had thought there were some soft-fp files in libgcc/, but actually it 
appears there are just wrappers (see config/i386/64) including files from 
libgcc/config/.  Moving non-soft-fp files to libgcc/config/ should work, 
however.

> I'm also unsure what to do about t-c6x-softfp. I've noticed that e.g.
> moxie has two copies of the corresponding file, but I don't know why.

The main soft-fp configuration will only work in the gcc/ directory at 
present.

> >> +/* Make __c6xabi_AEABI_NAME an alias for __GCC_NAME.  */
> 
> > All this code now needs to go in a header in libgcc/config/, listed in 
> > libgcc_tm_file.
> 
> Changed. However, there's no libgcc_tm_file as far as I can see and
> other ports add the header to tm_file.

See r173619.

> > It's desirable for --target-help to show the list of valid values, either 
> > in the help for the individual option (as for various Enum options in 
> > common.opt, using the TAB-separated form of help text) or by adding a help 
> > text to the Enum definition.
> 
> I've done the latter. Text added to the EnumValues appears to be
> ignored, is that correct?

Yes, EnumValue entries don't have their own help text.

> > * Add the two new targets to contrib/config-list.mk (and confirm they do 
> > pass --enable-werror-always builds with current trunk GCC).
> 
> Added. I've tried to change my builds to use that option, but there are
> lots of errors that appear unrelated to the C6X port. c6x.o compiles
> without warnings.

There shouldn't be lots of errors; Joern does such builds frequently.  
Note that you need to start with a *current native trunk compiler* and use 
that when building the cross compiler; GCC is only expected to build 
cleanly with -Werror when the build uses the same version of GCC, not when 
it uses an older release.

>  - gcc.dg/march.c fails due to extra help text

It looks like this needs a similar fix (target-independent) to r172056 
(which fixed mtune.c).

> +#define PREFERRED_RELOAD_CLASS(x, class) (class)

This macro is being phased out and replaced by a target hook.  In general 
any target macro whose only use is in targhooks.c to provide a default 
transitional version of a hook should not be defined by a new port; new 
ports should define the hooks directly for all macros that are at that 
stage in transition to being hooks.

> +GCC_4.5.0 {

4.7.0 seems more appropriate for a new configuration.

> +  __c6xabi_divi
> +  __c6xabi_divu
> +  __c6xabi_remu
> +  __c6xabi_remi
> +  __c6xabi_divremu
> +  __c6xabi_divremi

> +  __c6xabi_strasgi_64plus
> +  __c6xabi_push_rts
> +  __c6xabi_pop_rts

These are all marked hidden in lib1funcs.asm, presumably because of their 
special register use conventions, so it doesn't make sense to give them 
symbol versions.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 12/11: htdocs
  2011-05-13 14:26 ` C6X port 12/11: htdocs Bernd Schmidt
@ 2011-05-13 15:53   ` Joseph S. Myers
  2011-05-13 16:28     ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-13 15:53 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

I forgot about it in my previous message, but there should be a release 
note in gcc-4.7/changes.html as well.

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-13 15:52       ` Joseph S. Myers
@ 2011-05-13 16:00         ` Bernd Schmidt
  2011-05-13 16:08           ` Joseph S. Myers
  2011-05-16 18:45         ` Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 16:00 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, Paul Brook

On 05/13/2011 04:46 PM, Joseph S. Myers wrote:
> There shouldn't be lots of errors; Joern does such builds frequently.  
> Note that you need to start with a *current native trunk compiler* and use 
> that when building the cross compiler; GCC is only expected to build 
> cleanly with -Werror when the build uses the same version of GCC, not when 
> it uses an older release.

Ah ok.

>> +#define PREFERRED_RELOAD_CLASS(x, class) (class)
> 
> This macro is being phased out and replaced by a target hook.  In general 
> any target macro whose only use is in targhooks.c to provide a default 
> transitional version of a hook should not be defined by a new port; new 
> ports should define the hooks directly for all macros that are at that 
> stage in transition to being hooks.

Any others you spotted? I took care of a few of them earlier
(PRINT_OPERAND etc.). Maybe we need a poison_warn pragma?

>> +GCC_4.5.0 {
> 
> 4.7.0 seems more appropriate for a new configuration.

Even if we also add this to our 4.5 based tree?


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-13 16:00         ` Bernd Schmidt
@ 2011-05-13 16:08           ` Joseph S. Myers
  0 siblings, 0 replies; 99+ messages in thread
From: Joseph S. Myers @ 2011-05-13 16:08 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Paul Brook

On Fri, 13 May 2011, Bernd Schmidt wrote:

> >> +#define PREFERRED_RELOAD_CLASS(x, class) (class)
> > 
> > This macro is being phased out and replaced by a target hook.  In general 
> > any target macro whose only use is in targhooks.c to provide a default 
> > transitional version of a hook should not be defined by a new port; new 
> > ports should define the hooks directly for all macros that are at that 
> > stage in transition to being hooks.
> 
> Any others you spotted? I took care of a few of them earlier
> (PRINT_OPERAND etc.). Maybe we need a poison_warn pragma?

I didn't spot any others.

> >> +GCC_4.5.0 {
> > 
> > 4.7.0 seems more appropriate for a new configuration.
> 
> Even if we also add this to our 4.5 based tree?

Yes.  Backporting

%inherit GCC_4.6.0 GCC_4.5.0
GCC_4.6.0 {
}
%inherit GCC_4.7.0 GCC_4.6.0
GCC_4.7.0 {
}

in libgcc-std.ver is easy.  (The latter isn't yet in trunk, it's added by 
<http://gcc.gnu.org/ml/gcc-patches/2011-04/msg02130.html>; whatever the 
first patch to go in trunk with GCC_4.7.0 symbol versions is needs to add 
it to libgcc-std.ver.)

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 12/11: htdocs
  2011-05-13 15:53   ` Joseph S. Myers
@ 2011-05-13 16:28     ` Bernd Schmidt
  2011-05-14  0:53       ` Gerald Pfeifer
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 16:28 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 190 bytes --]

On 05/13/2011 04:47 PM, Joseph S. Myers wrote:
> I forgot about it in my previous message, but there should be a release 
> note in gcc-4.7/changes.html as well.

New version below.


Bernd

[-- Attachment #2: c6x-htdocs2.diff --]
[-- Type: text/plain, Size: 2977 bytes --]

Index: backends.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/backends.html,v
retrieving revision 1.39
diff -c -p -r1.39 backends.html
*** backends.html	3 Jan 2011 15:57:04 -0000	1.39
--- backends.html	13 May 2011 15:11:29 -0000
*************** arm      |                      da  s
*** 72,77 ****
--- 72,78 ----
  avr      |    L  FI    l  c f m
  bfin     |       F         p g  da
  c4x      |  ??  N I BD       g  d  e 
+ c6x      |   S     CB      p g bda 
  cris     |       F  B     cp g b a  s
  fr30     | ??    FI B        gm     s
  frv      | ??       B      p    da  s
Index: index.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/index.html,v
retrieving revision 1.801
diff -c -p -r1.801 index.html
*** index.html	9 May 2011 00:31:43 -0000	1.801
--- index.html	13 May 2011 15:11:29 -0000
*************** mission statement</a>.</p>
*** 53,58 ****
--- 53,62 ----
  
  <dl class="news">
  
+ <dt>May 13, 2011</dt>
+ <dd>A port for the TI C6X family of processors has been contributed by
+ CodeSourcery.</dd>
+ 
  <dt>April 28, 2011</dt>
  <dd><a href="gcc-4.5/">GCC 4.5.3</a> has been released.</dd>
  
Index: readings.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/readings.html,v
retrieving revision 1.214
diff -c -p -r1.214 readings.html
*** readings.html	24 Apr 2011 09:02:00 -0000	1.214
--- readings.html	13 May 2011 15:11:29 -0000
*************** names.
*** 99,105 ****
     <br />Exact chip name: TMS320C4X
     <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
   </li>
!  
   <li>CRIS
     <br />Manufacturer: Axis Communications
     <br />Acronym stands for: Code Reduced Instruction Set
--- 99,112 ----
     <br />Exact chip name: TMS320C4X
     <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
   </li>
! 
!  <li>C6X
!    <br />Manufacturer: Texas Instruments
!    <br />Exact chip name: TMS320C6X
!    <br /><a href="http://www.ti.com/sc/docs/psheets/man_dsp.htm">DSP Manuals</a>
!    <br /><a href="http://linux-c6x.org/">Site for the Linux on C6X project</a>
!  </li>
! 
   <li>CRIS
     <br />Manufacturer: Axis Communications
     <br />Acronym stands for: Code Reduced Instruction Set
Index: gcc-4.7/changes.html
===================================================================
RCS file: /cvs/gcc/wwwdocs/htdocs/gcc-4.7/changes.html,v
retrieving revision 1.12
diff -c -p -r1.12 changes.html
*** gcc-4.7/changes.html	11 May 2011 16:38:39 -0000	1.12
--- gcc-4.7/changes.html	13 May 2011 15:11:29 -0000
***************
*** 88,93 ****
--- 88,99 ----
  
  <h2 id="targets">New Targets and Target Specific Improvements</h2>
  
+ <h3>C6X</h3>
+   <ul>
+     <li>Support has been added for the Texas Instruments C6X family of
+       processors.</li>
+   </ul>
+ 
  <h3>IA-32/x86-64</h3>
    <ul>
      <li>...</li>

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-13 15:23   ` Joseph S. Myers
@ 2011-05-13 18:24     ` Bernd Schmidt
  2011-05-25 14:00       ` H.J. Lu
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-13 18:24 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, Henderson, Stuart, Mike Frysinger

[-- Attachment #1: Type: text/plain, Size: 1169 bytes --]

On 05/13/2011 04:26 PM, Joseph S. Myers wrote:
> On Fri, 13 May 2011, Bernd Schmidt wrote:
> 
>> The following patch adds a target hook and a corresponding LIBGCC2_
>> macro which control the generation of library function names. It also
>> makes libgcc-std.ver a generated file, built from libgcc-std.ver.in by
>> replacing some placeholders with the correct prefixes. While I was
>> there, I also added functionality to generate a version of this file
>> with an extra underscore for the Blackfin port.
> 
> But the linker was changed to use C symbol names in linker scripts and I 
> was told that this script in GCC would be removed in consequence.
> 
> http://sourceware.org/ml/binutils/2010-12/msg00375.html

Oh well. Dropped.

> Any new target macro for use only in target libraries should, in my view, 
> be poisoned in the host system.h from the start to ensure that no-one 
> accidentally adds definitions to the host tm.h.  This would be alongside 
> the existing
> 
> /* Target macros only used for code built for the target, that have
>    moved to libgcc-tm.h.  */
>  #pragma GCC poison DECLARE_LIBRARY_RENAMES

Done. New patch below, now testing.


Bernd

[-- Attachment #2: libfuncs-prefix.diff --]
[-- Type: text/plain, Size: 101743 bytes --]

	gcc/
	* libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if
	LIBGCC2_GNU_PREFIX is defined.
	(__N): New macro.
	(__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2,
	__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3,
	__divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack,
	__clz_tab): Define using __N.
	(__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if
	COMPAT_SIMODE_TRAPPING_ARITHMETIC.
	* target.def (libfunc_gnu_prefix): New hook.
	* doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document.
	(TARGET_LIBFUNC_GNU_PREFIX): Add hook.
	* doc/tm.texi: Regenerate.
	* system.h (LIBGCC2_GNU_PREFIX): Poison.
	* optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into
	account.
	(gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
	(init_optabs): Likewise for the bswap libfuncs.
	* tree.c (build_common_builtin_nodes): Likewise for complex multiply
	and divide.
	* config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir).
	* config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise.
	* libgcc-std.ver: Remove.
	* Makefile.in (srcdirify): Handle $$(libgcc_objdir).
	* config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for
	libgcc-std.ver.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise.
	* config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise.
	* config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise.
	* config/sparc/t-linux (SHLIB_MAPFILES): Likewise.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
	* config/fixed-bit.h (FIXED_OP): Define differently depending on
	LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores.
	(FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise.

	libgcc/
	* libgcc-std.ver.in: New file.
	* Makefile.in (LIBGCC_VER_GNU_PREFIX, LIBGCC_VER_SYMBOLS_PREFIX): New
	variables.
	(libgcc-std.ver): New rule.
	* config/t-gnu-prefix: New file.

Index: trunk/gcc/libgcc2.h
===================================================================
--- trunk.orig/gcc/libgcc2.h
+++ trunk/gcc/libgcc2.h
@@ -193,8 +193,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	UDItype
 #define DWtype	TItype
 #define UDWtype	UTItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## di ## b
+#define __NDW(a,b)	__gnu_ ## a ## ti ## b
+#else
 #define __NW(a,b)	__ ## a ## di ## b
 #define __NDW(a,b)	__ ## a ## ti ## b
+#endif
 #define COMPAT_SIMODE_TRAPPING_ARITHMETIC
 #elif LIBGCC2_UNITS_PER_WORD == 4
 #define W_TYPE_SIZE (4 * BITS_PER_UNIT)
@@ -204,8 +209,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	USItype
 #define DWtype	DItype
 #define UDWtype	UDItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## si ## b
+#define __NDW(a,b)	__gnu_ ## a ## di ## b
+#else
 #define __NW(a,b)	__ ## a ## si ## b
 #define __NDW(a,b)	__ ## a ## di ## b
+#endif
 #elif LIBGCC2_UNITS_PER_WORD == 2
 #define W_TYPE_SIZE (2 * BITS_PER_UNIT)
 #define Wtype	HItype
@@ -214,8 +224,13 @@ typedef int shift_count_type __attribute
 #define UHWtype	UHItype
 #define DWtype	SItype
 #define UDWtype	USItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## hi ## b
+#define __NDW(a,b)	__gnu_ ## a ## si ## b
+#else
 #define __NW(a,b)	__ ## a ## hi ## b
 #define __NDW(a,b)	__ ## a ## si ## b
+#endif
 #else
 #define W_TYPE_SIZE BITS_PER_UNIT
 #define Wtype	QItype
@@ -224,10 +239,20 @@ typedef int shift_count_type __attribute
 #define UHWtype	UQItype
 #define DWtype	HItype
 #define UDWtype	UHItype
+#ifdef LIBGCC2_GNU_PREFIX
+#define __NW(a,b)	__gnu_ ## a ## qi ## b
+#define __NDW(a,b)	__gnu_ ## a ## hi ## b
+#else
 #define __NW(a,b)	__ ## a ## qi ## b
 #define __NDW(a,b)	__ ## a ## hi ## b
 #endif
+#endif
 
+#ifdef LIBGCC2_GNU_PREFIX
+#define __N(a)	__gnu_ ## a
+#else
+#define __N(a)	__ ## a
+#endif
 #define Wtype_MAX ((Wtype)(((UWtype)1 << (W_TYPE_SIZE - 1)) - 1))
 #define Wtype_MIN (- Wtype_MAX - 1)
 
@@ -298,6 +323,25 @@ typedef int shift_count_type __attribute
 #define __popcountDI2	__NDW(popcount,2)
 #define __parityDI2	__NDW(parity,2)
 
+#define __clz_tab		__N(clz_tab)
+#define __powisf2		__N(powisf2)
+#define __powidf2		__N(powidf2)
+#define __powitf2		__N(powitf2)
+#define __powixf2		__N(powixf2)
+#define __bswapsi2		__N(bswapsi2)
+#define __bswapdi2		__N(bswapdi2)
+#define __mulsc3		__N(mulsc3)
+#define __muldc3		__N(muldc3)
+#define __mulxc3		__N(mulxc3)
+#define __multc3		__N(multc3)
+#define __divsc3		__N(divsc3)
+#define __divdc3		__N(divdc3)
+#define __divxc3		__N(divxc3)
+#define __divtc3		__N(divtc3)
+#define __udiv_w_sdiv		__N(udiv_w_sdiv)
+#define __clear_cache		__N(clear_cache)
+#define __enable_execute_stack	__N(enable_execute_stack)
+
 extern DWtype __muldi3 (DWtype, DWtype);
 extern DWtype __divdi3 (DWtype, DWtype);
 extern UDWtype __udivdi3 (UDWtype, UDWtype);
@@ -347,6 +391,12 @@ extern DWtype __mulvDI3 (DWtype, DWtype)
 extern DWtype __negvDI2 (DWtype);
 
 #ifdef COMPAT_SIMODE_TRAPPING_ARITHMETIC
+#define __absvsi2	__N(absvsi2)
+#define __negvsi2	__N(negvsi2)
+#define __addvsi3	__N(addvsi3)
+#define __subvsi3	__N(subvsi3)
+#define __mulvsi3	__N(mulvsi3)
+
 extern SItype __absvsi2 (SItype);
 extern SItype __addvsi3 (SItype, SItype);
 extern SItype __subvsi3 (SItype, SItype);
Index: trunk/gcc/target.def
===================================================================
--- trunk.orig/gcc/target.def
+++ trunk/gcc/target.def
@@ -1258,6 +1258,16 @@ DEFHOOK
  void, (void),
  hook_void_void)
 
+ /* Add a __gnu_ prefix to library functions rather than just __.  */
+DEFHOOKPOD
+(libfunc_gnu_prefix,
+ "This hook can be used to override the default prefix given to library\n\
+routines. Normally, this is just two underscores, @code{__}, but\n\
+it if changed to true, then for example a name like @code{__gnu_muldi3}\n\
+is used instead of the default @code{__muldi3}. This applies only to\n\
+functions defined in @file{libgcc2.c}.",
+  bool, false)
+
 /* Given a decl, a section name, and whether the decl initializer
    has relocs, choose attributes for the section.  */
 /* ??? Should be merged with SELECT_SECTION and UNIQUE_SECTION.  */
Index: trunk/gcc/doc/tm.texi
===================================================================
--- trunk.orig/gcc/doc/tm.texi
+++ trunk/gcc/doc/tm.texi
@@ -1588,6 +1588,15 @@ anyway.  If you don't define this and @c
 is 128 then the default is 1, otherwise it is 0.
 @end defmac
 
+@defmac LIBGCC2_GNU_PREFIX
+This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
+hook and should be defined if this hook is overriden to be true.  It
+causes function names in libgcc to be changed to use a @code{__gnu_}
+prefix for their name rather than the default @code{__}.  A port which
+uses this macro should also arrange to use @file{t-gnu-prefix} in
+the libgcc @file{config.host}.
+@end defmac
+
 @defmac SF_SIZE
 @defmacx DF_SIZE
 @defmacx XF_SIZE
@@ -5260,6 +5269,14 @@ library routines.
 The default is to do nothing.  Most ports don't need to define this hook.
 @end deftypefn
 
+@deftypevr {Target Hook} bool TARGET_LIBFUNC_GNU_PREFIX
+This hook can be used to override the default prefix given to library
+routines. Normally, this is just two underscores, @code{__}, but
+it if changed to true, then for example a name like @code{__gnu_muldi3}
+is used instead of the default @code{__muldi3}. This applies only to
+functions defined in @file{libgcc2.c}.
+@end deftypevr
+
 @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison})
 This macro should return @code{true} if the library routine that
 implements the floating point comparison operator @var{comparison} in
Index: trunk/gcc/doc/tm.texi.in
===================================================================
--- trunk.orig/gcc/doc/tm.texi.in
+++ trunk/gcc/doc/tm.texi.in
@@ -1578,6 +1578,15 @@ anyway.  If you don't define this and @c
 is 128 then the default is 1, otherwise it is 0.
 @end defmac
 
+@defmac LIBGCC2_GNU_PREFIX
+This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
+hook and should be defined if this hook is overriden to be true.  It
+causes function names in libgcc to be changed to use a @code{__gnu_}
+prefix for their name rather than the default @code{__}.  A port which
+uses this macro should also arrange to use @file{t-gnu-prefix} in
+the libgcc @file{config.host}.
+@end defmac
+
 @defmac SF_SIZE
 @defmacx DF_SIZE
 @defmacx XF_SIZE
@@ -5208,6 +5217,8 @@ library routines.
 The default is to do nothing.  Most ports don't need to define this hook.
 @end deftypefn
 
+@hook TARGET_LIBFUNC_GNU_PREFIX
+
 @defmac FLOAT_LIB_COMPARE_RETURNS_BOOL (@var{mode}, @var{comparison})
 This macro should return @code{true} if the library routine that
 implements the floating point comparison operator @var{comparison} in
Index: trunk/gcc/optabs.c
===================================================================
--- trunk.orig/gcc/optabs.c
+++ trunk/gcc/optabs.c
@@ -5152,13 +5152,22 @@ gen_libfunc (optab optable, const char *
   unsigned opname_len = strlen (opname);
   const char *mname = GET_MODE_NAME (mode);
   unsigned mname_len = strlen (mname);
-  char *libfunc_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
+  int len = prefix_len + opname_len + mname_len + 1 + 1;
+  char *libfunc_name = XALLOCAVEC (char, len);
   char *p;
   const char *q;
 
   p = libfunc_name;
   *p++ = '_';
   *p++ = '_';
+  if (targetm.libfunc_gnu_prefix)
+    {
+      *p++ = 'g';
+      *p++ = 'n';
+      *p++ = 'u';
+      *p++ = '_';
+    }
   for (q = opname; *q; )
     *p++ = *q++;
   for (q = mname; *q; q++)
@@ -5362,6 +5371,7 @@ gen_interclass_conv_libfunc (convert_opt
 
   const char *fname, *tname;
   const char *q;
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
   char *libfunc_name, *suffix;
   char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix;
   char *p;
@@ -5372,11 +5382,19 @@ gen_interclass_conv_libfunc (convert_opt
 
   mname_len = strlen (GET_MODE_NAME (tmode)) + strlen (GET_MODE_NAME (fmode));
 
-  nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
+  nondec_name = XALLOCAVEC (char, prefix_len + opname_len + mname_len + 1 + 1);
   nondec_name[0] = '_';
   nondec_name[1] = '_';
-  memcpy (&nondec_name[2], opname, opname_len);
-  nondec_suffix = nondec_name + opname_len + 2;
+  if (targetm.libfunc_gnu_prefix)
+    {
+      nondec_name[2] = 'g';
+      nondec_name[3] = 'n';
+      nondec_name[4] = 'u';
+      nondec_name[5] = '_';
+    }
+
+  memcpy (&nondec_name[prefix_len], opname, opname_len);
+  nondec_suffix = nondec_name + opname_len + prefix_len;
 
   dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1);
   dec_name[0] = '_';
@@ -5487,6 +5505,7 @@ gen_intraclass_conv_libfunc (convert_opt
 
   const char *fname, *tname;
   const char *q;
+  int prefix_len = targetm.libfunc_gnu_prefix ? 6 : 2;
   char *nondec_name, *dec_name, *nondec_suffix, *dec_suffix;
   char *libfunc_name, *suffix;
   char *p;
@@ -5500,8 +5519,15 @@ gen_intraclass_conv_libfunc (convert_opt
   nondec_name = XALLOCAVEC (char, 2 + opname_len + mname_len + 1 + 1);
   nondec_name[0] = '_';
   nondec_name[1] = '_';
-  memcpy (&nondec_name[2], opname, opname_len);
-  nondec_suffix = nondec_name + opname_len + 2;
+  if (targetm.libfunc_gnu_prefix)
+    {
+      nondec_name[2] = 'g';
+      nondec_name[3] = 'n';
+      nondec_name[4] = 'u';
+      nondec_name[5] = '_';
+    }
+  memcpy (&nondec_name[prefix_len], opname, opname_len);
+  nondec_suffix = nondec_name + opname_len + prefix_len;
 
   dec_name = XALLOCAVEC (char, 2 + dec_len + opname_len + mname_len + 1 + 1);
   dec_name[0] = '_';
@@ -6231,8 +6257,16 @@ init_optabs (void)
 
   /* Explicitly initialize the bswap libfuncs since we need them to be
      valid for things other than word_mode.  */
-  set_optab_libfunc (bswap_optab, SImode, "__bswapsi2");
-  set_optab_libfunc (bswap_optab, DImode, "__bswapdi2");
+  if (targetm.libfunc_gnu_prefix)
+    {
+      set_optab_libfunc (bswap_optab, SImode, "__gnu_bswapsi2");
+      set_optab_libfunc (bswap_optab, DImode, "__gnu_bswapdi2");
+    }
+  else
+    {
+      set_optab_libfunc (bswap_optab, SImode, "__bswapsi2");
+      set_optab_libfunc (bswap_optab, DImode, "__bswapdi2");
+    }
 
   /* Use cabs for double complex abs, since systems generally have cabs.
      Don't define any libcall for float complex, so that cabs will be used.  */
Index: trunk/gcc/config/t-slibgcc-elf-ver
===================================================================
--- trunk.orig/gcc/config/t-slibgcc-elf-ver
+++ trunk/gcc/config/t-slibgcc-elf-ver
@@ -53,4 +53,4 @@ SHLIB_INSTALL = \
 	rm -f $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK); \
 	$(SHLIB_INSTALL_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/t-slibgcc-sld
===================================================================
--- trunk.orig/gcc/config/t-slibgcc-sld
+++ trunk/gcc/config/t-slibgcc-sld
@@ -47,4 +47,4 @@ SHLIB_INSTALL = \
 	$(LN_S) $(SHLIB_SONAME) \
 	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-symver.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/libgcc-std.ver
===================================================================
--- trunk.orig/gcc/libgcc-std.ver
+++ /dev/null
@@ -1,1921 +0,0 @@
-# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
-# 2008, 2010 Free Software Foundation, Inc.
-#
-# This file is part of GCC.
-#
-# GCC is free software; you can redistribute it and/or modify
-# it under the terms of the GNU General Public License as published by
-# the Free Software Foundation; either version 3, or (at your option)
-# any later version.
-#
-# GCC is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with GCC; see the file COPYING3.  If not see
-# <http://www.gnu.org/licenses/>.
-
-GCC_3.0 {
-  # libgcc1 integer symbols
-  __absvsi2
-  __addvsi3
-  __ashlsi3
-  __ashrsi3
-  __divsi3
-  __lshrsi3
-  __modsi3
-  __mulsi3
-  __mulvsi3
-  __negvsi2
-  __subvsi3
-  __udivsi3
-  __umodsi3
-
-  # libgcc1 floating point symbols
-  __addsf3
-  __adddf3
-  __addxf3
-  __addtf3
-  __divsf3
-  __divdf3
-  __divxf3
-  __divtf3
-  __eqsf2
-  __eqdf2
-  __eqxf2
-  __eqtf2
-  __extenddfxf2
-  __extenddftf2
-  __extendsfdf2
-  __extendsfxf2
-  __extendsftf2
-  __fixsfsi
-  __fixdfsi
-  __fixxfsi
-  __fixtfsi
-  __floatsisf
-  __floatsidf
-  __floatsixf
-  __floatsitf
-  __gesf2
-  __gedf2
-  __gexf2
-  __getf2
-  __gtsf2
-  __gtdf2
-  __gtxf2
-  __gttf2
-  __lesf2
-  __ledf2
-  __lexf2
-  __letf2
-  __ltsf2
-  __ltdf2
-  __ltxf2
-  __lttf2
-  __mulsf3
-  __muldf3
-  __mulxf3
-  __multf3
-  __negsf2
-  __negdf2
-  __negxf2
-  __negtf2
-  __nesf2
-  __nedf2
-  __nexf2
-  __netf2
-  __subsf3
-  __subdf3
-  __subxf3
-  __subtf3
-  __truncdfsf2
-  __truncxfsf2
-  __trunctfsf2
-  __truncxfdf2
-  __trunctfdf2
-
-  # libgcc2 DImode arithmetic (for 32-bit targets).
-  __absvdi2
-  __addvdi3
-  __ashldi3
-  __ashrdi3
-  __cmpdi2
-  __divdi3
-  __ffsdi2
-  __fixdfdi
-  __fixsfdi
-  __fixtfdi
-  __fixxfdi
-  __fixunsdfdi
-  __fixunsdfsi
-  __fixunssfsi
-  __fixunssfdi
-  __fixunstfdi
-  __fixunstfsi
-  __fixunsxfdi
-  __fixunsxfsi
-  __floatdidf
-  __floatdisf
-  __floatdixf
-  __floatditf
-  __lshrdi3
-  __moddi3
-  __muldi3
-  __mulvdi3
-  __negdi2
-  __negvdi2
-  __subvdi3
-  __ucmpdi2
-  __udivdi3
-  __udivmoddi4
-  __umoddi3
-
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  __ashlti3
-  __ashrti3
-  __cmpti2
-  __divti3
-  __ffsti2
-  __fixdfti
-  __fixsfti
-  __fixtfti
-  __fixxfti
-  __lshrti3
-  __modti3
-  __multi3
-  __negti2
-  __ucmpti2
-  __udivmodti4
-  __udivti3
-  __umodti3
-  __fixunsdfti
-  __fixunssfti
-  __fixunstfti
-  __fixunsxfti
-  __floattidf
-  __floattisf
-  __floattixf
-  __floattitf
-
-  # Used to deal with trampoline initialization on some platforms
-  __clear_cache
-
-  # EH symbols
-  _Unwind_DeleteException
-  _Unwind_Find_FDE
-  _Unwind_ForcedUnwind
-  _Unwind_GetGR
-  _Unwind_GetIP
-  _Unwind_GetLanguageSpecificData
-  _Unwind_GetRegionStart
-  _Unwind_GetTextRelBase
-  _Unwind_GetDataRelBase
-  _Unwind_RaiseException
-  _Unwind_Resume
-  _Unwind_SetGR
-  _Unwind_SetIP
-  __deregister_frame
-  __deregister_frame_info
-  __deregister_frame_info_bases
-  __register_frame
-  __register_frame_info
-  __register_frame_info_bases
-  __register_frame_info_table
-  __register_frame_info_table_bases
-  __register_frame_table
-
-  # SjLj EH symbols
-  _Unwind_SjLj_Register
-  _Unwind_SjLj_Unregister
-  _Unwind_SjLj_RaiseException
-  _Unwind_SjLj_ForcedUnwind
-  _Unwind_SjLj_Resume
-}
-
-%inherit GCC_3.3 GCC_3.0
-GCC_3.3 {
-  _Unwind_FindEnclosingFunction
-  _Unwind_GetCFA
-  _Unwind_Backtrace
-  _Unwind_Resume_or_Rethrow
-  _Unwind_SjLj_Resume_or_Rethrow
-}
-
-%inherit GCC_3.3.1 GCC_3.3
-GCC_3.3.1 {
-  __gcc_personality_sj0
-  __gcc_personality_v0
-}
-
-%inherit GCC_3.3.2 GCC_3.3.1
-GCC_3.3.2 {
-}
-
-%inherit GCC_3.3.4 GCC_3.3.2
-GCC_3.3.4 {
-  __unorddf2
-  __unordsf2
-}
-
-%inherit GCC_3.4 GCC_3.3.4
-GCC_3.4 {
-  # bit scanning and counting built-ins
-  __clzsi2
-  __clzdi2
-  __clzti2
-  __ctzsi2
-  __ctzdi2
-  __ctzti2
-  __popcountsi2
-  __popcountdi2
-  __popcountti2
-  __paritysi2
-  __paritydi2
-  __parityti2
-}
-
-%inherit GCC_3.4.2 GCC_3.4
-GCC_3.4.2 {
-  # Used to deal with trampoline initialization on some platforms
-  __enable_execute_stack
-  __trampoline_setup
-}
-
-%inherit GCC_3.4.4 GCC_3.4.2
-GCC_3.4.4 {
-  # libgcc2 TImode arithmetic (for 64-bit targets).
-  __absvti2
-  __addvti3
-  __mulvti3
-  __negvti2
-  __subvti3
-}
-
-%inherit GCC_4.0.0 GCC_3.4.4
-GCC_4.0.0 {
-  # libgcc2 __builtin_powi helpers.
-  __powisf2
-  __powidf2
-  __powixf2
-  __powitf2
-
-  # c99 compliant complex arithmetic
-  __divsc3
-  __divdc3
-  __divxc3
-  __divtc3
-  __mulsc3
-  __muldc3
-  __mulxc3
-  __multc3
-}
-
-%inherit GCC_4.1.0 GCC_4.0.0
-GCC_4.1.0 {
-}
-
-%inherit GCC_4.2.0 GCC_4.1.0
-GCC_4.2.0 {
-  # unsigned-to-floating conversions
-  __floatunsisf
-  __floatunsidf
-  __floatunsixf
-  __floatunsitf
-  __floatundidf
-  __floatundisf
-  __floatundixf
-  __floatunditf
-  __floatuntidf
-  __floatuntisf
-  __floatuntixf
-  __floatuntitf
-  _Unwind_GetIPInfo
-}
-
-%inherit GCC_4.3.0 GCC_4.2.0
-GCC_4.3.0 {
-  # byte swapping routines
-  __bswapsi2
-  __bswapdi2
-  __emutls_get_address
-  __emutls_register_common
-  __ffssi2
-  __extendxftf2
-  __trunctfxf2
-
-  # fixed-point routines
-  __addqq3
-  __addhq3
-  __addsq3
-  __adddq3
-  __addtq3
-  __adduqq3
-  __adduhq3
-  __addusq3
-  __addudq3
-  __addutq3
-  __addha3
-  __addsa3
-  __addda3
-  __addta3
-  __adduha3
-  __addusa3
-  __adduda3
-  __adduta3
-  __ssaddqq3
-  __ssaddhq3
-  __ssaddsq3
-  __ssadddq3
-  __ssaddtq3
-  __ssaddha3
-  __ssaddsa3
-  __ssaddda3
-  __ssaddta3
-  __usadduqq3
-  __usadduhq3
-  __usaddusq3
-  __usaddudq3
-  __usaddutq3
-  __usadduha3
-  __usaddusa3
-  __usadduda3
-  __usadduta3
-  __subqq3
-  __subhq3
-  __subsq3
-  __subdq3
-  __subtq3
-  __subuqq3
-  __subuhq3
-  __subusq3
-  __subudq3
-  __subutq3
-  __subha3
-  __subsa3
-  __subda3
-  __subta3
-  __subuha3
-  __subusa3
-  __subuda3
-  __subuta3
-  __sssubqq3
-  __sssubhq3
-  __sssubsq3
-  __sssubdq3
-  __sssubtq3
-  __sssubha3
-  __sssubsa3
-  __sssubda3
-  __sssubta3
-  __ussubuqq3
-  __ussubuhq3
-  __ussubusq3
-  __ussubudq3
-  __ussubutq3
-  __ussubuha3
-  __ussubusa3
-  __ussubuda3
-  __ussubuta3
-  __mulqq3
-  __mulhq3
-  __mulsq3
-  __muldq3
-  __multq3
-  __muluqq3
-  __muluhq3
-  __mulusq3
-  __muludq3
-  __mulutq3
-  __mulha3
-  __mulsa3
-  __mulda3
-  __multa3
-  __muluha3
-  __mulusa3
-  __muluda3
-  __muluta3
-  __ssmulqq3
-  __ssmulhq3
-  __ssmulsq3
-  __ssmuldq3
-  __ssmultq3
-  __ssmulha3
-  __ssmulsa3
-  __ssmulda3
-  __ssmulta3
-  __usmuluqq3
-  __usmuluhq3
-  __usmulusq3
-  __usmuludq3
-  __usmulutq3
-  __usmuluha3
-  __usmulusa3
-  __usmuluda3
-  __usmuluta3
-  __divqq3
-  __divhq3
-  __divsq3
-  __divdq3
-  __divtq3
-  __divha3
-  __divsa3
-  __divda3
-  __divta3
-  __udivuqq3
-  __udivuhq3
-  __udivusq3
-  __udivudq3
-  __udivutq3
-  __udivuha3
-  __udivusa3
-  __udivuda3
-  __udivuta3
-  __ssdivqq3
-  __ssdivhq3
-  __ssdivsq3
-  __ssdivdq3
-  __ssdivtq3
-  __ssdivha3
-  __ssdivsa3
-  __ssdivda3
-  __ssdivta3
-  __usdivuqq3
-  __usdivuhq3
-  __usdivusq3
-  __usdivudq3
-  __usdivutq3
-  __usdivuha3
-  __usdivusa3
-  __usdivuda3
-  __usdivuta3
-  __negqq2
-  __neghq2
-  __negsq2
-  __negdq2
-  __negtq2
-  __neguqq2
-  __neguhq2
-  __negusq2
-  __negudq2
-  __negutq2
-  __negha2
-  __negsa2
-  __negda2
-  __negta2
-  __neguha2
-  __negusa2
-  __neguda2
-  __neguta2
-  __ssnegqq2
-  __ssneghq2
-  __ssnegsq2
-  __ssnegdq2
-  __ssnegtq2
-  __ssnegha2
-  __ssnegsa2
-  __ssnegda2
-  __ssnegta2
-  __usneguqq2
-  __usneguhq2
-  __usnegusq2
-  __usnegudq2
-  __usnegutq2
-  __usneguha2
-  __usnegusa2
-  __usneguda2
-  __usneguta2
-  __ashlqq3
-  __ashlhq3
-  __ashlsq3
-  __ashldq3
-  __ashltq3
-  __ashluqq3
-  __ashluhq3
-  __ashlusq3
-  __ashludq3
-  __ashlutq3
-  __ashlha3
-  __ashlsa3
-  __ashlda3
-  __ashlta3
-  __ashluha3
-  __ashlusa3
-  __ashluda3
-  __ashluta3
-  __ashrqq3
-  __ashrhq3
-  __ashrsq3
-  __ashrdq3
-  __ashrtq3
-  __ashrha3
-  __ashrsa3
-  __ashrda3
-  __ashrta3
-  __lshruqq3
-  __lshruhq3
-  __lshrusq3
-  __lshrudq3
-  __lshrutq3
-  __lshruha3
-  __lshrusa3
-  __lshruda3
-  __lshruta3
-  __ssashlqq3
-  __ssashlhq3
-  __ssashlsq3
-  __ssashldq3
-  __ssashltq3
-  __ssashlha3
-  __ssashlsa3
-  __ssashlda3
-  __ssashlta3
-  __usashluqq3
-  __usashluhq3
-  __usashlusq3
-  __usashludq3
-  __usashlutq3
-  __usashluha3
-  __usashlusa3
-  __usashluda3
-  __usashluta3
-  __cmpqq2
-  __cmphq2
-  __cmpsq2
-  __cmpdq2
-  __cmptq2
-  __cmpuqq2
-  __cmpuhq2
-  __cmpusq2
-  __cmpudq2
-  __cmputq2
-  __cmpha2
-  __cmpsa2
-  __cmpda2
-  __cmpta2
-  __cmpuha2
-  __cmpusa2
-  __cmpuda2
-  __cmputa2
-  __fractqqhq2
-  __fractqqsq2
-  __fractqqdq2
-  __fractqqtq2
-  __fractqqha
-  __fractqqsa
-  __fractqqda
-  __fractqqta
-  __fractqquqq
-  __fractqquhq
-  __fractqqusq
-  __fractqqudq
-  __fractqqutq
-  __fractqquha
-  __fractqqusa
-  __fractqquda
-  __fractqquta
-  __fractqqqi
-  __fractqqhi
-  __fractqqsi
-  __fractqqdi
-  __fractqqti
-  __fractqqsf
-  __fractqqdf
-  __fracthqqq2
-  __fracthqsq2
-  __fracthqdq2
-  __fracthqtq2
-  __fracthqha
-  __fracthqsa
-  __fracthqda
-  __fracthqta
-  __fracthquqq
-  __fracthquhq
-  __fracthqusq
-  __fracthqudq
-  __fracthqutq
-  __fracthquha
-  __fracthqusa
-  __fracthquda
-  __fracthquta
-  __fracthqqi
-  __fracthqhi
-  __fracthqsi
-  __fracthqdi
-  __fracthqti
-  __fracthqsf
-  __fracthqdf
-  __fractsqqq2
-  __fractsqhq2
-  __fractsqdq2
-  __fractsqtq2
-  __fractsqha
-  __fractsqsa
-  __fractsqda
-  __fractsqta
-  __fractsquqq
-  __fractsquhq
-  __fractsqusq
-  __fractsqudq
-  __fractsqutq
-  __fractsquha
-  __fractsqusa
-  __fractsquda
-  __fractsquta
-  __fractsqqi
-  __fractsqhi
-  __fractsqsi
-  __fractsqdi
-  __fractsqti
-  __fractsqsf
-  __fractsqdf
-  __fractdqqq2
-  __fractdqhq2
-  __fractdqsq2
-  __fractdqtq2
-  __fractdqha
-  __fractdqsa
-  __fractdqda
-  __fractdqta
-  __fractdquqq
-  __fractdquhq
-  __fractdqusq
-  __fractdqudq
-  __fractdqutq
-  __fractdquha
-  __fractdqusa
-  __fractdquda
-  __fractdquta
-  __fractdqqi
-  __fractdqhi
-  __fractdqsi
-  __fractdqdi
-  __fractdqti
-  __fractdqsf
-  __fractdqdf
-  __fracttqqq2
-  __fracttqhq2
-  __fracttqsq2
-  __fracttqdq2
-  __fracttqha
-  __fracttqsa
-  __fracttqda
-  __fracttqta
-  __fracttquqq
-  __fracttquhq
-  __fracttqusq
-  __fracttqudq
-  __fracttqutq
-  __fracttquha
-  __fracttqusa
-  __fracttquda
-  __fracttquta
-  __fracttqqi
-  __fracttqhi
-  __fracttqsi
-  __fracttqdi
-  __fracttqti
-  __fracttqsf
-  __fracttqdf
-  __fracthaqq
-  __fracthahq
-  __fracthasq
-  __fracthadq
-  __fracthatq
-  __fracthasa2
-  __fracthada2
-  __fracthata2
-  __fracthauqq
-  __fracthauhq
-  __fracthausq
-  __fracthaudq
-  __fracthautq
-  __fracthauha
-  __fracthausa
-  __fracthauda
-  __fracthauta
-  __fracthaqi
-  __fracthahi
-  __fracthasi
-  __fracthadi
-  __fracthati
-  __fracthasf
-  __fracthadf
-  __fractsaqq
-  __fractsahq
-  __fractsasq
-  __fractsadq
-  __fractsatq
-  __fractsaha2
-  __fractsada2
-  __fractsata2
-  __fractsauqq
-  __fractsauhq
-  __fractsausq
-  __fractsaudq
-  __fractsautq
-  __fractsauha
-  __fractsausa
-  __fractsauda
-  __fractsauta
-  __fractsaqi
-  __fractsahi
-  __fractsasi
-  __fractsadi
-  __fractsati
-  __fractsasf
-  __fractsadf
-  __fractdaqq
-  __fractdahq
-  __fractdasq
-  __fractdadq
-  __fractdatq
-  __fractdaha2
-  __fractdasa2
-  __fractdata2
-  __fractdauqq
-  __fractdauhq
-  __fractdausq
-  __fractdaudq
-  __fractdautq
-  __fractdauha
-  __fractdausa
-  __fractdauda
-  __fractdauta
-  __fractdaqi
-  __fractdahi
-  __fractdasi
-  __fractdadi
-  __fractdati
-  __fractdasf
-  __fractdadf
-  __fracttaqq
-  __fracttahq
-  __fracttasq
-  __fracttadq
-  __fracttatq
-  __fracttaha2
-  __fracttasa2
-  __fracttada2
-  __fracttauqq
-  __fracttauhq
-  __fracttausq
-  __fracttaudq
-  __fracttautq
-  __fracttauha
-  __fracttausa
-  __fracttauda
-  __fracttauta
-  __fracttaqi
-  __fracttahi
-  __fracttasi
-  __fracttadi
-  __fracttati
-  __fracttasf
-  __fracttadf
-  __fractuqqqq
-  __fractuqqhq
-  __fractuqqsq
-  __fractuqqdq
-  __fractuqqtq
-  __fractuqqha
-  __fractuqqsa
-  __fractuqqda
-  __fractuqqta
-  __fractuqquhq2
-  __fractuqqusq2
-  __fractuqqudq2
-  __fractuqqutq2
-  __fractuqquha
-  __fractuqqusa
-  __fractuqquda
-  __fractuqquta
-  __fractuqqqi
-  __fractuqqhi
-  __fractuqqsi
-  __fractuqqdi
-  __fractuqqti
-  __fractuqqsf
-  __fractuqqdf
-  __fractuhqqq
-  __fractuhqhq
-  __fractuhqsq
-  __fractuhqdq
-  __fractuhqtq
-  __fractuhqha
-  __fractuhqsa
-  __fractuhqda
-  __fractuhqta
-  __fractuhquqq2
-  __fractuhqusq2
-  __fractuhqudq2
-  __fractuhqutq2
-  __fractuhquha
-  __fractuhqusa
-  __fractuhquda
-  __fractuhquta
-  __fractuhqqi
-  __fractuhqhi
-  __fractuhqsi
-  __fractuhqdi
-  __fractuhqti
-  __fractuhqsf
-  __fractuhqdf
-  __fractusqqq
-  __fractusqhq
-  __fractusqsq
-  __fractusqdq
-  __fractusqtq
-  __fractusqha
-  __fractusqsa
-  __fractusqda
-  __fractusqta
-  __fractusquqq2
-  __fractusquhq2
-  __fractusqudq2
-  __fractusqutq2
-  __fractusquha
-  __fractusqusa
-  __fractusquda
-  __fractusquta
-  __fractusqqi
-  __fractusqhi
-  __fractusqsi
-  __fractusqdi
-  __fractusqti
-  __fractusqsf
-  __fractusqdf
-  __fractudqqq
-  __fractudqhq
-  __fractudqsq
-  __fractudqdq
-  __fractudqtq
-  __fractudqha
-  __fractudqsa
-  __fractudqda
-  __fractudqta
-  __fractudquqq2
-  __fractudquhq2
-  __fractudqusq2
-  __fractudqutq2
-  __fractudquha
-  __fractudqusa
-  __fractudquda
-  __fractudquta
-  __fractudqqi
-  __fractudqhi
-  __fractudqsi
-  __fractudqdi
-  __fractudqti
-  __fractudqsf
-  __fractudqdf
-  __fractutqqq
-  __fractutqhq
-  __fractutqsq
-  __fractutqdq
-  __fractutqtq
-  __fractutqha
-  __fractutqsa
-  __fractutqda
-  __fractutqta
-  __fractutquqq2
-  __fractutquhq2
-  __fractutqusq2
-  __fractutqudq2
-  __fractutquha
-  __fractutqusa
-  __fractutquda
-  __fractutquta
-  __fractutqqi
-  __fractutqhi
-  __fractutqsi
-  __fractutqdi
-  __fractutqti
-  __fractutqsf
-  __fractutqdf
-  __fractuhaqq
-  __fractuhahq
-  __fractuhasq
-  __fractuhadq
-  __fractuhatq
-  __fractuhaha
-  __fractuhasa
-  __fractuhada
-  __fractuhata
-  __fractuhauqq
-  __fractuhauhq
-  __fractuhausq
-  __fractuhaudq
-  __fractuhautq
-  __fractuhausa2
-  __fractuhauda2
-  __fractuhauta2
-  __fractuhaqi
-  __fractuhahi
-  __fractuhasi
-  __fractuhadi
-  __fractuhati
-  __fractuhasf
-  __fractuhadf
-  __fractusaqq
-  __fractusahq
-  __fractusasq
-  __fractusadq
-  __fractusatq
-  __fractusaha
-  __fractusasa
-  __fractusada
-  __fractusata
-  __fractusauqq
-  __fractusauhq
-  __fractusausq
-  __fractusaudq
-  __fractusautq
-  __fractusauha2
-  __fractusauda2
-  __fractusauta2
-  __fractusaqi
-  __fractusahi
-  __fractusasi
-  __fractusadi
-  __fractusati
-  __fractusasf
-  __fractusadf
-  __fractudaqq
-  __fractudahq
-  __fractudasq
-  __fractudadq
-  __fractudatq
-  __fractudaha
-  __fractudasa
-  __fractudada
-  __fractudata
-  __fractudauqq
-  __fractudauhq
-  __fractudausq
-  __fractudaudq
-  __fractudautq
-  __fractudauha2
-  __fractudausa2
-  __fractudauta2
-  __fractudaqi
-  __fractudahi
-  __fractudasi
-  __fractudadi
-  __fractudati
-  __fractudasf
-  __fractudadf
-  __fractutaqq
-  __fractutahq
-  __fractutasq
-  __fractutadq
-  __fractutatq
-  __fractutaha
-  __fractutasa
-  __fractutada
-  __fractutata
-  __fractutauqq
-  __fractutauhq
-  __fractutausq
-  __fractutaudq
-  __fractutautq
-  __fractutauha2
-  __fractutausa2
-  __fractutauda2
-  __fractutaqi
-  __fractutahi
-  __fractutasi
-  __fractutadi
-  __fractutati
-  __fractutasf
-  __fractutadf
-  __fractqiqq
-  __fractqihq
-  __fractqisq
-  __fractqidq
-  __fractqitq
-  __fractqiha
-  __fractqisa
-  __fractqida
-  __fractqita
-  __fractqiuqq
-  __fractqiuhq
-  __fractqiusq
-  __fractqiudq
-  __fractqiutq
-  __fractqiuha
-  __fractqiusa
-  __fractqiuda
-  __fractqiuta
-  __fracthiqq
-  __fracthihq
-  __fracthisq
-  __fracthidq
-  __fracthitq
-  __fracthiha
-  __fracthisa
-  __fracthida
-  __fracthita
-  __fracthiuqq
-  __fracthiuhq
-  __fracthiusq
-  __fracthiudq
-  __fracthiutq
-  __fracthiuha
-  __fracthiusa
-  __fracthiuda
-  __fracthiuta
-  __fractsiqq
-  __fractsihq
-  __fractsisq
-  __fractsidq
-  __fractsitq
-  __fractsiha
-  __fractsisa
-  __fractsida
-  __fractsita
-  __fractsiuqq
-  __fractsiuhq
-  __fractsiusq
-  __fractsiudq
-  __fractsiutq
-  __fractsiuha
-  __fractsiusa
-  __fractsiuda
-  __fractsiuta
-  __fractdiqq
-  __fractdihq
-  __fractdisq
-  __fractdidq
-  __fractditq
-  __fractdiha
-  __fractdisa
-  __fractdida
-  __fractdita
-  __fractdiuqq
-  __fractdiuhq
-  __fractdiusq
-  __fractdiudq
-  __fractdiutq
-  __fractdiuha
-  __fractdiusa
-  __fractdiuda
-  __fractdiuta
-  __fracttiqq
-  __fracttihq
-  __fracttisq
-  __fracttidq
-  __fracttitq
-  __fracttiha
-  __fracttisa
-  __fracttida
-  __fracttita
-  __fracttiuqq
-  __fracttiuhq
-  __fracttiusq
-  __fracttiudq
-  __fracttiutq
-  __fracttiuha
-  __fracttiusa
-  __fracttiuda
-  __fracttiuta
-  __fractsfqq
-  __fractsfhq
-  __fractsfsq
-  __fractsfdq
-  __fractsftq
-  __fractsfha
-  __fractsfsa
-  __fractsfda
-  __fractsfta
-  __fractsfuqq
-  __fractsfuhq
-  __fractsfusq
-  __fractsfudq
-  __fractsfutq
-  __fractsfuha
-  __fractsfusa
-  __fractsfuda
-  __fractsfuta
-  __fractdfqq
-  __fractdfhq
-  __fractdfsq
-  __fractdfdq
-  __fractdftq
-  __fractdfha
-  __fractdfsa
-  __fractdfda
-  __fractdfta
-  __fractdfuqq
-  __fractdfuhq
-  __fractdfusq
-  __fractdfudq
-  __fractdfutq
-  __fractdfuha
-  __fractdfusa
-  __fractdfuda
-  __fractdfuta
-  __satfractqqhq2
-  __satfractqqsq2
-  __satfractqqdq2
-  __satfractqqtq2
-  __satfractqqha
-  __satfractqqsa
-  __satfractqqda
-  __satfractqqta
-  __satfractqquqq
-  __satfractqquhq
-  __satfractqqusq
-  __satfractqqudq
-  __satfractqqutq
-  __satfractqquha
-  __satfractqqusa
-  __satfractqquda
-  __satfractqquta
-  __satfracthqqq2
-  __satfracthqsq2
-  __satfracthqdq2
-  __satfracthqtq2
-  __satfracthqha
-  __satfracthqsa
-  __satfracthqda
-  __satfracthqta
-  __satfracthquqq
-  __satfracthquhq
-  __satfracthqusq
-  __satfracthqudq
-  __satfracthqutq
-  __satfracthquha
-  __satfracthqusa
-  __satfracthquda
-  __satfracthquta
-  __satfractsqqq2
-  __satfractsqhq2
-  __satfractsqdq2
-  __satfractsqtq2
-  __satfractsqha
-  __satfractsqsa
-  __satfractsqda
-  __satfractsqta
-  __satfractsquqq
-  __satfractsquhq
-  __satfractsqusq
-  __satfractsqudq
-  __satfractsqutq
-  __satfractsquha
-  __satfractsqusa
-  __satfractsquda
-  __satfractsquta
-  __satfractdqqq2
-  __satfractdqhq2
-  __satfractdqsq2
-  __satfractdqtq2
-  __satfractdqha
-  __satfractdqsa
-  __satfractdqda
-  __satfractdqta
-  __satfractdquqq
-  __satfractdquhq
-  __satfractdqusq
-  __satfractdqudq
-  __satfractdqutq
-  __satfractdquha
-  __satfractdqusa
-  __satfractdquda
-  __satfractdquta
-  __satfracttqqq2
-  __satfracttqhq2
-  __satfracttqsq2
-  __satfracttqdq2
-  __satfracttqha
-  __satfracttqsa
-  __satfracttqda
-  __satfracttqta
-  __satfracttquqq
-  __satfracttquhq
-  __satfracttqusq
-  __satfracttqudq
-  __satfracttqutq
-  __satfracttquha
-  __satfracttqusa
-  __satfracttquda
-  __satfracttquta
-  __satfracthaqq
-  __satfracthahq
-  __satfracthasq
-  __satfracthadq
-  __satfracthatq
-  __satfracthasa2
-  __satfracthada2
-  __satfracthata2
-  __satfracthauqq
-  __satfracthauhq
-  __satfracthausq
-  __satfracthaudq
-  __satfracthautq
-  __satfracthauha
-  __satfracthausa
-  __satfracthauda
-  __satfracthauta
-  __satfractsaqq
-  __satfractsahq
-  __satfractsasq
-  __satfractsadq
-  __satfractsatq
-  __satfractsaha2
-  __satfractsada2
-  __satfractsata2
-  __satfractsauqq
-  __satfractsauhq
-  __satfractsausq
-  __satfractsaudq
-  __satfractsautq
-  __satfractsauha
-  __satfractsausa
-  __satfractsauda
-  __satfractsauta
-  __satfractdaqq
-  __satfractdahq
-  __satfractdasq
-  __satfractdadq
-  __satfractdatq
-  __satfractdaha2
-  __satfractdasa2
-  __satfractdata2
-  __satfractdauqq
-  __satfractdauhq
-  __satfractdausq
-  __satfractdaudq
-  __satfractdautq
-  __satfractdauha
-  __satfractdausa
-  __satfractdauda
-  __satfractdauta
-  __satfracttaqq
-  __satfracttahq
-  __satfracttasq
-  __satfracttadq
-  __satfracttatq
-  __satfracttaha2
-  __satfracttasa2
-  __satfracttada2
-  __satfracttauqq
-  __satfracttauhq
-  __satfracttausq
-  __satfracttaudq
-  __satfracttautq
-  __satfracttauha
-  __satfracttausa
-  __satfracttauda
-  __satfracttauta
-  __satfractuqqqq
-  __satfractuqqhq
-  __satfractuqqsq
-  __satfractuqqdq
-  __satfractuqqtq
-  __satfractuqqha
-  __satfractuqqsa
-  __satfractuqqda
-  __satfractuqqta
-  __satfractuqquhq2
-  __satfractuqqusq2
-  __satfractuqqudq2
-  __satfractuqqutq2
-  __satfractuqquha
-  __satfractuqqusa
-  __satfractuqquda
-  __satfractuqquta
-  __satfractuhqqq
-  __satfractuhqhq
-  __satfractuhqsq
-  __satfractuhqdq
-  __satfractuhqtq
-  __satfractuhqha
-  __satfractuhqsa
-  __satfractuhqda
-  __satfractuhqta
-  __satfractuhquqq2
-  __satfractuhqusq2
-  __satfractuhqudq2
-  __satfractuhqutq2
-  __satfractuhquha
-  __satfractuhqusa
-  __satfractuhquda
-  __satfractuhquta
-  __satfractusqqq
-  __satfractusqhq
-  __satfractusqsq
-  __satfractusqdq
-  __satfractusqtq
-  __satfractusqha
-  __satfractusqsa
-  __satfractusqda
-  __satfractusqta
-  __satfractusquqq2
-  __satfractusquhq2
-  __satfractusqudq2
-  __satfractusqutq2
-  __satfractusquha
-  __satfractusqusa
-  __satfractusquda
-  __satfractusquta
-  __satfractudqqq
-  __satfractudqhq
-  __satfractudqsq
-  __satfractudqdq
-  __satfractudqtq
-  __satfractudqha
-  __satfractudqsa
-  __satfractudqda
-  __satfractudqta
-  __satfractudquqq2
-  __satfractudquhq2
-  __satfractudqusq2
-  __satfractudqutq2
-  __satfractudquha
-  __satfractudqusa
-  __satfractudquda
-  __satfractudquta
-  __satfractutqqq
-  __satfractutqhq
-  __satfractutqsq
-  __satfractutqdq
-  __satfractutqtq
-  __satfractutqha
-  __satfractutqsa
-  __satfractutqda
-  __satfractutqta
-  __satfractutquqq2
-  __satfractutquhq2
-  __satfractutqusq2
-  __satfractutqudq2
-  __satfractutquha
-  __satfractutqusa
-  __satfractutquda
-  __satfractutquta
-  __satfractuhaqq
-  __satfractuhahq
-  __satfractuhasq
-  __satfractuhadq
-  __satfractuhatq
-  __satfractuhaha
-  __satfractuhasa
-  __satfractuhada
-  __satfractuhata
-  __satfractuhauqq
-  __satfractuhauhq
-  __satfractuhausq
-  __satfractuhaudq
-  __satfractuhautq
-  __satfractuhausa2
-  __satfractuhauda2
-  __satfractuhauta2
-  __satfractusaqq
-  __satfractusahq
-  __satfractusasq
-  __satfractusadq
-  __satfractusatq
-  __satfractusaha
-  __satfractusasa
-  __satfractusada
-  __satfractusata
-  __satfractusauqq
-  __satfractusauhq
-  __satfractusausq
-  __satfractusaudq
-  __satfractusautq
-  __satfractusauha2
-  __satfractusauda2
-  __satfractusauta2
-  __satfractudaqq
-  __satfractudahq
-  __satfractudasq
-  __satfractudadq
-  __satfractudatq
-  __satfractudaha
-  __satfractudasa
-  __satfractudada
-  __satfractudata
-  __satfractudauqq
-  __satfractudauhq
-  __satfractudausq
-  __satfractudaudq
-  __satfractudautq
-  __satfractudauha2
-  __satfractudausa2
-  __satfractudauta2
-  __satfractutaqq
-  __satfractutahq
-  __satfractutasq
-  __satfractutadq
-  __satfractutatq
-  __satfractutaha
-  __satfractutasa
-  __satfractutada
-  __satfractutata
-  __satfractutauqq
-  __satfractutauhq
-  __satfractutausq
-  __satfractutaudq
-  __satfractutautq
-  __satfractutauha2
-  __satfractutausa2
-  __satfractutauda2
-  __satfractqiqq
-  __satfractqihq
-  __satfractqisq
-  __satfractqidq
-  __satfractqitq
-  __satfractqiha
-  __satfractqisa
-  __satfractqida
-  __satfractqita
-  __satfractqiuqq
-  __satfractqiuhq
-  __satfractqiusq
-  __satfractqiudq
-  __satfractqiutq
-  __satfractqiuha
-  __satfractqiusa
-  __satfractqiuda
-  __satfractqiuta
-  __satfracthiqq
-  __satfracthihq
-  __satfracthisq
-  __satfracthidq
-  __satfracthitq
-  __satfracthiha
-  __satfracthisa
-  __satfracthida
-  __satfracthita
-  __satfracthiuqq
-  __satfracthiuhq
-  __satfracthiusq
-  __satfracthiudq
-  __satfracthiutq
-  __satfracthiuha
-  __satfracthiusa
-  __satfracthiuda
-  __satfracthiuta
-  __satfractsiqq
-  __satfractsihq
-  __satfractsisq
-  __satfractsidq
-  __satfractsitq
-  __satfractsiha
-  __satfractsisa
-  __satfractsida
-  __satfractsita
-  __satfractsiuqq
-  __satfractsiuhq
-  __satfractsiusq
-  __satfractsiudq
-  __satfractsiutq
-  __satfractsiuha
-  __satfractsiusa
-  __satfractsiuda
-  __satfractsiuta
-  __satfractdiqq
-  __satfractdihq
-  __satfractdisq
-  __satfractdidq
-  __satfractditq
-  __satfractdiha
-  __satfractdisa
-  __satfractdida
-  __satfractdita
-  __satfractdiuqq
-  __satfractdiuhq
-  __satfractdiusq
-  __satfractdiudq
-  __satfractdiutq
-  __satfractdiuha
-  __satfractdiusa
-  __satfractdiuda
-  __satfractdiuta
-  __satfracttiqq
-  __satfracttihq
-  __satfracttisq
-  __satfracttidq
-  __satfracttitq
-  __satfracttiha
-  __satfracttisa
-  __satfracttida
-  __satfracttita
-  __satfracttiuqq
-  __satfracttiuhq
-  __satfracttiusq
-  __satfracttiudq
-  __satfracttiutq
-  __satfracttiuha
-  __satfracttiusa
-  __satfracttiuda
-  __satfracttiuta
-  __satfractsfqq
-  __satfractsfhq
-  __satfractsfsq
-  __satfractsfdq
-  __satfractsftq
-  __satfractsfha
-  __satfractsfsa
-  __satfractsfda
-  __satfractsfta
-  __satfractsfuqq
-  __satfractsfuhq
-  __satfractsfusq
-  __satfractsfudq
-  __satfractsfutq
-  __satfractsfuha
-  __satfractsfusa
-  __satfractsfuda
-  __satfractsfuta
-  __satfractdfqq
-  __satfractdfhq
-  __satfractdfsq
-  __satfractdfdq
-  __satfractdftq
-  __satfractdfha
-  __satfractdfsa
-  __satfractdfda
-  __satfractdfta
-  __satfractdfuqq
-  __satfractdfuhq
-  __satfractdfusq
-  __satfractdfudq
-  __satfractdfutq
-  __satfractdfuha
-  __satfractdfusa
-  __satfractdfuda
-  __satfractdfuta
-  __fractunsqqqi
-  __fractunsqqhi
-  __fractunsqqsi
-  __fractunsqqdi
-  __fractunsqqti
-  __fractunshqqi
-  __fractunshqhi
-  __fractunshqsi
-  __fractunshqdi
-  __fractunshqti
-  __fractunssqqi
-  __fractunssqhi
-  __fractunssqsi
-  __fractunssqdi
-  __fractunssqti
-  __fractunsdqqi
-  __fractunsdqhi
-  __fractunsdqsi
-  __fractunsdqdi
-  __fractunsdqti
-  __fractunstqqi
-  __fractunstqhi
-  __fractunstqsi
-  __fractunstqdi
-  __fractunstqti
-  __fractunshaqi
-  __fractunshahi
-  __fractunshasi
-  __fractunshadi
-  __fractunshati
-  __fractunssaqi
-  __fractunssahi
-  __fractunssasi
-  __fractunssadi
-  __fractunssati
-  __fractunsdaqi
-  __fractunsdahi
-  __fractunsdasi
-  __fractunsdadi
-  __fractunsdati
-  __fractunstaqi
-  __fractunstahi
-  __fractunstasi
-  __fractunstadi
-  __fractunstati
-  __fractunsuqqqi
-  __fractunsuqqhi
-  __fractunsuqqsi
-  __fractunsuqqdi
-  __fractunsuqqti
-  __fractunsuhqqi
-  __fractunsuhqhi
-  __fractunsuhqsi
-  __fractunsuhqdi
-  __fractunsuhqti
-  __fractunsusqqi
-  __fractunsusqhi
-  __fractunsusqsi
-  __fractunsusqdi
-  __fractunsusqti
-  __fractunsudqqi
-  __fractunsudqhi
-  __fractunsudqsi
-  __fractunsudqdi
-  __fractunsudqti
-  __fractunsutqqi
-  __fractunsutqhi
-  __fractunsutqsi
-  __fractunsutqdi
-  __fractunsutqti
-  __fractunsuhaqi
-  __fractunsuhahi
-  __fractunsuhasi
-  __fractunsuhadi
-  __fractunsuhati
-  __fractunsusaqi
-  __fractunsusahi
-  __fractunsusasi
-  __fractunsusadi
-  __fractunsusati
-  __fractunsudaqi
-  __fractunsudahi
-  __fractunsudasi
-  __fractunsudadi
-  __fractunsudati
-  __fractunsutaqi
-  __fractunsutahi
-  __fractunsutasi
-  __fractunsutadi
-  __fractunsutati
-  __fractunsqiqq
-  __fractunsqihq
-  __fractunsqisq
-  __fractunsqidq
-  __fractunsqitq
-  __fractunsqiha
-  __fractunsqisa
-  __fractunsqida
-  __fractunsqita
-  __fractunsqiuqq
-  __fractunsqiuhq
-  __fractunsqiusq
-  __fractunsqiudq
-  __fractunsqiutq
-  __fractunsqiuha
-  __fractunsqiusa
-  __fractunsqiuda
-  __fractunsqiuta
-  __fractunshiqq
-  __fractunshihq
-  __fractunshisq
-  __fractunshidq
-  __fractunshitq
-  __fractunshiha
-  __fractunshisa
-  __fractunshida
-  __fractunshita
-  __fractunshiuqq
-  __fractunshiuhq
-  __fractunshiusq
-  __fractunshiudq
-  __fractunshiutq
-  __fractunshiuha
-  __fractunshiusa
-  __fractunshiuda
-  __fractunshiuta
-  __fractunssiqq
-  __fractunssihq
-  __fractunssisq
-  __fractunssidq
-  __fractunssitq
-  __fractunssiha
-  __fractunssisa
-  __fractunssida
-  __fractunssita
-  __fractunssiuqq
-  __fractunssiuhq
-  __fractunssiusq
-  __fractunssiudq
-  __fractunssiutq
-  __fractunssiuha
-  __fractunssiusa
-  __fractunssiuda
-  __fractunssiuta
-  __fractunsdiqq
-  __fractunsdihq
-  __fractunsdisq
-  __fractunsdidq
-  __fractunsditq
-  __fractunsdiha
-  __fractunsdisa
-  __fractunsdida
-  __fractunsdita
-  __fractunsdiuqq
-  __fractunsdiuhq
-  __fractunsdiusq
-  __fractunsdiudq
-  __fractunsdiutq
-  __fractunsdiuha
-  __fractunsdiusa
-  __fractunsdiuda
-  __fractunsdiuta
-  __fractunstiqq
-  __fractunstihq
-  __fractunstisq
-  __fractunstidq
-  __fractunstitq
-  __fractunstiha
-  __fractunstisa
-  __fractunstida
-  __fractunstita
-  __fractunstiuqq
-  __fractunstiuhq
-  __fractunstiusq
-  __fractunstiudq
-  __fractunstiutq
-  __fractunstiuha
-  __fractunstiusa
-  __fractunstiuda
-  __fractunstiuta
-  __satfractunsqiqq
-  __satfractunsqihq
-  __satfractunsqisq
-  __satfractunsqidq
-  __satfractunsqitq
-  __satfractunsqiha
-  __satfractunsqisa
-  __satfractunsqida
-  __satfractunsqita
-  __satfractunsqiuqq
-  __satfractunsqiuhq
-  __satfractunsqiusq
-  __satfractunsqiudq
-  __satfractunsqiutq
-  __satfractunsqiuha
-  __satfractunsqiusa
-  __satfractunsqiuda
-  __satfractunsqiuta
-  __satfractunshiqq
-  __satfractunshihq
-  __satfractunshisq
-  __satfractunshidq
-  __satfractunshitq
-  __satfractunshiha
-  __satfractunshisa
-  __satfractunshida
-  __satfractunshita
-  __satfractunshiuqq
-  __satfractunshiuhq
-  __satfractunshiusq
-  __satfractunshiudq
-  __satfractunshiutq
-  __satfractunshiuha
-  __satfractunshiusa
-  __satfractunshiuda
-  __satfractunshiuta
-  __satfractunssiqq
-  __satfractunssihq
-  __satfractunssisq
-  __satfractunssidq
-  __satfractunssitq
-  __satfractunssiha
-  __satfractunssisa
-  __satfractunssida
-  __satfractunssita
-  __satfractunssiuqq
-  __satfractunssiuhq
-  __satfractunssiusq
-  __satfractunssiudq
-  __satfractunssiutq
-  __satfractunssiuha
-  __satfractunssiusa
-  __satfractunssiuda
-  __satfractunssiuta
-  __satfractunsdiqq
-  __satfractunsdihq
-  __satfractunsdisq
-  __satfractunsdidq
-  __satfractunsditq
-  __satfractunsdiha
-  __satfractunsdisa
-  __satfractunsdida
-  __satfractunsdita
-  __satfractunsdiuqq
-  __satfractunsdiuhq
-  __satfractunsdiusq
-  __satfractunsdiudq
-  __satfractunsdiutq
-  __satfractunsdiuha
-  __satfractunsdiusa
-  __satfractunsdiuda
-  __satfractunsdiuta
-  __satfractunstiqq
-  __satfractunstihq
-  __satfractunstisq
-  __satfractunstidq
-  __satfractunstitq
-  __satfractunstiha
-  __satfractunstisa
-  __satfractunstida
-  __satfractunstita
-  __satfractunstiuqq
-  __satfractunstiuhq
-  __satfractunstiusq
-  __satfractunstiudq
-  __satfractunstiutq
-  __satfractunstiuha
-  __satfractunstiusa
-  __satfractunstiuda
-  __satfractunstiuta
-}
-
-%inherit GCC_4.4.0 GCC_4.3.0
-GCC_4.4.0 {
-  __sync_fetch_and_add_1
-  __sync_fetch_and_sub_1
-  __sync_fetch_and_or_1
-  __sync_fetch_and_and_1
-  __sync_fetch_and_xor_1
-  __sync_fetch_and_nand_1
-  __sync_add_and_fetch_1
-  __sync_sub_and_fetch_1
-  __sync_or_and_fetch_1
-  __sync_and_and_fetch_1
-  __sync_xor_and_fetch_1
-  __sync_nand_and_fetch_1
-  __sync_bool_compare_and_swap_1
-  __sync_val_compare_and_swap_1
-  __sync_lock_test_and_set_1
-
-  __sync_fetch_and_add_2
-  __sync_fetch_and_sub_2
-  __sync_fetch_and_or_2
-  __sync_fetch_and_and_2
-  __sync_fetch_and_xor_2
-  __sync_fetch_and_nand_2
-  __sync_add_and_fetch_2
-  __sync_sub_and_fetch_2
-  __sync_or_and_fetch_2
-  __sync_and_and_fetch_2
-  __sync_xor_and_fetch_2
-  __sync_nand_and_fetch_2
-  __sync_bool_compare_and_swap_2
-  __sync_val_compare_and_swap_2
-  __sync_lock_test_and_set_2
-
-  __sync_fetch_and_add_4
-  __sync_fetch_and_sub_4
-  __sync_fetch_and_or_4
-  __sync_fetch_and_and_4
-  __sync_fetch_and_xor_4
-  __sync_fetch_and_nand_4
-  __sync_add_and_fetch_4
-  __sync_sub_and_fetch_4
-  __sync_or_and_fetch_4
-  __sync_and_and_fetch_4
-  __sync_xor_and_fetch_4
-  __sync_nand_and_fetch_4
-  __sync_bool_compare_and_swap_4
-  __sync_val_compare_and_swap_4
-  __sync_lock_test_and_set_4
-
-  __sync_fetch_and_add_8
-  __sync_fetch_and_sub_8
-  __sync_fetch_and_or_8
-  __sync_fetch_and_and_8
-  __sync_fetch_and_xor_8
-  __sync_fetch_and_nand_8
-  __sync_add_and_fetch_8
-  __sync_sub_and_fetch_8
-  __sync_or_and_fetch_8
-  __sync_and_and_fetch_8
-  __sync_xor_and_fetch_8
-  __sync_nand_and_fetch_8
-  __sync_bool_compare_and_swap_8
-  __sync_val_compare_and_swap_8
-  __sync_lock_test_and_set_8
-
-  __sync_fetch_and_add_16
-  __sync_fetch_and_sub_16
-  __sync_fetch_and_or_16
-  __sync_fetch_and_and_16
-  __sync_fetch_and_xor_16
-  __sync_fetch_and_nand_16
-  __sync_add_and_fetch_16
-  __sync_sub_and_fetch_16
-  __sync_or_and_fetch_16
-  __sync_and_and_fetch_16
-  __sync_xor_and_fetch_16
-  __sync_nand_and_fetch_16
-  __sync_bool_compare_and_swap_16
-  __sync_val_compare_and_swap_16
-  __sync_lock_test_and_set_16
-
-  __sync_synchronize
-}
-
-%inherit GCC_4.5.0 GCC_4.4.0
-GCC_4.5.0 {
-  __unordxf2
-  __unordtf2
-}
-
-%inherit GCC_4.6.0 GCC_4.5.0
-GCC_4.6.0 {
-  __morestack_segments
-  __morestack_current_segment
-  __morestack_initial_sp
-  __splitstack_find
-}
Index: trunk/libgcc/libgcc-std.ver.in
===================================================================
--- /dev/null
+++ trunk/libgcc/libgcc-std.ver.in
@@ -0,0 +1,1922 @@
+# Copyright (C) 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
+# 2008, 2010 Free Software Foundation, Inc.
+#
+# This file is part of GCC.
+#
+# GCC is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3, or (at your option)
+# any later version.
+#
+# GCC is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+GCC_3.0 {
+  # libgcc1 integer symbols
+  __PFX__absvsi2
+  __PFX__addvsi3
+  __PFX__ashlsi3
+  __PFX__ashrsi3
+  __PFX__divsi3
+  __PFX__lshrsi3
+  __PFX__modsi3
+  __PFX__mulsi3
+  __PFX__mulvsi3
+  __PFX__negvsi2
+  __PFX__subvsi3
+  __PFX__udivsi3
+  __PFX__umodsi3
+
+  # libgcc1 floating point symbols
+  __PFX__addsf3
+  __PFX__adddf3
+  __PFX__addxf3
+  __PFX__addtf3
+  __PFX__divsf3
+  __PFX__divdf3
+  __PFX__divxf3
+  __PFX__divtf3
+  __PFX__eqsf2
+  __PFX__eqdf2
+  __PFX__eqxf2
+  __PFX__eqtf2
+  __PFX__extenddfxf2
+  __PFX__extenddftf2
+  __PFX__extendsfdf2
+  __PFX__extendsfxf2
+  __PFX__extendsftf2
+  __PFX__fixsfsi
+  __PFX__fixdfsi
+  __PFX__fixxfsi
+  __PFX__fixtfsi
+  __PFX__floatsisf
+  __PFX__floatsidf
+  __PFX__floatsixf
+  __PFX__floatsitf
+  __PFX__gesf2
+  __PFX__gedf2
+  __PFX__gexf2
+  __PFX__getf2
+  __PFX__gtsf2
+  __PFX__gtdf2
+  __PFX__gtxf2
+  __PFX__gttf2
+  __PFX__lesf2
+  __PFX__ledf2
+  __PFX__lexf2
+  __PFX__letf2
+  __PFX__ltsf2
+  __PFX__ltdf2
+  __PFX__ltxf2
+  __PFX__lttf2
+  __PFX__mulsf3
+  __PFX__muldf3
+  __PFX__mulxf3
+  __PFX__multf3
+  __PFX__negsf2
+  __PFX__negdf2
+  __PFX__negxf2
+  __PFX__negtf2
+  __PFX__nesf2
+  __PFX__nedf2
+  __PFX__nexf2
+  __PFX__netf2
+  __PFX__subsf3
+  __PFX__subdf3
+  __PFX__subxf3
+  __PFX__subtf3
+  __PFX__truncdfsf2
+  __PFX__truncxfsf2
+  __PFX__trunctfsf2
+  __PFX__truncxfdf2
+  __PFX__trunctfdf2
+
+  # libgcc2 DImode arithmetic (for 32-bit targets).
+  __PFX__absvdi2
+  __PFX__addvdi3
+  __PFX__ashldi3
+  __PFX__ashrdi3
+  __PFX__cmpdi2
+  __PFX__divdi3
+  __PFX__ffsdi2
+  __PFX__fixdfdi
+  __PFX__fixsfdi
+  __PFX__fixtfdi
+  __PFX__fixxfdi
+  __PFX__fixunsdfdi
+  __PFX__fixunsdfsi
+  __PFX__fixunssfsi
+  __PFX__fixunssfdi
+  __PFX__fixunstfdi
+  __PFX__fixunstfsi
+  __PFX__fixunsxfdi
+  __PFX__fixunsxfsi
+  __PFX__floatdidf
+  __PFX__floatdisf
+  __PFX__floatdixf
+  __PFX__floatditf
+  __PFX__lshrdi3
+  __PFX__moddi3
+  __PFX__muldi3
+  __PFX__mulvdi3
+  __PFX__negdi2
+  __PFX__negvdi2
+  __PFX__subvdi3
+  __PFX__ucmpdi2
+  __PFX__udivdi3
+  __PFX__udivmoddi4
+  __PFX__umoddi3
+
+  # libgcc2 TImode arithmetic (for 64-bit targets).
+  __PFX__ashlti3
+  __PFX__ashrti3
+  __PFX__cmpti2
+  __PFX__divti3
+  __PFX__ffsti2
+  __PFX__fixdfti
+  __PFX__fixsfti
+  __PFX__fixtfti
+  __PFX__fixxfti
+  __PFX__lshrti3
+  __PFX__modti3
+  __PFX__multi3
+  __PFX__negti2
+  __PFX__ucmpti2
+  __PFX__udivmodti4
+  __PFX__udivti3
+  __PFX__umodti3
+  __PFX__fixunsdfti
+  __PFX__fixunssfti
+  __PFX__fixunstfti
+  __PFX__fixunsxfti
+  __PFX__floattidf
+  __PFX__floattisf
+  __PFX__floattixf
+  __PFX__floattitf
+
+  # Used to deal with trampoline initialization on some platforms
+  __PFX__clear_cache
+
+  # EH symbols
+  _Unwind_DeleteException
+  _Unwind_Find_FDE
+  _Unwind_ForcedUnwind
+  _Unwind_GetGR
+  _Unwind_GetIP
+  _Unwind_GetLanguageSpecificData
+  _Unwind_GetRegionStart
+  _Unwind_GetTextRelBase
+  _Unwind_GetDataRelBase
+  _Unwind_RaiseException
+  _Unwind_Resume
+  _Unwind_SetGR
+  _Unwind_SetIP
+  __deregister_frame
+  __deregister_frame_info
+  __deregister_frame_info_bases
+  __register_frame
+  __register_frame_info
+  __register_frame_info_bases
+  __register_frame_info_table
+  __register_frame_info_table_bases
+  __register_frame_table
+
+  # SjLj EH symbols
+  _Unwind_SjLj_Register
+  _Unwind_SjLj_Unregister
+  _Unwind_SjLj_RaiseException
+  _Unwind_SjLj_ForcedUnwind
+  _Unwind_SjLj_Resume
+}
+
+%inherit GCC_3.3 GCC_3.0
+GCC_3.3 {
+  _Unwind_FindEnclosingFunction
+  _Unwind_GetCFA
+  _Unwind_Backtrace
+  _Unwind_Resume_or_Rethrow
+  _Unwind_SjLj_Resume_or_Rethrow
+}
+
+%inherit GCC_3.3.1 GCC_3.3
+GCC_3.3.1 {
+  __gcc_personality_sj0
+  __gcc_personality_v0
+}
+
+%inherit GCC_3.3.2 GCC_3.3.1
+GCC_3.3.2 {
+}
+
+%inherit GCC_3.3.4 GCC_3.3.2
+GCC_3.3.4 {
+  __PFX__unorddf2
+  __PFX__unordsf2
+}
+
+%inherit GCC_3.4 GCC_3.3.4
+GCC_3.4 {
+  # bit scanning and counting built-ins
+  __PFX__clzsi2
+  __PFX__clzdi2
+  __PFX__clzti2
+  __PFX__ctzsi2
+  __PFX__ctzdi2
+  __PFX__ctzti2
+  __PFX__popcountsi2
+  __PFX__popcountdi2
+  __PFX__popcountti2
+  __PFX__paritysi2
+  __PFX__paritydi2
+  __PFX__parityti2
+}
+
+%inherit GCC_3.4.2 GCC_3.4
+GCC_3.4.2 {
+  # Used to deal with trampoline initialization on some platforms
+  __PFX__enable_execute_stack
+  __trampoline_setup
+}
+
+%inherit GCC_3.4.4 GCC_3.4.2
+GCC_3.4.4 {
+  # libgcc2 TImode arithmetic (for 64-bit targets).
+  __PFX__absvti2
+  __PFX__addvti3
+  __PFX__mulvti3
+  __PFX__negvti2
+  __PFX__subvti3
+}
+
+%inherit GCC_4.0.0 GCC_3.4.4
+GCC_4.0.0 {
+  # libgcc2 __builtin_powi helpers.
+  __PFX__powisf2
+  __PFX__powidf2
+  __PFX__powixf2
+  __PFX__powitf2
+
+  # c99 compliant complex arithmetic
+  __PFX__divsc3
+  __PFX__divdc3
+  __PFX__divxc3
+  __PFX__divtc3
+  __PFX__mulsc3
+  __PFX__muldc3
+  __PFX__mulxc3
+  __PFX__multc3
+}
+
+%inherit GCC_4.1.0 GCC_4.0.0
+GCC_4.1.0 {
+}
+
+%inherit GCC_4.2.0 GCC_4.1.0
+GCC_4.2.0 {
+  # unsigned-to-floating conversions
+  __PFX__floatunsisf
+  __PFX__floatunsidf
+  __PFX__floatunsixf
+  __PFX__floatunsitf
+  __PFX__floatundidf
+  __PFX__floatundisf
+  __PFX__floatundixf
+  __PFX__floatunditf
+  __PFX__floatuntidf
+  __PFX__floatuntisf
+  __PFX__floatuntixf
+  __PFX__floatuntitf
+  _Unwind_GetIPInfo
+}
+
+%inherit GCC_4.3.0 GCC_4.2.0
+GCC_4.3.0 {
+  # byte swapping routines
+  __PFX__bswapsi2
+  __PFX__bswapdi2
+
+  __emutls_get_address
+  __emutls_register_common
+  __PFX__ffssi2
+  __PFX__extendxftf2
+  __PFX__trunctfxf2
+
+  # fixed-point routines
+  __PFX__addqq3
+  __PFX__addhq3
+  __PFX__addsq3
+  __PFX__adddq3
+  __PFX__addtq3
+  __PFX__adduqq3
+  __PFX__adduhq3
+  __PFX__addusq3
+  __PFX__addudq3
+  __PFX__addutq3
+  __PFX__addha3
+  __PFX__addsa3
+  __PFX__addda3
+  __PFX__addta3
+  __PFX__adduha3
+  __PFX__addusa3
+  __PFX__adduda3
+  __PFX__adduta3
+  __PFX__ssaddqq3
+  __PFX__ssaddhq3
+  __PFX__ssaddsq3
+  __PFX__ssadddq3
+  __PFX__ssaddtq3
+  __PFX__ssaddha3
+  __PFX__ssaddsa3
+  __PFX__ssaddda3
+  __PFX__ssaddta3
+  __PFX__usadduqq3
+  __PFX__usadduhq3
+  __PFX__usaddusq3
+  __PFX__usaddudq3
+  __PFX__usaddutq3
+  __PFX__usadduha3
+  __PFX__usaddusa3
+  __PFX__usadduda3
+  __PFX__usadduta3
+  __PFX__subqq3
+  __PFX__subhq3
+  __PFX__subsq3
+  __PFX__subdq3
+  __PFX__subtq3
+  __PFX__subuqq3
+  __PFX__subuhq3
+  __PFX__subusq3
+  __PFX__subudq3
+  __PFX__subutq3
+  __PFX__subha3
+  __PFX__subsa3
+  __PFX__subda3
+  __PFX__subta3
+  __PFX__subuha3
+  __PFX__subusa3
+  __PFX__subuda3
+  __PFX__subuta3
+  __PFX__sssubqq3
+  __PFX__sssubhq3
+  __PFX__sssubsq3
+  __PFX__sssubdq3
+  __PFX__sssubtq3
+  __PFX__sssubha3
+  __PFX__sssubsa3
+  __PFX__sssubda3
+  __PFX__sssubta3
+  __PFX__ussubuqq3
+  __PFX__ussubuhq3
+  __PFX__ussubusq3
+  __PFX__ussubudq3
+  __PFX__ussubutq3
+  __PFX__ussubuha3
+  __PFX__ussubusa3
+  __PFX__ussubuda3
+  __PFX__ussubuta3
+  __PFX__mulqq3
+  __PFX__mulhq3
+  __PFX__mulsq3
+  __PFX__muldq3
+  __PFX__multq3
+  __PFX__muluqq3
+  __PFX__muluhq3
+  __PFX__mulusq3
+  __PFX__muludq3
+  __PFX__mulutq3
+  __PFX__mulha3
+  __PFX__mulsa3
+  __PFX__mulda3
+  __PFX__multa3
+  __PFX__muluha3
+  __PFX__mulusa3
+  __PFX__muluda3
+  __PFX__muluta3
+  __PFX__ssmulqq3
+  __PFX__ssmulhq3
+  __PFX__ssmulsq3
+  __PFX__ssmuldq3
+  __PFX__ssmultq3
+  __PFX__ssmulha3
+  __PFX__ssmulsa3
+  __PFX__ssmulda3
+  __PFX__ssmulta3
+  __PFX__usmuluqq3
+  __PFX__usmuluhq3
+  __PFX__usmulusq3
+  __PFX__usmuludq3
+  __PFX__usmulutq3
+  __PFX__usmuluha3
+  __PFX__usmulusa3
+  __PFX__usmuluda3
+  __PFX__usmuluta3
+  __PFX__divqq3
+  __PFX__divhq3
+  __PFX__divsq3
+  __PFX__divdq3
+  __PFX__divtq3
+  __PFX__divha3
+  __PFX__divsa3
+  __PFX__divda3
+  __PFX__divta3
+  __PFX__udivuqq3
+  __PFX__udivuhq3
+  __PFX__udivusq3
+  __PFX__udivudq3
+  __PFX__udivutq3
+  __PFX__udivuha3
+  __PFX__udivusa3
+  __PFX__udivuda3
+  __PFX__udivuta3
+  __PFX__ssdivqq3
+  __PFX__ssdivhq3
+  __PFX__ssdivsq3
+  __PFX__ssdivdq3
+  __PFX__ssdivtq3
+  __PFX__ssdivha3
+  __PFX__ssdivsa3
+  __PFX__ssdivda3
+  __PFX__ssdivta3
+  __PFX__usdivuqq3
+  __PFX__usdivuhq3
+  __PFX__usdivusq3
+  __PFX__usdivudq3
+  __PFX__usdivutq3
+  __PFX__usdivuha3
+  __PFX__usdivusa3
+  __PFX__usdivuda3
+  __PFX__usdivuta3
+  __PFX__negqq2
+  __PFX__neghq2
+  __PFX__negsq2
+  __PFX__negdq2
+  __PFX__negtq2
+  __PFX__neguqq2
+  __PFX__neguhq2
+  __PFX__negusq2
+  __PFX__negudq2
+  __PFX__negutq2
+  __PFX__negha2
+  __PFX__negsa2
+  __PFX__negda2
+  __PFX__negta2
+  __PFX__neguha2
+  __PFX__negusa2
+  __PFX__neguda2
+  __PFX__neguta2
+  __PFX__ssnegqq2
+  __PFX__ssneghq2
+  __PFX__ssnegsq2
+  __PFX__ssnegdq2
+  __PFX__ssnegtq2
+  __PFX__ssnegha2
+  __PFX__ssnegsa2
+  __PFX__ssnegda2
+  __PFX__ssnegta2
+  __PFX__usneguqq2
+  __PFX__usneguhq2
+  __PFX__usnegusq2
+  __PFX__usnegudq2
+  __PFX__usnegutq2
+  __PFX__usneguha2
+  __PFX__usnegusa2
+  __PFX__usneguda2
+  __PFX__usneguta2
+  __PFX__ashlqq3
+  __PFX__ashlhq3
+  __PFX__ashlsq3
+  __PFX__ashldq3
+  __PFX__ashltq3
+  __PFX__ashluqq3
+  __PFX__ashluhq3
+  __PFX__ashlusq3
+  __PFX__ashludq3
+  __PFX__ashlutq3
+  __PFX__ashlha3
+  __PFX__ashlsa3
+  __PFX__ashlda3
+  __PFX__ashlta3
+  __PFX__ashluha3
+  __PFX__ashlusa3
+  __PFX__ashluda3
+  __PFX__ashluta3
+  __PFX__ashrqq3
+  __PFX__ashrhq3
+  __PFX__ashrsq3
+  __PFX__ashrdq3
+  __PFX__ashrtq3
+  __PFX__ashrha3
+  __PFX__ashrsa3
+  __PFX__ashrda3
+  __PFX__ashrta3
+  __PFX__lshruqq3
+  __PFX__lshruhq3
+  __PFX__lshrusq3
+  __PFX__lshrudq3
+  __PFX__lshrutq3
+  __PFX__lshruha3
+  __PFX__lshrusa3
+  __PFX__lshruda3
+  __PFX__lshruta3
+  __PFX__ssashlqq3
+  __PFX__ssashlhq3
+  __PFX__ssashlsq3
+  __PFX__ssashldq3
+  __PFX__ssashltq3
+  __PFX__ssashlha3
+  __PFX__ssashlsa3
+  __PFX__ssashlda3
+  __PFX__ssashlta3
+  __PFX__usashluqq3
+  __PFX__usashluhq3
+  __PFX__usashlusq3
+  __PFX__usashludq3
+  __PFX__usashlutq3
+  __PFX__usashluha3
+  __PFX__usashlusa3
+  __PFX__usashluda3
+  __PFX__usashluta3
+  __PFX__cmpqq2
+  __PFX__cmphq2
+  __PFX__cmpsq2
+  __PFX__cmpdq2
+  __PFX__cmptq2
+  __PFX__cmpuqq2
+  __PFX__cmpuhq2
+  __PFX__cmpusq2
+  __PFX__cmpudq2
+  __PFX__cmputq2
+  __PFX__cmpha2
+  __PFX__cmpsa2
+  __PFX__cmpda2
+  __PFX__cmpta2
+  __PFX__cmpuha2
+  __PFX__cmpusa2
+  __PFX__cmpuda2
+  __PFX__cmputa2
+  __PFX__fractqqhq2
+  __PFX__fractqqsq2
+  __PFX__fractqqdq2
+  __PFX__fractqqtq2
+  __PFX__fractqqha
+  __PFX__fractqqsa
+  __PFX__fractqqda
+  __PFX__fractqqta
+  __PFX__fractqquqq
+  __PFX__fractqquhq
+  __PFX__fractqqusq
+  __PFX__fractqqudq
+  __PFX__fractqqutq
+  __PFX__fractqquha
+  __PFX__fractqqusa
+  __PFX__fractqquda
+  __PFX__fractqquta
+  __PFX__fractqqqi
+  __PFX__fractqqhi
+  __PFX__fractqqsi
+  __PFX__fractqqdi
+  __PFX__fractqqti
+  __PFX__fractqqsf
+  __PFX__fractqqdf
+  __PFX__fracthqqq2
+  __PFX__fracthqsq2
+  __PFX__fracthqdq2
+  __PFX__fracthqtq2
+  __PFX__fracthqha
+  __PFX__fracthqsa
+  __PFX__fracthqda
+  __PFX__fracthqta
+  __PFX__fracthquqq
+  __PFX__fracthquhq
+  __PFX__fracthqusq
+  __PFX__fracthqudq
+  __PFX__fracthqutq
+  __PFX__fracthquha
+  __PFX__fracthqusa
+  __PFX__fracthquda
+  __PFX__fracthquta
+  __PFX__fracthqqi
+  __PFX__fracthqhi
+  __PFX__fracthqsi
+  __PFX__fracthqdi
+  __PFX__fracthqti
+  __PFX__fracthqsf
+  __PFX__fracthqdf
+  __PFX__fractsqqq2
+  __PFX__fractsqhq2
+  __PFX__fractsqdq2
+  __PFX__fractsqtq2
+  __PFX__fractsqha
+  __PFX__fractsqsa
+  __PFX__fractsqda
+  __PFX__fractsqta
+  __PFX__fractsquqq
+  __PFX__fractsquhq
+  __PFX__fractsqusq
+  __PFX__fractsqudq
+  __PFX__fractsqutq
+  __PFX__fractsquha
+  __PFX__fractsqusa
+  __PFX__fractsquda
+  __PFX__fractsquta
+  __PFX__fractsqqi
+  __PFX__fractsqhi
+  __PFX__fractsqsi
+  __PFX__fractsqdi
+  __PFX__fractsqti
+  __PFX__fractsqsf
+  __PFX__fractsqdf
+  __PFX__fractdqqq2
+  __PFX__fractdqhq2
+  __PFX__fractdqsq2
+  __PFX__fractdqtq2
+  __PFX__fractdqha
+  __PFX__fractdqsa
+  __PFX__fractdqda
+  __PFX__fractdqta
+  __PFX__fractdquqq
+  __PFX__fractdquhq
+  __PFX__fractdqusq
+  __PFX__fractdqudq
+  __PFX__fractdqutq
+  __PFX__fractdquha
+  __PFX__fractdqusa
+  __PFX__fractdquda
+  __PFX__fractdquta
+  __PFX__fractdqqi
+  __PFX__fractdqhi
+  __PFX__fractdqsi
+  __PFX__fractdqdi
+  __PFX__fractdqti
+  __PFX__fractdqsf
+  __PFX__fractdqdf
+  __PFX__fracttqqq2
+  __PFX__fracttqhq2
+  __PFX__fracttqsq2
+  __PFX__fracttqdq2
+  __PFX__fracttqha
+  __PFX__fracttqsa
+  __PFX__fracttqda
+  __PFX__fracttqta
+  __PFX__fracttquqq
+  __PFX__fracttquhq
+  __PFX__fracttqusq
+  __PFX__fracttqudq
+  __PFX__fracttqutq
+  __PFX__fracttquha
+  __PFX__fracttqusa
+  __PFX__fracttquda
+  __PFX__fracttquta
+  __PFX__fracttqqi
+  __PFX__fracttqhi
+  __PFX__fracttqsi
+  __PFX__fracttqdi
+  __PFX__fracttqti
+  __PFX__fracttqsf
+  __PFX__fracttqdf
+  __PFX__fracthaqq
+  __PFX__fracthahq
+  __PFX__fracthasq
+  __PFX__fracthadq
+  __PFX__fracthatq
+  __PFX__fracthasa2
+  __PFX__fracthada2
+  __PFX__fracthata2
+  __PFX__fracthauqq
+  __PFX__fracthauhq
+  __PFX__fracthausq
+  __PFX__fracthaudq
+  __PFX__fracthautq
+  __PFX__fracthauha
+  __PFX__fracthausa
+  __PFX__fracthauda
+  __PFX__fracthauta
+  __PFX__fracthaqi
+  __PFX__fracthahi
+  __PFX__fracthasi
+  __PFX__fracthadi
+  __PFX__fracthati
+  __PFX__fracthasf
+  __PFX__fracthadf
+  __PFX__fractsaqq
+  __PFX__fractsahq
+  __PFX__fractsasq
+  __PFX__fractsadq
+  __PFX__fractsatq
+  __PFX__fractsaha2
+  __PFX__fractsada2
+  __PFX__fractsata2
+  __PFX__fractsauqq
+  __PFX__fractsauhq
+  __PFX__fractsausq
+  __PFX__fractsaudq
+  __PFX__fractsautq
+  __PFX__fractsauha
+  __PFX__fractsausa
+  __PFX__fractsauda
+  __PFX__fractsauta
+  __PFX__fractsaqi
+  __PFX__fractsahi
+  __PFX__fractsasi
+  __PFX__fractsadi
+  __PFX__fractsati
+  __PFX__fractsasf
+  __PFX__fractsadf
+  __PFX__fractdaqq
+  __PFX__fractdahq
+  __PFX__fractdasq
+  __PFX__fractdadq
+  __PFX__fractdatq
+  __PFX__fractdaha2
+  __PFX__fractdasa2
+  __PFX__fractdata2
+  __PFX__fractdauqq
+  __PFX__fractdauhq
+  __PFX__fractdausq
+  __PFX__fractdaudq
+  __PFX__fractdautq
+  __PFX__fractdauha
+  __PFX__fractdausa
+  __PFX__fractdauda
+  __PFX__fractdauta
+  __PFX__fractdaqi
+  __PFX__fractdahi
+  __PFX__fractdasi
+  __PFX__fractdadi
+  __PFX__fractdati
+  __PFX__fractdasf
+  __PFX__fractdadf
+  __PFX__fracttaqq
+  __PFX__fracttahq
+  __PFX__fracttasq
+  __PFX__fracttadq
+  __PFX__fracttatq
+  __PFX__fracttaha2
+  __PFX__fracttasa2
+  __PFX__fracttada2
+  __PFX__fracttauqq
+  __PFX__fracttauhq
+  __PFX__fracttausq
+  __PFX__fracttaudq
+  __PFX__fracttautq
+  __PFX__fracttauha
+  __PFX__fracttausa
+  __PFX__fracttauda
+  __PFX__fracttauta
+  __PFX__fracttaqi
+  __PFX__fracttahi
+  __PFX__fracttasi
+  __PFX__fracttadi
+  __PFX__fracttati
+  __PFX__fracttasf
+  __PFX__fracttadf
+  __PFX__fractuqqqq
+  __PFX__fractuqqhq
+  __PFX__fractuqqsq
+  __PFX__fractuqqdq
+  __PFX__fractuqqtq
+  __PFX__fractuqqha
+  __PFX__fractuqqsa
+  __PFX__fractuqqda
+  __PFX__fractuqqta
+  __PFX__fractuqquhq2
+  __PFX__fractuqqusq2
+  __PFX__fractuqqudq2
+  __PFX__fractuqqutq2
+  __PFX__fractuqquha
+  __PFX__fractuqqusa
+  __PFX__fractuqquda
+  __PFX__fractuqquta
+  __PFX__fractuqqqi
+  __PFX__fractuqqhi
+  __PFX__fractuqqsi
+  __PFX__fractuqqdi
+  __PFX__fractuqqti
+  __PFX__fractuqqsf
+  __PFX__fractuqqdf
+  __PFX__fractuhqqq
+  __PFX__fractuhqhq
+  __PFX__fractuhqsq
+  __PFX__fractuhqdq
+  __PFX__fractuhqtq
+  __PFX__fractuhqha
+  __PFX__fractuhqsa
+  __PFX__fractuhqda
+  __PFX__fractuhqta
+  __PFX__fractuhquqq2
+  __PFX__fractuhqusq2
+  __PFX__fractuhqudq2
+  __PFX__fractuhqutq2
+  __PFX__fractuhquha
+  __PFX__fractuhqusa
+  __PFX__fractuhquda
+  __PFX__fractuhquta
+  __PFX__fractuhqqi
+  __PFX__fractuhqhi
+  __PFX__fractuhqsi
+  __PFX__fractuhqdi
+  __PFX__fractuhqti
+  __PFX__fractuhqsf
+  __PFX__fractuhqdf
+  __PFX__fractusqqq
+  __PFX__fractusqhq
+  __PFX__fractusqsq
+  __PFX__fractusqdq
+  __PFX__fractusqtq
+  __PFX__fractusqha
+  __PFX__fractusqsa
+  __PFX__fractusqda
+  __PFX__fractusqta
+  __PFX__fractusquqq2
+  __PFX__fractusquhq2
+  __PFX__fractusqudq2
+  __PFX__fractusqutq2
+  __PFX__fractusquha
+  __PFX__fractusqusa
+  __PFX__fractusquda
+  __PFX__fractusquta
+  __PFX__fractusqqi
+  __PFX__fractusqhi
+  __PFX__fractusqsi
+  __PFX__fractusqdi
+  __PFX__fractusqti
+  __PFX__fractusqsf
+  __PFX__fractusqdf
+  __PFX__fractudqqq
+  __PFX__fractudqhq
+  __PFX__fractudqsq
+  __PFX__fractudqdq
+  __PFX__fractudqtq
+  __PFX__fractudqha
+  __PFX__fractudqsa
+  __PFX__fractudqda
+  __PFX__fractudqta
+  __PFX__fractudquqq2
+  __PFX__fractudquhq2
+  __PFX__fractudqusq2
+  __PFX__fractudqutq2
+  __PFX__fractudquha
+  __PFX__fractudqusa
+  __PFX__fractudquda
+  __PFX__fractudquta
+  __PFX__fractudqqi
+  __PFX__fractudqhi
+  __PFX__fractudqsi
+  __PFX__fractudqdi
+  __PFX__fractudqti
+  __PFX__fractudqsf
+  __PFX__fractudqdf
+  __PFX__fractutqqq
+  __PFX__fractutqhq
+  __PFX__fractutqsq
+  __PFX__fractutqdq
+  __PFX__fractutqtq
+  __PFX__fractutqha
+  __PFX__fractutqsa
+  __PFX__fractutqda
+  __PFX__fractutqta
+  __PFX__fractutquqq2
+  __PFX__fractutquhq2
+  __PFX__fractutqusq2
+  __PFX__fractutqudq2
+  __PFX__fractutquha
+  __PFX__fractutqusa
+  __PFX__fractutquda
+  __PFX__fractutquta
+  __PFX__fractutqqi
+  __PFX__fractutqhi
+  __PFX__fractutqsi
+  __PFX__fractutqdi
+  __PFX__fractutqti
+  __PFX__fractutqsf
+  __PFX__fractutqdf
+  __PFX__fractuhaqq
+  __PFX__fractuhahq
+  __PFX__fractuhasq
+  __PFX__fractuhadq
+  __PFX__fractuhatq
+  __PFX__fractuhaha
+  __PFX__fractuhasa
+  __PFX__fractuhada
+  __PFX__fractuhata
+  __PFX__fractuhauqq
+  __PFX__fractuhauhq
+  __PFX__fractuhausq
+  __PFX__fractuhaudq
+  __PFX__fractuhautq
+  __PFX__fractuhausa2
+  __PFX__fractuhauda2
+  __PFX__fractuhauta2
+  __PFX__fractuhaqi
+  __PFX__fractuhahi
+  __PFX__fractuhasi
+  __PFX__fractuhadi
+  __PFX__fractuhati
+  __PFX__fractuhasf
+  __PFX__fractuhadf
+  __PFX__fractusaqq
+  __PFX__fractusahq
+  __PFX__fractusasq
+  __PFX__fractusadq
+  __PFX__fractusatq
+  __PFX__fractusaha
+  __PFX__fractusasa
+  __PFX__fractusada
+  __PFX__fractusata
+  __PFX__fractusauqq
+  __PFX__fractusauhq
+  __PFX__fractusausq
+  __PFX__fractusaudq
+  __PFX__fractusautq
+  __PFX__fractusauha2
+  __PFX__fractusauda2
+  __PFX__fractusauta2
+  __PFX__fractusaqi
+  __PFX__fractusahi
+  __PFX__fractusasi
+  __PFX__fractusadi
+  __PFX__fractusati
+  __PFX__fractusasf
+  __PFX__fractusadf
+  __PFX__fractudaqq
+  __PFX__fractudahq
+  __PFX__fractudasq
+  __PFX__fractudadq
+  __PFX__fractudatq
+  __PFX__fractudaha
+  __PFX__fractudasa
+  __PFX__fractudada
+  __PFX__fractudata
+  __PFX__fractudauqq
+  __PFX__fractudauhq
+  __PFX__fractudausq
+  __PFX__fractudaudq
+  __PFX__fractudautq
+  __PFX__fractudauha2
+  __PFX__fractudausa2
+  __PFX__fractudauta2
+  __PFX__fractudaqi
+  __PFX__fractudahi
+  __PFX__fractudasi
+  __PFX__fractudadi
+  __PFX__fractudati
+  __PFX__fractudasf
+  __PFX__fractudadf
+  __PFX__fractutaqq
+  __PFX__fractutahq
+  __PFX__fractutasq
+  __PFX__fractutadq
+  __PFX__fractutatq
+  __PFX__fractutaha
+  __PFX__fractutasa
+  __PFX__fractutada
+  __PFX__fractutata
+  __PFX__fractutauqq
+  __PFX__fractutauhq
+  __PFX__fractutausq
+  __PFX__fractutaudq
+  __PFX__fractutautq
+  __PFX__fractutauha2
+  __PFX__fractutausa2
+  __PFX__fractutauda2
+  __PFX__fractutaqi
+  __PFX__fractutahi
+  __PFX__fractutasi
+  __PFX__fractutadi
+  __PFX__fractutati
+  __PFX__fractutasf
+  __PFX__fractutadf
+  __PFX__fractqiqq
+  __PFX__fractqihq
+  __PFX__fractqisq
+  __PFX__fractqidq
+  __PFX__fractqitq
+  __PFX__fractqiha
+  __PFX__fractqisa
+  __PFX__fractqida
+  __PFX__fractqita
+  __PFX__fractqiuqq
+  __PFX__fractqiuhq
+  __PFX__fractqiusq
+  __PFX__fractqiudq
+  __PFX__fractqiutq
+  __PFX__fractqiuha
+  __PFX__fractqiusa
+  __PFX__fractqiuda
+  __PFX__fractqiuta
+  __PFX__fracthiqq
+  __PFX__fracthihq
+  __PFX__fracthisq
+  __PFX__fracthidq
+  __PFX__fracthitq
+  __PFX__fracthiha
+  __PFX__fracthisa
+  __PFX__fracthida
+  __PFX__fracthita
+  __PFX__fracthiuqq
+  __PFX__fracthiuhq
+  __PFX__fracthiusq
+  __PFX__fracthiudq
+  __PFX__fracthiutq
+  __PFX__fracthiuha
+  __PFX__fracthiusa
+  __PFX__fracthiuda
+  __PFX__fracthiuta
+  __PFX__fractsiqq
+  __PFX__fractsihq
+  __PFX__fractsisq
+  __PFX__fractsidq
+  __PFX__fractsitq
+  __PFX__fractsiha
+  __PFX__fractsisa
+  __PFX__fractsida
+  __PFX__fractsita
+  __PFX__fractsiuqq
+  __PFX__fractsiuhq
+  __PFX__fractsiusq
+  __PFX__fractsiudq
+  __PFX__fractsiutq
+  __PFX__fractsiuha
+  __PFX__fractsiusa
+  __PFX__fractsiuda
+  __PFX__fractsiuta
+  __PFX__fractdiqq
+  __PFX__fractdihq
+  __PFX__fractdisq
+  __PFX__fractdidq
+  __PFX__fractditq
+  __PFX__fractdiha
+  __PFX__fractdisa
+  __PFX__fractdida
+  __PFX__fractdita
+  __PFX__fractdiuqq
+  __PFX__fractdiuhq
+  __PFX__fractdiusq
+  __PFX__fractdiudq
+  __PFX__fractdiutq
+  __PFX__fractdiuha
+  __PFX__fractdiusa
+  __PFX__fractdiuda
+  __PFX__fractdiuta
+  __PFX__fracttiqq
+  __PFX__fracttihq
+  __PFX__fracttisq
+  __PFX__fracttidq
+  __PFX__fracttitq
+  __PFX__fracttiha
+  __PFX__fracttisa
+  __PFX__fracttida
+  __PFX__fracttita
+  __PFX__fracttiuqq
+  __PFX__fracttiuhq
+  __PFX__fracttiusq
+  __PFX__fracttiudq
+  __PFX__fracttiutq
+  __PFX__fracttiuha
+  __PFX__fracttiusa
+  __PFX__fracttiuda
+  __PFX__fracttiuta
+  __PFX__fractsfqq
+  __PFX__fractsfhq
+  __PFX__fractsfsq
+  __PFX__fractsfdq
+  __PFX__fractsftq
+  __PFX__fractsfha
+  __PFX__fractsfsa
+  __PFX__fractsfda
+  __PFX__fractsfta
+  __PFX__fractsfuqq
+  __PFX__fractsfuhq
+  __PFX__fractsfusq
+  __PFX__fractsfudq
+  __PFX__fractsfutq
+  __PFX__fractsfuha
+  __PFX__fractsfusa
+  __PFX__fractsfuda
+  __PFX__fractsfuta
+  __PFX__fractdfqq
+  __PFX__fractdfhq
+  __PFX__fractdfsq
+  __PFX__fractdfdq
+  __PFX__fractdftq
+  __PFX__fractdfha
+  __PFX__fractdfsa
+  __PFX__fractdfda
+  __PFX__fractdfta
+  __PFX__fractdfuqq
+  __PFX__fractdfuhq
+  __PFX__fractdfusq
+  __PFX__fractdfudq
+  __PFX__fractdfutq
+  __PFX__fractdfuha
+  __PFX__fractdfusa
+  __PFX__fractdfuda
+  __PFX__fractdfuta
+  __PFX__satfractqqhq2
+  __PFX__satfractqqsq2
+  __PFX__satfractqqdq2
+  __PFX__satfractqqtq2
+  __PFX__satfractqqha
+  __PFX__satfractqqsa
+  __PFX__satfractqqda
+  __PFX__satfractqqta
+  __PFX__satfractqquqq
+  __PFX__satfractqquhq
+  __PFX__satfractqqusq
+  __PFX__satfractqqudq
+  __PFX__satfractqqutq
+  __PFX__satfractqquha
+  __PFX__satfractqqusa
+  __PFX__satfractqquda
+  __PFX__satfractqquta
+  __PFX__satfracthqqq2
+  __PFX__satfracthqsq2
+  __PFX__satfracthqdq2
+  __PFX__satfracthqtq2
+  __PFX__satfracthqha
+  __PFX__satfracthqsa
+  __PFX__satfracthqda
+  __PFX__satfracthqta
+  __PFX__satfracthquqq
+  __PFX__satfracthquhq
+  __PFX__satfracthqusq
+  __PFX__satfracthqudq
+  __PFX__satfracthqutq
+  __PFX__satfracthquha
+  __PFX__satfracthqusa
+  __PFX__satfracthquda
+  __PFX__satfracthquta
+  __PFX__satfractsqqq2
+  __PFX__satfractsqhq2
+  __PFX__satfractsqdq2
+  __PFX__satfractsqtq2
+  __PFX__satfractsqha
+  __PFX__satfractsqsa
+  __PFX__satfractsqda
+  __PFX__satfractsqta
+  __PFX__satfractsquqq
+  __PFX__satfractsquhq
+  __PFX__satfractsqusq
+  __PFX__satfractsqudq
+  __PFX__satfractsqutq
+  __PFX__satfractsquha
+  __PFX__satfractsqusa
+  __PFX__satfractsquda
+  __PFX__satfractsquta
+  __PFX__satfractdqqq2
+  __PFX__satfractdqhq2
+  __PFX__satfractdqsq2
+  __PFX__satfractdqtq2
+  __PFX__satfractdqha
+  __PFX__satfractdqsa
+  __PFX__satfractdqda
+  __PFX__satfractdqta
+  __PFX__satfractdquqq
+  __PFX__satfractdquhq
+  __PFX__satfractdqusq
+  __PFX__satfractdqudq
+  __PFX__satfractdqutq
+  __PFX__satfractdquha
+  __PFX__satfractdqusa
+  __PFX__satfractdquda
+  __PFX__satfractdquta
+  __PFX__satfracttqqq2
+  __PFX__satfracttqhq2
+  __PFX__satfracttqsq2
+  __PFX__satfracttqdq2
+  __PFX__satfracttqha
+  __PFX__satfracttqsa
+  __PFX__satfracttqda
+  __PFX__satfracttqta
+  __PFX__satfracttquqq
+  __PFX__satfracttquhq
+  __PFX__satfracttqusq
+  __PFX__satfracttqudq
+  __PFX__satfracttqutq
+  __PFX__satfracttquha
+  __PFX__satfracttqusa
+  __PFX__satfracttquda
+  __PFX__satfracttquta
+  __PFX__satfracthaqq
+  __PFX__satfracthahq
+  __PFX__satfracthasq
+  __PFX__satfracthadq
+  __PFX__satfracthatq
+  __PFX__satfracthasa2
+  __PFX__satfracthada2
+  __PFX__satfracthata2
+  __PFX__satfracthauqq
+  __PFX__satfracthauhq
+  __PFX__satfracthausq
+  __PFX__satfracthaudq
+  __PFX__satfracthautq
+  __PFX__satfracthauha
+  __PFX__satfracthausa
+  __PFX__satfracthauda
+  __PFX__satfracthauta
+  __PFX__satfractsaqq
+  __PFX__satfractsahq
+  __PFX__satfractsasq
+  __PFX__satfractsadq
+  __PFX__satfractsatq
+  __PFX__satfractsaha2
+  __PFX__satfractsada2
+  __PFX__satfractsata2
+  __PFX__satfractsauqq
+  __PFX__satfractsauhq
+  __PFX__satfractsausq
+  __PFX__satfractsaudq
+  __PFX__satfractsautq
+  __PFX__satfractsauha
+  __PFX__satfractsausa
+  __PFX__satfractsauda
+  __PFX__satfractsauta
+  __PFX__satfractdaqq
+  __PFX__satfractdahq
+  __PFX__satfractdasq
+  __PFX__satfractdadq
+  __PFX__satfractdatq
+  __PFX__satfractdaha2
+  __PFX__satfractdasa2
+  __PFX__satfractdata2
+  __PFX__satfractdauqq
+  __PFX__satfractdauhq
+  __PFX__satfractdausq
+  __PFX__satfractdaudq
+  __PFX__satfractdautq
+  __PFX__satfractdauha
+  __PFX__satfractdausa
+  __PFX__satfractdauda
+  __PFX__satfractdauta
+  __PFX__satfracttaqq
+  __PFX__satfracttahq
+  __PFX__satfracttasq
+  __PFX__satfracttadq
+  __PFX__satfracttatq
+  __PFX__satfracttaha2
+  __PFX__satfracttasa2
+  __PFX__satfracttada2
+  __PFX__satfracttauqq
+  __PFX__satfracttauhq
+  __PFX__satfracttausq
+  __PFX__satfracttaudq
+  __PFX__satfracttautq
+  __PFX__satfracttauha
+  __PFX__satfracttausa
+  __PFX__satfracttauda
+  __PFX__satfracttauta
+  __PFX__satfractuqqqq
+  __PFX__satfractuqqhq
+  __PFX__satfractuqqsq
+  __PFX__satfractuqqdq
+  __PFX__satfractuqqtq
+  __PFX__satfractuqqha
+  __PFX__satfractuqqsa
+  __PFX__satfractuqqda
+  __PFX__satfractuqqta
+  __PFX__satfractuqquhq2
+  __PFX__satfractuqqusq2
+  __PFX__satfractuqqudq2
+  __PFX__satfractuqqutq2
+  __PFX__satfractuqquha
+  __PFX__satfractuqqusa
+  __PFX__satfractuqquda
+  __PFX__satfractuqquta
+  __PFX__satfractuhqqq
+  __PFX__satfractuhqhq
+  __PFX__satfractuhqsq
+  __PFX__satfractuhqdq
+  __PFX__satfractuhqtq
+  __PFX__satfractuhqha
+  __PFX__satfractuhqsa
+  __PFX__satfractuhqda
+  __PFX__satfractuhqta
+  __PFX__satfractuhquqq2
+  __PFX__satfractuhqusq2
+  __PFX__satfractuhqudq2
+  __PFX__satfractuhqutq2
+  __PFX__satfractuhquha
+  __PFX__satfractuhqusa
+  __PFX__satfractuhquda
+  __PFX__satfractuhquta
+  __PFX__satfractusqqq
+  __PFX__satfractusqhq
+  __PFX__satfractusqsq
+  __PFX__satfractusqdq
+  __PFX__satfractusqtq
+  __PFX__satfractusqha
+  __PFX__satfractusqsa
+  __PFX__satfractusqda
+  __PFX__satfractusqta
+  __PFX__satfractusquqq2
+  __PFX__satfractusquhq2
+  __PFX__satfractusqudq2
+  __PFX__satfractusqutq2
+  __PFX__satfractusquha
+  __PFX__satfractusqusa
+  __PFX__satfractusquda
+  __PFX__satfractusquta
+  __PFX__satfractudqqq
+  __PFX__satfractudqhq
+  __PFX__satfractudqsq
+  __PFX__satfractudqdq
+  __PFX__satfractudqtq
+  __PFX__satfractudqha
+  __PFX__satfractudqsa
+  __PFX__satfractudqda
+  __PFX__satfractudqta
+  __PFX__satfractudquqq2
+  __PFX__satfractudquhq2
+  __PFX__satfractudqusq2
+  __PFX__satfractudqutq2
+  __PFX__satfractudquha
+  __PFX__satfractudqusa
+  __PFX__satfractudquda
+  __PFX__satfractudquta
+  __PFX__satfractutqqq
+  __PFX__satfractutqhq
+  __PFX__satfractutqsq
+  __PFX__satfractutqdq
+  __PFX__satfractutqtq
+  __PFX__satfractutqha
+  __PFX__satfractutqsa
+  __PFX__satfractutqda
+  __PFX__satfractutqta
+  __PFX__satfractutquqq2
+  __PFX__satfractutquhq2
+  __PFX__satfractutqusq2
+  __PFX__satfractutqudq2
+  __PFX__satfractutquha
+  __PFX__satfractutqusa
+  __PFX__satfractutquda
+  __PFX__satfractutquta
+  __PFX__satfractuhaqq
+  __PFX__satfractuhahq
+  __PFX__satfractuhasq
+  __PFX__satfractuhadq
+  __PFX__satfractuhatq
+  __PFX__satfractuhaha
+  __PFX__satfractuhasa
+  __PFX__satfractuhada
+  __PFX__satfractuhata
+  __PFX__satfractuhauqq
+  __PFX__satfractuhauhq
+  __PFX__satfractuhausq
+  __PFX__satfractuhaudq
+  __PFX__satfractuhautq
+  __PFX__satfractuhausa2
+  __PFX__satfractuhauda2
+  __PFX__satfractuhauta2
+  __PFX__satfractusaqq
+  __PFX__satfractusahq
+  __PFX__satfractusasq
+  __PFX__satfractusadq
+  __PFX__satfractusatq
+  __PFX__satfractusaha
+  __PFX__satfractusasa
+  __PFX__satfractusada
+  __PFX__satfractusata
+  __PFX__satfractusauqq
+  __PFX__satfractusauhq
+  __PFX__satfractusausq
+  __PFX__satfractusaudq
+  __PFX__satfractusautq
+  __PFX__satfractusauha2
+  __PFX__satfractusauda2
+  __PFX__satfractusauta2
+  __PFX__satfractudaqq
+  __PFX__satfractudahq
+  __PFX__satfractudasq
+  __PFX__satfractudadq
+  __PFX__satfractudatq
+  __PFX__satfractudaha
+  __PFX__satfractudasa
+  __PFX__satfractudada
+  __PFX__satfractudata
+  __PFX__satfractudauqq
+  __PFX__satfractudauhq
+  __PFX__satfractudausq
+  __PFX__satfractudaudq
+  __PFX__satfractudautq
+  __PFX__satfractudauha2
+  __PFX__satfractudausa2
+  __PFX__satfractudauta2
+  __PFX__satfractutaqq
+  __PFX__satfractutahq
+  __PFX__satfractutasq
+  __PFX__satfractutadq
+  __PFX__satfractutatq
+  __PFX__satfractutaha
+  __PFX__satfractutasa
+  __PFX__satfractutada
+  __PFX__satfractutata
+  __PFX__satfractutauqq
+  __PFX__satfractutauhq
+  __PFX__satfractutausq
+  __PFX__satfractutaudq
+  __PFX__satfractutautq
+  __PFX__satfractutauha2
+  __PFX__satfractutausa2
+  __PFX__satfractutauda2
+  __PFX__satfractqiqq
+  __PFX__satfractqihq
+  __PFX__satfractqisq
+  __PFX__satfractqidq
+  __PFX__satfractqitq
+  __PFX__satfractqiha
+  __PFX__satfractqisa
+  __PFX__satfractqida
+  __PFX__satfractqita
+  __PFX__satfractqiuqq
+  __PFX__satfractqiuhq
+  __PFX__satfractqiusq
+  __PFX__satfractqiudq
+  __PFX__satfractqiutq
+  __PFX__satfractqiuha
+  __PFX__satfractqiusa
+  __PFX__satfractqiuda
+  __PFX__satfractqiuta
+  __PFX__satfracthiqq
+  __PFX__satfracthihq
+  __PFX__satfracthisq
+  __PFX__satfracthidq
+  __PFX__satfracthitq
+  __PFX__satfracthiha
+  __PFX__satfracthisa
+  __PFX__satfracthida
+  __PFX__satfracthita
+  __PFX__satfracthiuqq
+  __PFX__satfracthiuhq
+  __PFX__satfracthiusq
+  __PFX__satfracthiudq
+  __PFX__satfracthiutq
+  __PFX__satfracthiuha
+  __PFX__satfracthiusa
+  __PFX__satfracthiuda
+  __PFX__satfracthiuta
+  __PFX__satfractsiqq
+  __PFX__satfractsihq
+  __PFX__satfractsisq
+  __PFX__satfractsidq
+  __PFX__satfractsitq
+  __PFX__satfractsiha
+  __PFX__satfractsisa
+  __PFX__satfractsida
+  __PFX__satfractsita
+  __PFX__satfractsiuqq
+  __PFX__satfractsiuhq
+  __PFX__satfractsiusq
+  __PFX__satfractsiudq
+  __PFX__satfractsiutq
+  __PFX__satfractsiuha
+  __PFX__satfractsiusa
+  __PFX__satfractsiuda
+  __PFX__satfractsiuta
+  __PFX__satfractdiqq
+  __PFX__satfractdihq
+  __PFX__satfractdisq
+  __PFX__satfractdidq
+  __PFX__satfractditq
+  __PFX__satfractdiha
+  __PFX__satfractdisa
+  __PFX__satfractdida
+  __PFX__satfractdita
+  __PFX__satfractdiuqq
+  __PFX__satfractdiuhq
+  __PFX__satfractdiusq
+  __PFX__satfractdiudq
+  __PFX__satfractdiutq
+  __PFX__satfractdiuha
+  __PFX__satfractdiusa
+  __PFX__satfractdiuda
+  __PFX__satfractdiuta
+  __PFX__satfracttiqq
+  __PFX__satfracttihq
+  __PFX__satfracttisq
+  __PFX__satfracttidq
+  __PFX__satfracttitq
+  __PFX__satfracttiha
+  __PFX__satfracttisa
+  __PFX__satfracttida
+  __PFX__satfracttita
+  __PFX__satfracttiuqq
+  __PFX__satfracttiuhq
+  __PFX__satfracttiusq
+  __PFX__satfracttiudq
+  __PFX__satfracttiutq
+  __PFX__satfracttiuha
+  __PFX__satfracttiusa
+  __PFX__satfracttiuda
+  __PFX__satfracttiuta
+  __PFX__satfractsfqq
+  __PFX__satfractsfhq
+  __PFX__satfractsfsq
+  __PFX__satfractsfdq
+  __PFX__satfractsftq
+  __PFX__satfractsfha
+  __PFX__satfractsfsa
+  __PFX__satfractsfda
+  __PFX__satfractsfta
+  __PFX__satfractsfuqq
+  __PFX__satfractsfuhq
+  __PFX__satfractsfusq
+  __PFX__satfractsfudq
+  __PFX__satfractsfutq
+  __PFX__satfractsfuha
+  __PFX__satfractsfusa
+  __PFX__satfractsfuda
+  __PFX__satfractsfuta
+  __PFX__satfractdfqq
+  __PFX__satfractdfhq
+  __PFX__satfractdfsq
+  __PFX__satfractdfdq
+  __PFX__satfractdftq
+  __PFX__satfractdfha
+  __PFX__satfractdfsa
+  __PFX__satfractdfda
+  __PFX__satfractdfta
+  __PFX__satfractdfuqq
+  __PFX__satfractdfuhq
+  __PFX__satfractdfusq
+  __PFX__satfractdfudq
+  __PFX__satfractdfutq
+  __PFX__satfractdfuha
+  __PFX__satfractdfusa
+  __PFX__satfractdfuda
+  __PFX__satfractdfuta
+  __PFX__fractunsqqqi
+  __PFX__fractunsqqhi
+  __PFX__fractunsqqsi
+  __PFX__fractunsqqdi
+  __PFX__fractunsqqti
+  __PFX__fractunshqqi
+  __PFX__fractunshqhi
+  __PFX__fractunshqsi
+  __PFX__fractunshqdi
+  __PFX__fractunshqti
+  __PFX__fractunssqqi
+  __PFX__fractunssqhi
+  __PFX__fractunssqsi
+  __PFX__fractunssqdi
+  __PFX__fractunssqti
+  __PFX__fractunsdqqi
+  __PFX__fractunsdqhi
+  __PFX__fractunsdqsi
+  __PFX__fractunsdqdi
+  __PFX__fractunsdqti
+  __PFX__fractunstqqi
+  __PFX__fractunstqhi
+  __PFX__fractunstqsi
+  __PFX__fractunstqdi
+  __PFX__fractunstqti
+  __PFX__fractunshaqi
+  __PFX__fractunshahi
+  __PFX__fractunshasi
+  __PFX__fractunshadi
+  __PFX__fractunshati
+  __PFX__fractunssaqi
+  __PFX__fractunssahi
+  __PFX__fractunssasi
+  __PFX__fractunssadi
+  __PFX__fractunssati
+  __PFX__fractunsdaqi
+  __PFX__fractunsdahi
+  __PFX__fractunsdasi
+  __PFX__fractunsdadi
+  __PFX__fractunsdati
+  __PFX__fractunstaqi
+  __PFX__fractunstahi
+  __PFX__fractunstasi
+  __PFX__fractunstadi
+  __PFX__fractunstati
+  __PFX__fractunsuqqqi
+  __PFX__fractunsuqqhi
+  __PFX__fractunsuqqsi
+  __PFX__fractunsuqqdi
+  __PFX__fractunsuqqti
+  __PFX__fractunsuhqqi
+  __PFX__fractunsuhqhi
+  __PFX__fractunsuhqsi
+  __PFX__fractunsuhqdi
+  __PFX__fractunsuhqti
+  __PFX__fractunsusqqi
+  __PFX__fractunsusqhi
+  __PFX__fractunsusqsi
+  __PFX__fractunsusqdi
+  __PFX__fractunsusqti
+  __PFX__fractunsudqqi
+  __PFX__fractunsudqhi
+  __PFX__fractunsudqsi
+  __PFX__fractunsudqdi
+  __PFX__fractunsudqti
+  __PFX__fractunsutqqi
+  __PFX__fractunsutqhi
+  __PFX__fractunsutqsi
+  __PFX__fractunsutqdi
+  __PFX__fractunsutqti
+  __PFX__fractunsuhaqi
+  __PFX__fractunsuhahi
+  __PFX__fractunsuhasi
+  __PFX__fractunsuhadi
+  __PFX__fractunsuhati
+  __PFX__fractunsusaqi
+  __PFX__fractunsusahi
+  __PFX__fractunsusasi
+  __PFX__fractunsusadi
+  __PFX__fractunsusati
+  __PFX__fractunsudaqi
+  __PFX__fractunsudahi
+  __PFX__fractunsudasi
+  __PFX__fractunsudadi
+  __PFX__fractunsudati
+  __PFX__fractunsutaqi
+  __PFX__fractunsutahi
+  __PFX__fractunsutasi
+  __PFX__fractunsutadi
+  __PFX__fractunsutati
+  __PFX__fractunsqiqq
+  __PFX__fractunsqihq
+  __PFX__fractunsqisq
+  __PFX__fractunsqidq
+  __PFX__fractunsqitq
+  __PFX__fractunsqiha
+  __PFX__fractunsqisa
+  __PFX__fractunsqida
+  __PFX__fractunsqita
+  __PFX__fractunsqiuqq
+  __PFX__fractunsqiuhq
+  __PFX__fractunsqiusq
+  __PFX__fractunsqiudq
+  __PFX__fractunsqiutq
+  __PFX__fractunsqiuha
+  __PFX__fractunsqiusa
+  __PFX__fractunsqiuda
+  __PFX__fractunsqiuta
+  __PFX__fractunshiqq
+  __PFX__fractunshihq
+  __PFX__fractunshisq
+  __PFX__fractunshidq
+  __PFX__fractunshitq
+  __PFX__fractunshiha
+  __PFX__fractunshisa
+  __PFX__fractunshida
+  __PFX__fractunshita
+  __PFX__fractunshiuqq
+  __PFX__fractunshiuhq
+  __PFX__fractunshiusq
+  __PFX__fractunshiudq
+  __PFX__fractunshiutq
+  __PFX__fractunshiuha
+  __PFX__fractunshiusa
+  __PFX__fractunshiuda
+  __PFX__fractunshiuta
+  __PFX__fractunssiqq
+  __PFX__fractunssihq
+  __PFX__fractunssisq
+  __PFX__fractunssidq
+  __PFX__fractunssitq
+  __PFX__fractunssiha
+  __PFX__fractunssisa
+  __PFX__fractunssida
+  __PFX__fractunssita
+  __PFX__fractunssiuqq
+  __PFX__fractunssiuhq
+  __PFX__fractunssiusq
+  __PFX__fractunssiudq
+  __PFX__fractunssiutq
+  __PFX__fractunssiuha
+  __PFX__fractunssiusa
+  __PFX__fractunssiuda
+  __PFX__fractunssiuta
+  __PFX__fractunsdiqq
+  __PFX__fractunsdihq
+  __PFX__fractunsdisq
+  __PFX__fractunsdidq
+  __PFX__fractunsditq
+  __PFX__fractunsdiha
+  __PFX__fractunsdisa
+  __PFX__fractunsdida
+  __PFX__fractunsdita
+  __PFX__fractunsdiuqq
+  __PFX__fractunsdiuhq
+  __PFX__fractunsdiusq
+  __PFX__fractunsdiudq
+  __PFX__fractunsdiutq
+  __PFX__fractunsdiuha
+  __PFX__fractunsdiusa
+  __PFX__fractunsdiuda
+  __PFX__fractunsdiuta
+  __PFX__fractunstiqq
+  __PFX__fractunstihq
+  __PFX__fractunstisq
+  __PFX__fractunstidq
+  __PFX__fractunstitq
+  __PFX__fractunstiha
+  __PFX__fractunstisa
+  __PFX__fractunstida
+  __PFX__fractunstita
+  __PFX__fractunstiuqq
+  __PFX__fractunstiuhq
+  __PFX__fractunstiusq
+  __PFX__fractunstiudq
+  __PFX__fractunstiutq
+  __PFX__fractunstiuha
+  __PFX__fractunstiusa
+  __PFX__fractunstiuda
+  __PFX__fractunstiuta
+  __PFX__satfractunsqiqq
+  __PFX__satfractunsqihq
+  __PFX__satfractunsqisq
+  __PFX__satfractunsqidq
+  __PFX__satfractunsqitq
+  __PFX__satfractunsqiha
+  __PFX__satfractunsqisa
+  __PFX__satfractunsqida
+  __PFX__satfractunsqita
+  __PFX__satfractunsqiuqq
+  __PFX__satfractunsqiuhq
+  __PFX__satfractunsqiusq
+  __PFX__satfractunsqiudq
+  __PFX__satfractunsqiutq
+  __PFX__satfractunsqiuha
+  __PFX__satfractunsqiusa
+  __PFX__satfractunsqiuda
+  __PFX__satfractunsqiuta
+  __PFX__satfractunshiqq
+  __PFX__satfractunshihq
+  __PFX__satfractunshisq
+  __PFX__satfractunshidq
+  __PFX__satfractunshitq
+  __PFX__satfractunshiha
+  __PFX__satfractunshisa
+  __PFX__satfractunshida
+  __PFX__satfractunshita
+  __PFX__satfractunshiuqq
+  __PFX__satfractunshiuhq
+  __PFX__satfractunshiusq
+  __PFX__satfractunshiudq
+  __PFX__satfractunshiutq
+  __PFX__satfractunshiuha
+  __PFX__satfractunshiusa
+  __PFX__satfractunshiuda
+  __PFX__satfractunshiuta
+  __PFX__satfractunssiqq
+  __PFX__satfractunssihq
+  __PFX__satfractunssisq
+  __PFX__satfractunssidq
+  __PFX__satfractunssitq
+  __PFX__satfractunssiha
+  __PFX__satfractunssisa
+  __PFX__satfractunssida
+  __PFX__satfractunssita
+  __PFX__satfractunssiuqq
+  __PFX__satfractunssiuhq
+  __PFX__satfractunssiusq
+  __PFX__satfractunssiudq
+  __PFX__satfractunssiutq
+  __PFX__satfractunssiuha
+  __PFX__satfractunssiusa
+  __PFX__satfractunssiuda
+  __PFX__satfractunssiuta
+  __PFX__satfractunsdiqq
+  __PFX__satfractunsdihq
+  __PFX__satfractunsdisq
+  __PFX__satfractunsdidq
+  __PFX__satfractunsditq
+  __PFX__satfractunsdiha
+  __PFX__satfractunsdisa
+  __PFX__satfractunsdida
+  __PFX__satfractunsdita
+  __PFX__satfractunsdiuqq
+  __PFX__satfractunsdiuhq
+  __PFX__satfractunsdiusq
+  __PFX__satfractunsdiudq
+  __PFX__satfractunsdiutq
+  __PFX__satfractunsdiuha
+  __PFX__satfractunsdiusa
+  __PFX__satfractunsdiuda
+  __PFX__satfractunsdiuta
+  __PFX__satfractunstiqq
+  __PFX__satfractunstihq
+  __PFX__satfractunstisq
+  __PFX__satfractunstidq
+  __PFX__satfractunstitq
+  __PFX__satfractunstiha
+  __PFX__satfractunstisa
+  __PFX__satfractunstida
+  __PFX__satfractunstita
+  __PFX__satfractunstiuqq
+  __PFX__satfractunstiuhq
+  __PFX__satfractunstiusq
+  __PFX__satfractunstiudq
+  __PFX__satfractunstiutq
+  __PFX__satfractunstiuha
+  __PFX__satfractunstiusa
+  __PFX__satfractunstiuda
+  __PFX__satfractunstiuta
+}
+
+%inherit GCC_4.4.0 GCC_4.3.0
+GCC_4.4.0 {
+  __sync_fetch_and_add_1
+  __sync_fetch_and_sub_1
+  __sync_fetch_and_or_1
+  __sync_fetch_and_and_1
+  __sync_fetch_and_xor_1
+  __sync_fetch_and_nand_1
+  __sync_add_and_fetch_1
+  __sync_sub_and_fetch_1
+  __sync_or_and_fetch_1
+  __sync_and_and_fetch_1
+  __sync_xor_and_fetch_1
+  __sync_nand_and_fetch_1
+  __sync_bool_compare_and_swap_1
+  __sync_val_compare_and_swap_1
+  __sync_lock_test_and_set_1
+
+  __sync_fetch_and_add_2
+  __sync_fetch_and_sub_2
+  __sync_fetch_and_or_2
+  __sync_fetch_and_and_2
+  __sync_fetch_and_xor_2
+  __sync_fetch_and_nand_2
+  __sync_add_and_fetch_2
+  __sync_sub_and_fetch_2
+  __sync_or_and_fetch_2
+  __sync_and_and_fetch_2
+  __sync_xor_and_fetch_2
+  __sync_nand_and_fetch_2
+  __sync_bool_compare_and_swap_2
+  __sync_val_compare_and_swap_2
+  __sync_lock_test_and_set_2
+
+  __sync_fetch_and_add_4
+  __sync_fetch_and_sub_4
+  __sync_fetch_and_or_4
+  __sync_fetch_and_and_4
+  __sync_fetch_and_xor_4
+  __sync_fetch_and_nand_4
+  __sync_add_and_fetch_4
+  __sync_sub_and_fetch_4
+  __sync_or_and_fetch_4
+  __sync_and_and_fetch_4
+  __sync_xor_and_fetch_4
+  __sync_nand_and_fetch_4
+  __sync_bool_compare_and_swap_4
+  __sync_val_compare_and_swap_4
+  __sync_lock_test_and_set_4
+
+  __sync_fetch_and_add_8
+  __sync_fetch_and_sub_8
+  __sync_fetch_and_or_8
+  __sync_fetch_and_and_8
+  __sync_fetch_and_xor_8
+  __sync_fetch_and_nand_8
+  __sync_add_and_fetch_8
+  __sync_sub_and_fetch_8
+  __sync_or_and_fetch_8
+  __sync_and_and_fetch_8
+  __sync_xor_and_fetch_8
+  __sync_nand_and_fetch_8
+  __sync_bool_compare_and_swap_8
+  __sync_val_compare_and_swap_8
+  __sync_lock_test_and_set_8
+
+  __sync_fetch_and_add_16
+  __sync_fetch_and_sub_16
+  __sync_fetch_and_or_16
+  __sync_fetch_and_and_16
+  __sync_fetch_and_xor_16
+  __sync_fetch_and_nand_16
+  __sync_add_and_fetch_16
+  __sync_sub_and_fetch_16
+  __sync_or_and_fetch_16
+  __sync_and_and_fetch_16
+  __sync_xor_and_fetch_16
+  __sync_nand_and_fetch_16
+  __sync_bool_compare_and_swap_16
+  __sync_val_compare_and_swap_16
+  __sync_lock_test_and_set_16
+
+  __sync_synchronize
+}
+
+%inherit GCC_4.5.0 GCC_4.4.0
+GCC_4.5.0 {
+  __unordxf2
+  __unordtf2
+}
+
+%inherit GCC_4.6.0 GCC_4.5.0
+GCC_4.6.0 {
+  __morestack_segments
+  __morestack_current_segment
+  __morestack_initial_sp
+  __splitstack_find
+}
Index: trunk/libgcc/Makefile.in
===================================================================
--- trunk.orig/libgcc/Makefile.in
+++ trunk/libgcc/Makefile.in
@@ -250,6 +250,10 @@ gcc_s_compile = $(gcc_compile) -DSHARED
 objects = $(filter %$(objext),$^)
 
 # Collect any host-specific information from Makefile fragments.
+
+LIBGCC_VER_GNU_PREFIX = __
+LIBGCC_VER_SYMBOLS_PREFIX =
+
 tmake_file = @tmake_file@
 include $(srcdir)/empty.mk $(tmake_file)
 
@@ -795,6 +799,9 @@ libgcc_s$(SHLIB_EXT): libgcc.map
 mapfile = libgcc.map
 endif
 
+libgcc-std.ver: $(srcdir)/libgcc-std.ver.in
+	sed -e 's/__PFX__/$(LIBGCC_VER_GNU_PREFIX)/g' < $< > $@
+
 libgcc_s$(SHLIB_EXT): $(libgcc-s-objects) $(extra-parts)
 	# @multilib_flags@ is still needed because this may use
 	# $(GCC_FOR_TARGET) and $(LIBGCC2_CFLAGS) directly.
Index: trunk/gcc/Makefile.in
===================================================================
--- trunk.orig/gcc/Makefile.in
+++ trunk/gcc/Makefile.in
@@ -1892,7 +1892,10 @@ LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA)
 # which case they will start with $(srcdir)), or generated into the build
 # directory (in which case they will be relative paths).
 srcdirify = $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
-            $(patsubst %,$$(gcc_objdir)/%,$(filter-out $(srcdir)%,$(1)))
+            $(patsubst $$(libgcc_objdir)/%,%, \
+		$(filter $$(libgcc_objdir)%,$(1))) \
+            $(patsubst %,$$(gcc_objdir)/%, \
+		$(filter-out $(srcdir)% $$(libgcc_objdir)%,$(1)))
 
 # The distinction between these two variables is no longer relevant,
 # so we combine them.  Sort removes duplicates.
Index: trunk/libgcc/config/t-gnu-prefix
===================================================================
--- /dev/null
+++ trunk/libgcc/config/t-gnu-prefix
@@ -0,0 +1 @@
+LIBGCC_VER_GNU_PREFIX = __gnu_
Index: trunk/gcc/config/frv/t-linux
===================================================================
--- trunk.orig/gcc/config/frv/t-linux
+++ trunk/gcc/config/frv/t-linux
@@ -29,5 +29,5 @@ EXTRA_MULTILIB_PARTS =
 CRTSTUFF_T_CFLAGS = -fPIC
 TARGET_LIBGCC2_CFLAGS = -fPIC
 
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/frv/libgcc-frv.ver
Index: trunk/gcc/config/i386/t-cygming
===================================================================
--- trunk.orig/gcc/config/i386/t-cygming
+++ trunk/gcc/config/i386/t-cygming
@@ -113,4 +113,4 @@ SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
 # We'd like to use SHLIB_SONAME here too, but shlib_base_name
 # does not get substituted before mkmap-flat.awk is run.
 SHLIB_MKMAP_OPTS = -v pe_dll=libgcc_s_$(EH_MODEL)-$(SHLIB_SOVERSION)$(SHLIB_EXT)
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/i386/t-linux
===================================================================
--- trunk.orig/gcc/config/i386/t-linux
+++ trunk/gcc/config/i386/t-linux
@@ -1,5 +1,5 @@
 # On 64bit we do not need any exports for glibc for 64-bit libgcc_s.
 # Need to support TImode for x86.  Override the settings from
 # t-slibgcc-elf-ver and t-linux
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/i386/libgcc-glibc.ver
Index: trunk/gcc/config/mips/t-slibgcc-irix
===================================================================
--- trunk.orig/gcc/config/mips/t-slibgcc-irix
+++ trunk/gcc/config/mips/t-slibgcc-irix
@@ -49,4 +49,4 @@ SHLIB_INSTALL = \
 	$(LN_S) $(SHLIB_SONAME) \
 	  $$(DESTDIR)$$(slibdir)$(SHLIB_SLIBDIR_QUAL)/$(SHLIB_SOLINK)
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver
Index: trunk/gcc/config/rs6000/t-aix43
===================================================================
--- trunk.orig/gcc/config/rs6000/t-aix43
+++ trunk/gcc/config/rs6000/t-aix43
@@ -82,7 +82,7 @@ SHLIB_INSTALL = \
 		$$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
 # GCC 128-bit long double support routines.
Index: trunk/gcc/config/rs6000/t-aix52
===================================================================
--- trunk.orig/gcc/config/rs6000/t-aix52
+++ trunk/gcc/config/rs6000/t-aix52
@@ -63,7 +63,7 @@ SHLIB_INSTALL = \
 		$$(DESTDIR)$$(slibdir)@shlib_slibdir_qual@/
 SHLIB_LIBS = -lc `case @multilib_dir@ in *pthread*) echo -lpthread ;; esac`
 SHLIB_MKMAP = $(srcdir)/mkmap-flat.awk
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver $(srcdir)/config/rs6000/libgcc-ppc64.ver
 SHLIB_NM_FLAGS = -Bpg -X32_64
 
 # GCC 128-bit long double support routines.
Index: trunk/gcc/config/sparc/t-linux
===================================================================
--- trunk.orig/gcc/config/sparc/t-linux
+++ trunk/gcc/config/sparc/t-linux
@@ -1,5 +1,5 @@
 # Override t-slibgcc-elf-ver to export some libgcc symbols with
 # the symbol versions that glibc used.
 # Avoid the t-linux version file.
-SHLIB_MAPFILES = $(srcdir)/libgcc-std.ver \
+SHLIB_MAPFILES = $$(libgcc_objdir)/libgcc-std.ver \
 		 $(srcdir)/config/sparc/libgcc-sparc-glibc.ver
Index: trunk/gcc/tree.c
===================================================================
--- trunk.orig/gcc/tree.c
+++ trunk/gcc/tree.c
@@ -9525,6 +9525,10 @@ build_common_builtin_nodes (void)
 	const char *p;
 	enum built_in_function mcode, dcode;
 	tree type, inner_type;
+	const char *prefix = "__";
+
+	if (targetm.libfunc_gnu_prefix)
+	  prefix = "__gnu_";
 
 	type = lang_hooks.types.type_for_mode ((enum machine_mode) mode, 0);
 	if (type == NULL)
@@ -9543,13 +9547,17 @@ build_common_builtin_nodes (void)
 	  *q = TOLOWER (*p);
 	*q = '\0';
 
-	built_in_names[mcode] = concat ("__mul", mode_name_buf, "3", NULL);
+	built_in_names[mcode] = concat (prefix, "mul", mode_name_buf, "3",
+					NULL);
         local_define_builtin (built_in_names[mcode], ftype, mcode,
-			      built_in_names[mcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+			      built_in_names[mcode],
+			      ECF_CONST | ECF_NOTHROW | ECF_LEAF);
 
-	built_in_names[dcode] = concat ("__div", mode_name_buf, "3", NULL);
+	built_in_names[dcode] = concat (prefix, "div", mode_name_buf, "3",
+					NULL);
         local_define_builtin (built_in_names[dcode], ftype, dcode,
-			      built_in_names[dcode], ECF_CONST | ECF_NOTHROW | ECF_LEAF);
+			      built_in_names[dcode],
+			      ECF_CONST | ECF_NOTHROW | ECF_LEAF);
       }
   }
 }
Index: trunk/gcc/config/fixed-bit.h
===================================================================
--- trunk.orig/gcc/config/fixed-bit.h
+++ trunk/gcc/config/fixed-bit.h
@@ -445,35 +445,39 @@ typedef union
 #define IBITS		IBITS2(MODE_NAME)
 #define I_F_BITS	(FBITS + IBITS)
 
-#define FIXED_OP(OP,MODE,NUM)	OP ## MODE ## NUM
+#ifdef LIBGCC2_GNU_PREFIX
+#define FIXED_OP(OP,MODE,NUM)	__gnu_ ## OP ## MODE ## NUM
+#else
+#define FIXED_OP(OP,MODE,NUM)	__ ## OP ## MODE ## NUM
+#endif
 
-#define FIXED_SATURATE1_TEMP(NAME)	FIXED_OP(__saturate1,NAME,)
-#define FIXED_SATURATE2_TEMP(NAME)	FIXED_OP(__saturate2,NAME,)
-#define FIXED_MULHELPER_TEMP(NAME)	FIXED_OP(__mulhelper,NAME,)
-#define FIXED_DIVHELPER_TEMP(NAME)	FIXED_OP(__divhelper,NAME,)
-#define FIXED_ASHLHELPER_TEMP(NAME)	FIXED_OP(__ashlhelper,NAME,)
-#define FIXED_ADD_TEMP(NAME)	FIXED_OP(__add,NAME,3)
-#define FIXED_SSADD_TEMP(NAME)	FIXED_OP(__ssadd,NAME,3)
-#define FIXED_USADD_TEMP(NAME)	FIXED_OP(__usadd,NAME,3)
-#define FIXED_SUB_TEMP(NAME)	FIXED_OP(__sub,NAME,3)
-#define FIXED_SSSUB_TEMP(NAME)	FIXED_OP(__sssub,NAME,3)
-#define FIXED_USSUB_TEMP(NAME)	FIXED_OP(__ussub,NAME,3)
-#define FIXED_MUL_TEMP(NAME)	FIXED_OP(__mul,NAME,3)
-#define FIXED_SSMUL_TEMP(NAME)	FIXED_OP(__ssmul,NAME,3)
-#define FIXED_USMUL_TEMP(NAME)	FIXED_OP(__usmul,NAME,3)
-#define FIXED_DIV_TEMP(NAME)	FIXED_OP(__div,NAME,3)
-#define FIXED_UDIV_TEMP(NAME)	FIXED_OP(__udiv,NAME,3)
-#define FIXED_SSDIV_TEMP(NAME)	FIXED_OP(__ssdiv,NAME,3)
-#define FIXED_USDIV_TEMP(NAME)	FIXED_OP(__usdiv,NAME,3)
-#define FIXED_NEG_TEMP(NAME)	FIXED_OP(__neg,NAME,2)
-#define FIXED_SSNEG_TEMP(NAME)	FIXED_OP(__ssneg,NAME,2)
-#define FIXED_USNEG_TEMP(NAME)	FIXED_OP(__usneg,NAME,2)
-#define FIXED_ASHL_TEMP(NAME)	FIXED_OP(__ashl,NAME,3)
-#define FIXED_ASHR_TEMP(NAME)	FIXED_OP(__ashr,NAME,3)
-#define FIXED_LSHR_TEMP(NAME)	FIXED_OP(__lshr,NAME,3)
-#define FIXED_SSASHL_TEMP(NAME)	FIXED_OP(__ssashl,NAME,3)
-#define FIXED_USASHL_TEMP(NAME)	FIXED_OP(__usashl,NAME,3)
-#define FIXED_CMP_TEMP(NAME)	FIXED_OP(__cmp,NAME,2)
+#define FIXED_SATURATE1_TEMP(NAME)	FIXED_OP(saturate1,NAME,)
+#define FIXED_SATURATE2_TEMP(NAME)	FIXED_OP(saturate2,NAME,)
+#define FIXED_MULHELPER_TEMP(NAME)	FIXED_OP(mulhelper,NAME,)
+#define FIXED_DIVHELPER_TEMP(NAME)	FIXED_OP(divhelper,NAME,)
+#define FIXED_ASHLHELPER_TEMP(NAME)	FIXED_OP(ashlhelper,NAME,)
+#define FIXED_ADD_TEMP(NAME)	FIXED_OP(add,NAME,3)
+#define FIXED_SSADD_TEMP(NAME)	FIXED_OP(ssadd,NAME,3)
+#define FIXED_USADD_TEMP(NAME)	FIXED_OP(usadd,NAME,3)
+#define FIXED_SUB_TEMP(NAME)	FIXED_OP(sub,NAME,3)
+#define FIXED_SSSUB_TEMP(NAME)	FIXED_OP(sssub,NAME,3)
+#define FIXED_USSUB_TEMP(NAME)	FIXED_OP(ussub,NAME,3)
+#define FIXED_MUL_TEMP(NAME)	FIXED_OP(mul,NAME,3)
+#define FIXED_SSMUL_TEMP(NAME)	FIXED_OP(ssmul,NAME,3)
+#define FIXED_USMUL_TEMP(NAME)	FIXED_OP(usmul,NAME,3)
+#define FIXED_DIV_TEMP(NAME)	FIXED_OP(div,NAME,3)
+#define FIXED_UDIV_TEMP(NAME)	FIXED_OP(udiv,NAME,3)
+#define FIXED_SSDIV_TEMP(NAME)	FIXED_OP(ssdiv,NAME,3)
+#define FIXED_USDIV_TEMP(NAME)	FIXED_OP(usdiv,NAME,3)
+#define FIXED_NEG_TEMP(NAME)	FIXED_OP(neg,NAME,2)
+#define FIXED_SSNEG_TEMP(NAME)	FIXED_OP(ssneg,NAME,2)
+#define FIXED_USNEG_TEMP(NAME)	FIXED_OP(usneg,NAME,2)
+#define FIXED_ASHL_TEMP(NAME)	FIXED_OP(ashl,NAME,3)
+#define FIXED_ASHR_TEMP(NAME)	FIXED_OP(ashr,NAME,3)
+#define FIXED_LSHR_TEMP(NAME)	FIXED_OP(lshr,NAME,3)
+#define FIXED_SSASHL_TEMP(NAME)	FIXED_OP(ssashl,NAME,3)
+#define FIXED_USASHL_TEMP(NAME)	FIXED_OP(usashl,NAME,3)
+#define FIXED_CMP_TEMP(NAME)	FIXED_OP(cmp,NAME,2)
 
 #if defined (MODE_NAME)
 #if defined (DINT_C_TYPE)
@@ -1146,14 +1150,19 @@ extern FIXED_C_TYPE FIXED_USASHL (FIXED_
 #define TO_HAVE_PADDING_BITS	(TO_PADDING_BITS > 0)
 #endif /* TO_TYPE == 4  */
 
-#define FIXED_CONVERT_OP(OP,FROM,TO)	OP ## FROM ## TO
-#define FIXED_CONVERT_OP2(OP,FROM,TO)	OP ## FROM ## TO ## 2
-#define FRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(__fract,N1,N2)
-#define FRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(__fract,N1,N2)
-#define SATFRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(__satfract,N1,N2)
-#define SATFRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(__satfract,N1,N2)
-#define FRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(__fractuns,N1,N2)
-#define SATFRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(__satfractuns,N1,N2)
+#ifdef LIBGCC2_GNU_PREFIX
+#define FIXED_CONVERT_OP(OP,FROM,TO)	__gnu_ ## OP ## FROM ## TO
+#define FIXED_CONVERT_OP2(OP,FROM,TO)	__gnu_ ## OP ## FROM ## TO ## 2
+#else
+#define FIXED_CONVERT_OP(OP,FROM,TO)	__ OP ## FROM ## TO
+#define FIXED_CONVERT_OP2(OP,FROM,TO)	__ OP ## FROM ## TO ## 2
+#endif
+#define FRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(fract,N1,N2)
+#define FRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(fract,N1,N2)
+#define SATFRACT_TEMP(N1,N2)		FIXED_CONVERT_OP(satfract,N1,N2)
+#define SATFRACT2_TEMP(N1,N2)		FIXED_CONVERT_OP2(satfract,N1,N2)
+#define FRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(fractuns,N1,N2)
+#define SATFRACTUNS_TEMP(N1,N2)		FIXED_CONVERT_OP(satfractuns,N1,N2)
 
 /* Define conversions from fixed-point to fixed-point.  */
 #if FROM_TYPE == 4 && TO_TYPE == 4
Index: trunk/gcc/system.h
===================================================================
--- trunk.orig/gcc/system.h
+++ trunk/gcc/system.h
@@ -762,8 +762,8 @@ extern void fancy_abort (const char *, i
 	HOT_TEXT_SECTION_NAME LEGITIMATE_CONSTANT_P
 
 /* Target macros only used for code built for the target, that have
-   moved to libgcc-tm.h.  */
- #pragma GCC poison DECLARE_LIBRARY_RENAMES
+   moved to libgcc-tm.h or have never been present elsewhere.  */
+ #pragma GCC poison DECLARE_LIBRARY_RENAMES LIBGCC2_GNU_PREFIX
 
 /* Other obsolete target macros, or macros that used to be in target
    headers and were not used, and may be obsolete or may never have

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 12/11: htdocs
  2011-05-13 16:28     ` Bernd Schmidt
@ 2011-05-14  0:53       ` Gerald Pfeifer
  0 siblings, 0 replies; 99+ messages in thread
From: Gerald Pfeifer @ 2011-05-14  0:53 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, GCC Patches

On Fri, 13 May 2011, Bernd Schmidt wrote:
>> I forgot about it in my previous message, but there should be a release 
>> note in gcc-4.7/changes.html as well.
> New version below.

This looks good, thank you!

If you later want to refer to that part of the release notes directly,
you could write   <h3 id="c6x">C6X</h3>   in the release notes, but that
is really up to you.

Gerald

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 9/11: Allow defining attributes in terms of another
  2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
@ 2011-05-16 18:35   ` Bernd Schmidt
  2011-05-25 10:27   ` Hans-Peter Nilsson
  1 sibling, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-16 18:35 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 734 bytes --]

On 05/10/2011 03:47 PM, Bernd Schmidt wrote:
> I've found it useful to use a construct such as the following:
> 
> (define_attr "units64"
>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>   (const_string "unknown"))
> 
> (define_attr "units64p"
>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>   (attr "units64"))
> 
> to define one attribute in terms of another by default, allowing
> individual insn patterns to override the definition of "units64p" where
> necessary. This patch adds support for this in genattrtab.

Here's a new version, which emits casts to avoid C/C++ warnings when
compiled with --enable-werror-always.

Bootstrapped on i686-linux, and cross-compilers built for arm and c6x.
An i686-linux testrun is in progress.


Bernd

[-- Attachment #2: ga-attr.diff --]
[-- Type: text/plain, Size: 1634 bytes --]

	* genattrtab.c (evaluate_eq_attr): Allow an attribute to be defined
	in terms of another.
	(write_attr_value): Write a cast if necessary.

Index: gcc/genattrtab.c
===================================================================
--- gcc/genattrtab.c.orig
+++ gcc/genattrtab.c
@@ -1916,6 +1916,37 @@ evaluate_eq_attr (rtx exp, struct attr_d
   rtx newexp;
   int i;
 
+  while (GET_CODE (value) == ATTR)
+    {
+      struct attr_value *av = NULL;
+
+      attr = find_attr (&XSTR (value, 0), 0);
+
+      if (insn_code_values)
+        {
+          struct attr_value_list *iv;
+          for (iv = insn_code_values[insn_code]; iv; iv = iv->next)
+            if (iv->attr == attr)
+              {
+                av = iv->av;
+                break;
+              }
+        }
+      else
+        {
+          struct insn_ent *ie;
+          for (av = attr->first_value; av; av = av->next)
+            for (ie = av->first_insn; ie; ie = ie->next)
+              if (ie->def->insn_code == insn_code)
+                goto got_av;
+        }
+      if (av)
+        {
+        got_av:
+          value = av->value;
+        }
+    }
+
   switch (GET_CODE (value))
     {
     case CONST_STRING:
@@ -4119,6 +4150,13 @@ write_attr_value (struct attr_desc *attr
     case ATTR:
       {
 	struct attr_desc *attr2 = find_attr (&XSTR (value, 0), 0);
+	if (attr->enum_name)
+	  printf ("(enum %s)", attr->enum_name);
+	else if (!attr->is_numeric)
+	  printf ("(enum attr_%s)", attr->name);
+	else if (!attr2->is_numeric)
+	  printf ("(int)");
+
 	printf ("get_attr_%s (%s)", attr2->name,
 		(attr2->is_const ? "" : "insn"));
       }

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-13 15:52       ` Joseph S. Myers
  2011-05-13 16:00         ` Bernd Schmidt
@ 2011-05-16 18:45         ` Bernd Schmidt
  2011-06-16 21:45           ` Joseph S. Myers
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-16 18:45 UTC (permalink / raw)
  To: Joseph S. Myers; +Cc: GCC Patches, Paul Brook

[-- Attachment #1: Type: text/plain, Size: 1983 bytes --]

On 05/13/2011 02:46 PM, Joseph S. Myers wrote:
> 
> I had thought there were some soft-fp files in libgcc/, but actually it 
> appears there are just wrappers (see config/i386/64) including files from 
> libgcc/config/.  Moving non-soft-fp files to libgcc/config/ should work, 
> however.

I've now tried to move lib1funcs.asm, but that fails when building
non-default multilibs since the source file path is wrong. Presumably it
would work if split into multiple files, but that would lose the ability
to generate multiple object files from the same source function which we
make use of.

I also see no point in having half the files in one directory and the
other half elsewhere.

>>> * Add the two new targets to contrib/config-list.mk (and confirm they do 
>>> pass --enable-werror-always builds with current trunk GCC).
>>
>> Added. I've tried to change my builds to use that option, but there are
>> lots of errors that appear unrelated to the C6X port. c6x.o compiles
>> without warnings.
> 
> There shouldn't be lots of errors; Joern does such builds frequently.  
> Note that you need to start with a *current native trunk compiler* and use 
> that when building the cross compiler; GCC is only expected to build 
> cleanly with -Werror when the build uses the same version of GCC, not when 
> it uses an older release.

Okay, that showed a few C/C++ warnings which I've fixed.

>> +#define PREFERRED_RELOAD_CLASS(x, class) (class)

Removed.

>> +GCC_4.5.0 {
> 
> 4.7.0 seems more appropriate for a new configuration.

Changed. Also added the new entry in libgcc-std.ver.in.

>> +  __c6xabi_divi
>> +  __c6xabi_divu
>> +  __c6xabi_remu
>> +  __c6xabi_remi
>> +  __c6xabi_divremu
>> +  __c6xabi_divremi
> 
>> +  __c6xabi_strasgi_64plus
>> +  __c6xabi_push_rts
>> +  __c6xabi_pop_rts
> 
> These are all marked hidden in lib1funcs.asm, presumably because of their 
> special register use conventions, so it doesn't make sense to give them 
> symbol versions.

Removed.


Bernd

[-- Attachment #2: c6xport.diff.gz --]
[-- Type: application/x-gzip, Size: 98333 bytes --]

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-12 18:20     ` Bernd Schmidt
@ 2011-05-17  7:19       ` Paolo Bonzini
  2011-05-27 17:40         ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Paolo Bonzini @ 2011-05-17  7:19 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, GCC Patches

On 05/12/2011 05:40 PM, Bernd Schmidt wrote:
> +  if (targetm.calls.function_arg_round_to_arg_boundary (passed_mode, type))
> +    round_boundary = boundary;
> +  else
> +    round_boundary = PARM_BOUNDARY;

Why add an if, instead of making the new target hook 
function_arg_round_boundary?  The default implementation can then reuse 
default_function_arg_boundary and C6X will redefine it to 
c6x_function_arg_boundary.

Paolo

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
  2011-05-13 15:23   ` Joseph S. Myers
@ 2011-05-17  7:20   ` Paolo Bonzini
  2011-05-24 10:33   ` Ian Lance Taylor
  2 siblings, 0 replies; 99+ messages in thread
From: Paolo Bonzini @ 2011-05-17  7:20 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Henderson, Stuart, Mike Frysinger

On 05/13/2011 03:40 PM, Bernd Schmidt wrote:
>
> 	gcc/
> 	* libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if
> 	LIBGCC2_GNU_PREFIX is defined.
> 	(__N): New macro.
> 	(__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2,
> 	__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3,
> 	__divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack,
> 	__clz_tab): Define using __N.
> 	(__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if
> 	COMPAT_SIMODE_TRAPPING_ARITHMETIC.
> 	* target.def (libfunc_gnu_prefix): New hook.
> 	* doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document.
> 	(TARGET_LIBFUNC_GNU_PREFIX): Add hook.
> 	* doc/tm.texi: Regenerate.
> 	* optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into
> 	account.
> 	(gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
> 	(init_optabs): Likewise for the bswap libfuncs.
> 	* tree.c (build_common_builtin_nodes): Likewise for complex multiply
> 	and divide.
> 	* config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir).
> 	* config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise.
> 	* libgcc-std.ver: Remove.
> 	* Makefile.in (srcdirify): Handle $$(libgcc_objdir).
> 	* config/bfin/libgcc-bfin.ver: Remove.
> 	* config/bfin/t-bfin-linux (SHLIB_MAPFILES): Remove.
> 	* config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for
> 	libgcc-std.ver.
> 	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
> 	* config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise.
> 	* config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise.
> 	* config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise.
> 	* config/sparc/t-linux (SHLIB_MAPFILES): Likewise.
> 	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
> 	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
> 	* config/fixed-bit.h (FIXED_OP): Define differently depending on
> 	LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores.
> 	(FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise.
>
> 	libgcc/
> 	* libgcc-std.ver.in: New file.
> 	* Makefile.in (LIBGCC_VER_GNU_PREFIX, LIBGCC_VER_SYMBOLS_PREFIX): New
> 	variables.
> 	(libgcc-std.ver): New rule.
> 	* config/t-gnu-prefix: New file.
> 	* config/t-underscore-prefix: New file.

Build parts are ok.

Paolo

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 13/11: MAINTAINERS
  2011-05-13 14:57   ` C6X port 13/11: MAINTAINERS Bernd Schmidt
@ 2011-05-22 18:26     ` Gerald Pfeifer
  0 siblings, 0 replies; 99+ messages in thread
From: Gerald Pfeifer @ 2011-05-22 18:26 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, gcc-patches, gcc

On Fri, 13 May 2011, Bernd Schmidt wrote:
> Patch appended.

Just raised on the steering committee.

Gerald

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (12 preceding siblings ...)
  2011-05-13 14:26 ` C6X port 12/11: htdocs Bernd Schmidt
@ 2011-05-23 10:26 ` Bernd Schmidt
  2011-05-25  7:15   ` Vladimir Makarov
  2011-05-23 10:33 ` Ping: C6X miscellaneous new hooks Bernd Schmidt
                   ` (2 subsequent siblings)
  16 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-23 10:26 UTC (permalink / raw)
  To: GCC Patches; +Cc: Vladimir N. Makarov

Ping: C6X scheduler changes.

http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00747.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00749.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00750.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00753.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00755.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Ping: C6X miscellaneous new hooks
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (13 preceding siblings ...)
  2011-05-23 10:26 ` The TI C6X port Bernd Schmidt
@ 2011-05-23 10:33 ` Bernd Schmidt
  2011-05-23 10:44 ` Ping: C6X libgcc changes Bernd Schmidt
  2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-23 10:33 UTC (permalink / raw)
  To: GCC Patches

http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00760.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Ping: C6X libgcc changes
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (14 preceding siblings ...)
  2011-05-23 10:33 ` Ping: C6X miscellaneous new hooks Bernd Schmidt
@ 2011-05-23 10:44 ` Bernd Schmidt
  2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
  16 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-23 10:44 UTC (permalink / raw)
  To: GCC Patches; +Cc: Ian Lance Taylor

http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00992.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
  2011-05-13 15:23   ` Joseph S. Myers
  2011-05-17  7:20   ` Paolo Bonzini
@ 2011-05-24 10:33   ` Ian Lance Taylor
  2011-05-26 12:56     ` Bernd Schmidt
  2 siblings, 1 reply; 99+ messages in thread
From: Ian Lance Taylor @ 2011-05-24 10:33 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Henderson, Stuart, Mike Frysinger

>	gcc/
>	* libgcc2.h (__NW, __NDW): Define using a __gnu_ prefix if
>	LIBGCC2_GNU_PREFIX is defined.
>	(__N): New macro.
>	(__powisf2, __powidf2, __powitf2, __powixf2, __bswapsi2, __bswapdi2,
>	__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3, __divxc3,
>	__divtc3, __udiv_w_sdiv, __clear_cache, __enable_execute_stack,
>	__clz_tab): Define using __N.
>	(__absvsi2, __negvsi2, __addvsi3, __subvsi3, __mulvsi3): Likewise if
>	COMPAT_SIMODE_TRAPPING_ARITHMETIC.
>	* target.def (libfunc_gnu_prefix): New hook.
>	* doc/tm.texi.in (LIBGCC2_GNU_PREFIX): Document.
>	(TARGET_LIBFUNC_GNU_PREFIX): Add hook.
>	* doc/tm.texi: Regenerate.
>	* system.h (LIBGCC2_GNU_PREFIX): Poison.
>	* optabs.c (gen_libfunc): Take the libfunc_gnu_prefix hook into
>	account.
>	(gen_interclass_conv_libfunc, gen_intraclass_conv_libfunc): Likewise.
>	(init_optabs): Likewise for the bswap libfuncs.
>	* tree.c (build_common_builtin_nodes): Likewise for complex multiply
>	and divide.
>	* config/t-slibgcc-elf-ver (SHLIB_MAPFILES): Use $$(libgcc_objdir).
>	* config/t-slibgcc-sld (SHLIB_MAPFILES): Likewise.
>	* libgcc-std.ver: Remove.
>	* Makefile.in (srcdirify): Handle $$(libgcc_objdir).
>	* config/frv/t-linux (SHLIB_MAPFILES): Use $$(libgcc_objdir) for
>	libgcc-std.ver.
>	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
>	* config/mips/t-slibgcc-irix (SHLIB_MAPFILES): Likewise.
>	* config/rs6000/t-aix43 (SHLIB_MAPFILES): Likewise.
>	* config/rs6000/t-aix52 (SHLIB_MAPFILES): Likewise.
>	* config/sparc/t-linux (SHLIB_MAPFILES): Likewise.
>	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
>	* config/i386/t-linux (SHLIB_MAPFILES): Likewise.
>	* config/fixed-bit.h (FIXED_OP): Define differently depending on
>	LIBGCC2_GNU_PREFIX. All uses changed not to pass leading underscores.
>	(FIXED_CONVERT_OP, FIXED_CONVERT_OP2): Likewise.
>
>	libgcc/
>	* libgcc-std.ver.in: New file.
>	* Makefile.in (LIBGCC_VER_GNU_PREFIX, LIBGCC_VER_SYMBOLS_PREFIX): New
>	variables.
>	(libgcc-std.ver): New rule.
>	* config/t-gnu-prefix: New file.


> + /* Add a __gnu_ prefix to library functions rather than just __.  */
> +DEFHOOKPOD
> +(libfunc_gnu_prefix,
> + "This hook can be used to override the default prefix given to library\n\
> +routines. Normally, this is just two underscores, @code{__}, but\n\
> +it if changed to true, then for example a name like @code{__gnu_muldi3}\n\
> +is used instead of the default @code{__muldi3}. This applies only to\n\
> +functions defined in @file{libgcc2.c}.",
> +  bool, false)

This documentation needs to be better.  This does not permit
overridding the default
prefix.  I'm not sure what "it if changed to true" is trying to say.
How about something more like:

If false (the default) internal library routines start with two underscores.
If set to true, these routines start with @code{__gnu_} instead.  E.g.,
@code{__muldi3} changes to @code{__gnu_muldi3}.  This currently only
affects functions defined in @file{libgcc2.c}.  If this is set to true, the
@file{tm.h} file must also @code{#define LIBGCC2_GNU_PREFIX}.

> +@defmac LIBGCC2_GNU_PREFIX
> +This macro corresponds to the @code{TARGET_LIBFUNC_GNU_PREFIX} target
> +hook and should be defined if this hook is overriden to be true.  It
> +causes function names in libgcc to be changed to use a @code{__gnu_}
> +prefix for their name rather than the default @code{__}.  A port which
> +uses this macro should also arrange to use @file{t-gnu-prefix} in
> +the libgcc @file{config.host}.
> +@end defmac

s/this hook/that hook/

This is OK with those changes.

Thanks.

Ian

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-23 10:26 ` The TI C6X port Bernd Schmidt
@ 2011-05-25  7:15   ` Vladimir Makarov
  2011-05-27 16:33     ` Bernd Schmidt
  2011-07-13 10:26     ` Bernd Schmidt
  0 siblings, 2 replies; 99+ messages in thread
From: Vladimir Makarov @ 2011-05-25  7:15 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On 11-05-23 5:45 AM, Bernd Schmidt wrote:
> Ping: C6X scheduler changes.
>
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00747.html
I think it is ok.  I spent a lot of time looking at the change.  It 
looks ok to me although it is hard to be sure because the code is too 
complicated.  So it is good thing that you are trying to simplify it.
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00749.html
Ok.
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00750.html
Ok.  But changelog entry for sched_change_pattern is absent.
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00753.html
It is a really big patch.  I need more time to look at it.
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00755.html
>
Ok. Only changelog entry for deps_analyze_insn is missed.

So I need to finish review of the 4th patch (I hope to finish it 
tomorrow).  All other patches is ok.
Thanks for the patches, Bernd.

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 4/11: Backtracking scheduler
  2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
  2011-05-11  9:14   ` Richard Sandiford
@ 2011-05-25 10:16   ` Hans-Peter Nilsson
  1 sibling, 0 replies; 99+ messages in thread
From: Hans-Peter Nilsson @ 2011-05-25 10:16 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Tue, 10 May 2011, Bernd Schmidt wrote:
> On C6X, every jump instruction has 5 delay slots which can be filled
> with normally scheduled instructions. With an issue width of 8
> insns/cycle, this means that up to 40 insns can be issued after the jump
> insn before the jump's side-effect takes place. I didn't particularaly
> feel like using reorg.c to deal with this,

No kidding... multi-delay-slot bugs just waiting for you...

> hence these scheduler patches.

THANK YOU for these first steps!

brgds, H-P

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 9/11: Allow defining attributes in terms of another
  2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
  2011-05-16 18:35   ` Bernd Schmidt
@ 2011-05-25 10:27   ` Hans-Peter Nilsson
  2011-05-25 12:03     ` Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: Hans-Peter Nilsson @ 2011-05-25 10:27 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Tue, 10 May 2011, Bernd Schmidt wrote:

> I've found it useful to use a construct such as the following:
>
> (define_attr "units64"
>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>   (const_string "unknown"))
>
> (define_attr "units64p"
>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>   (attr "units64"))
>
> to define one attribute in terms of another by default,

So it's just the units64p default value taken from the units64
default value or units64p gets its default value from the final
units64 value?

> allowing
> individual insn patterns to override the definition of "units64p" where
> necessary. This patch adds support for this in genattrtab.

I'm not sure I get it, and I think I would be helped by seeing
the documentation update. ;)

brgds, H-P
PS. ok, I could look in the port, but the documentation still needs updating, right?

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 9/11: Allow defining attributes in terms of another
  2011-05-25 10:27   ` Hans-Peter Nilsson
@ 2011-05-25 12:03     ` Bernd Schmidt
  2011-05-25 14:22       ` Hans-Peter Nilsson
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-25 12:03 UTC (permalink / raw)
  To: Hans-Peter Nilsson; +Cc: GCC Patches

On 05/25/2011 08:56 AM, Hans-Peter Nilsson wrote:
> On Tue, 10 May 2011, Bernd Schmidt wrote:
> 
>> I've found it useful to use a construct such as the following:
>>
>> (define_attr "units64"
>>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>>   (const_string "unknown"))
>>
>> (define_attr "units64p"
>>   "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
>>   (attr "units64"))
>>
>> to define one attribute in terms of another by default,
> 
> So it's just the units64p default value taken from the units64
> default value or units64p gets its default value from the final
> units64 value?

units64p has the final value of units64, unless an insn explicitly gives
it a different value. This is because C64X+ is really very similar to
C64X in most respects. We then select which of the various units
definitions to use for a given CPU:

(define_attr "units"
  "unknown,d,d_addr,l,m,s,dl,ds,dls,ls"
  (cond [(eq_attr "cpu" "c62x")
	   (attr "units62")
	 (eq_attr "cpu" "c67x")
	   (attr "units67")
	 (eq_attr "cpu" "c67xp")
	   (attr "units67p")
	 (eq_attr "cpu" "c64x")
	   (attr "units64")
	 (eq_attr "cpu" "c64xp")
	   (attr "units64p")
	 (eq_attr "cpu" "c674x")
	   (attr "units674")
	]
	(const_string "unknown")))

>> allowing
>> individual insn patterns to override the definition of "units64p" where
>> necessary. This patch adds support for this in genattrtab.
> 
> I'm not sure I get it, and I think I would be helped by seeing
> the documentation update. ;)

I'm not sure where you're looking for added documentation for this
patch. It just generalizes the define_attr mechanism a little to allow
one more kind of expression.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-13 18:24     ` Bernd Schmidt
@ 2011-05-25 14:00       ` H.J. Lu
  2011-05-25 14:20         ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: H.J. Lu @ 2011-05-25 14:00 UTC (permalink / raw)
  To: Bernd Schmidt
  Cc: Joseph S. Myers, GCC Patches, Henderson, Stuart, Mike Frysinger

On Fri, May 13, 2011 at 9:10 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> On 05/13/2011 04:26 PM, Joseph S. Myers wrote:
>> On Fri, 13 May 2011, Bernd Schmidt wrote:
>>
>>> The following patch adds a target hook and a corresponding LIBGCC2_
>>> macro which control the generation of library function names. It also
>>> makes libgcc-std.ver a generated file, built from libgcc-std.ver.in by
>>> replacing some placeholders with the correct prefixes. While I was
>>> there, I also added functionality to generate a version of this file
>>> with an extra underscore for the Blackfin port.
>>
>> But the linker was changed to use C symbol names in linker scripts and I
>> was told that this script in GCC would be removed in consequence.
>>
>> http://sourceware.org/ml/binutils/2010-12/msg00375.html
>
> Oh well. Dropped.
>
>> Any new target macro for use only in target libraries should, in my view,
>> be poisoned in the host system.h from the start to ensure that no-one
>> accidentally adds definitions to the host tm.h.  This would be alongside
>> the existing
>>
>> /* Target macros only used for code built for the target, that have
>>    moved to libgcc-tm.h.  */
>>  #pragma GCC poison DECLARE_LIBRARY_RENAMES
>
> Done. New patch below, now testing.
>
>

I think it may have caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160


-- 
H.J.

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 14:00       ` H.J. Lu
@ 2011-05-25 14:20         ` Bernd Schmidt
  2011-05-25 14:26           ` H.J. Lu
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-25 14:20 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Joseph S. Myers, GCC Patches

On 05/25/2011 01:37 PM, H.J. Lu wrote:

> I think it may have caused:
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160

Looks like it. Not quite sure how to fix it yet. Do you know what files
such as i386/64/_divtc3.c are trying to achieve?


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 9/11: Allow defining attributes in terms of another
  2011-05-25 12:03     ` Bernd Schmidt
@ 2011-05-25 14:22       ` Hans-Peter Nilsson
  2011-05-26 13:51         ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Hans-Peter Nilsson @ 2011-05-25 14:22 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Wed, 25 May 2011, Bernd Schmidt wrote:

> I'm not sure where you're looking for added documentation for this
> patch.

I guess no surprise that'd be md.texi node Defining Attributes,
or an updated example in node Attr Example since the
documentation for "default" basically just refers to it.  Or
perhaps better node Expressions where (attr x) is documented,
since it says it's mostly useful for numeric attributes and not
so for non-numeric attributes.  Perhaps add after that sentence
"It can also be used to yield the value of another attribute,
useful to e.g. set the value of the current attribute if they
share a domain".  You can probably find a better wording. :)

> It just generalizes the define_attr mechanism a little to
> allow one more kind of expression.

Yes, the documentation is a bit terse, isn't it.  But the idea
that you can redirect to another attribute instead of referring
to it in a conditional like in eq_attr seems to me new enough to
warrant a line.

brgds, H-P

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 14:20         ` Bernd Schmidt
@ 2011-05-25 14:26           ` H.J. Lu
  2011-05-25 14:29             ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: H.J. Lu @ 2011-05-25 14:26 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, GCC Patches

On Wed, May 25, 2011 at 6:42 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> On 05/25/2011 01:37 PM, H.J. Lu wrote:
>
>> I think it may have caused:
>>
>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160
>
> Looks like it. Not quite sure how to fix it yet. Do you know what files
> such as i386/64/_divtc3.c are trying to achieve?
>

It provides backward compatibility with symbol versioning:

[hjl@gnu-4 64]$ readelf -s /lib64/libgcc_s.so.1| grep __powitf2
    52: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@@GCC_4.3.0
    54: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@GCC_4.0.0
[hjl@gnu-4 64]$


-- 
H.J.

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 14:26           ` H.J. Lu
@ 2011-05-25 14:29             ` Bernd Schmidt
  2011-05-25 15:14               ` Jakub Jelinek
  2011-05-25 17:28               ` H.J. Lu
  0 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-25 14:29 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Joseph S. Myers, GCC Patches, Ian Lance Taylor

[-- Attachment #1: Type: text/plain, Size: 930 bytes --]

On 05/25/2011 01:45 PM, H.J. Lu wrote:
> On Wed, May 25, 2011 at 6:42 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>> On 05/25/2011 01:37 PM, H.J. Lu wrote:
>>
>>> I think it may have caused:
>>>
>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160
>>
>> Looks like it. Not quite sure how to fix it yet. Do you know what files
>> such as i386/64/_divtc3.c are trying to achieve?
>>
> 
> It provides backward compatibility with symbol versioning:
> 
> [hjl@gnu-4 64]$ readelf -s /lib64/libgcc_s.so.1| grep __powitf2
>     52: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@@GCC_4.3.0
>     54: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@GCC_4.0.0
> [hjl@gnu-4 64]$

That leaves me as clueless as before. Why does i386/64 need this but not
other targets (such as i386/32), and why only those three functions
(from the ones in libgcc)?

Anyhow, below is one possible way of fixing it.


Bernd


[-- Attachment #2: lgcc-ifdef.diff --]
[-- Type: text/plain, Size: 1688 bytes --]

	PR bootstrap/49160
	* libgcc2.h (__powisf2, __powidf2, __powitf2, __powixf2,
	__mulsc3, __muldc3, __mulxc3, __multc3, __divsc3, __divdc3,
	__divxc3, __divtc3): Wrap definitions in #ifndef.

Index: gcc/libgcc2.h
===================================================================
--- gcc/libgcc2.h	(revision 174187)
+++ gcc/libgcc2.h	(working copy)
@@ -324,23 +324,48 @@ typedef int shift_count_type __attribute
 #define __parityDI2	__NDW(parity,2)
 
 #define __clz_tab		__N(clz_tab)
+#define __bswapsi2		__N(bswapsi2)
+#define __bswapdi2		__N(bswapdi2)
+#define __udiv_w_sdiv		__N(udiv_w_sdiv)
+#define __clear_cache		__N(clear_cache)
+#define __enable_execute_stack	__N(enable_execute_stack)
+
+#ifndef __powisf2
 #define __powisf2		__N(powisf2)
+#endif
+#ifndef __powidf2
 #define __powidf2		__N(powidf2)
+#endif
+#ifndef __powitf2
 #define __powitf2		__N(powitf2)
+#endif
+#ifndef __powixf2
 #define __powixf2		__N(powixf2)
-#define __bswapsi2		__N(bswapsi2)
-#define __bswapdi2		__N(bswapdi2)
+#endif
+#ifndef __mulsc3
 #define __mulsc3		__N(mulsc3)
+#endif
+#ifndef __muldc3
 #define __muldc3		__N(muldc3)
+#endif
+#ifndef __mulxc3
 #define __mulxc3		__N(mulxc3)
+#endif
+#ifndef __multc3
 #define __multc3		__N(multc3)
+#endif
+#ifndef __divsc3
 #define __divsc3		__N(divsc3)
+#endif
+#ifndef __divdc3
 #define __divdc3		__N(divdc3)
+#endif
+#ifndef __divxc3
 #define __divxc3		__N(divxc3)
+#endif
+#ifndef __divtc3
 #define __divtc3		__N(divtc3)
-#define __udiv_w_sdiv		__N(udiv_w_sdiv)
-#define __clear_cache		__N(clear_cache)
-#define __enable_execute_stack	__N(enable_execute_stack)
+#endif
 
 extern DWtype __muldi3 (DWtype, DWtype);
 extern DWtype __divdi3 (DWtype, DWtype);

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 14:29             ` Bernd Schmidt
@ 2011-05-25 15:14               ` Jakub Jelinek
  2011-05-25 17:28               ` H.J. Lu
  1 sibling, 0 replies; 99+ messages in thread
From: Jakub Jelinek @ 2011-05-25 15:14 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: H.J. Lu, Joseph S. Myers, GCC Patches, Ian Lance Taylor

On Wed, May 25, 2011 at 01:52:45PM +0000, Bernd Schmidt wrote:
> On 05/25/2011 01:45 PM, H.J. Lu wrote:
> > On Wed, May 25, 2011 at 6:42 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> >> On 05/25/2011 01:37 PM, H.J. Lu wrote:
> >>
> >>> I think it may have caused:
> >>>
> >>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160
> >>
> >> Looks like it. Not quite sure how to fix it yet. Do you know what files
> >> such as i386/64/_divtc3.c are trying to achieve?
> >>
> > 
> > It provides backward compatibility with symbol versioning:
> > 
> > [hjl@gnu-4 64]$ readelf -s /lib64/libgcc_s.so.1| grep __powitf2
> >     52: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@@GCC_4.3.0
> >     54: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@GCC_4.0.0
> > [hjl@gnu-4 64]$
> 
> That leaves me as clueless as before. Why does i386/64 need this but not
> other targets (such as i386/32), and why only those three functions
> (from the ones in libgcc)?

The comment in config/i386/libgcc-glibc.ver explains it:

# Those symbols had improper versions when they were added to gcc 4.3.0.
# We corrected the default version to GCC_4.3.0.  But we keep the old
# version for backward binary compatibility.

It is not just 3 symbols, but 6 -
__netf2/__gttf2/__lttf2/__divtc3/__multc3/__powitf2.

	Jakub

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 14:29             ` Bernd Schmidt
  2011-05-25 15:14               ` Jakub Jelinek
@ 2011-05-25 17:28               ` H.J. Lu
  2011-05-25 17:30                 ` Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: H.J. Lu @ 2011-05-25 17:28 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, GCC Patches, Ian Lance Taylor

On Wed, May 25, 2011 at 6:52 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> On 05/25/2011 01:45 PM, H.J. Lu wrote:
>> On Wed, May 25, 2011 at 6:42 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>>> On 05/25/2011 01:37 PM, H.J. Lu wrote:
>>>
>>>> I think it may have caused:
>>>>
>>>> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49160
>>>
>>> Looks like it. Not quite sure how to fix it yet. Do you know what files
>>> such as i386/64/_divtc3.c are trying to achieve?
>>>
>>
>> It provides backward compatibility with symbol versioning:
>>
>> [hjl@gnu-4 64]$ readelf -s /lib64/libgcc_s.so.1| grep __powitf2
>>     52: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@@GCC_4.3.0
>>     54: 0000003e8a80d170   167 FUNC    GLOBAL DEFAULT   12 __powitf2@GCC_4.0.0
>> [hjl@gnu-4 64]$
>
> That leaves me as clueless as before. Why does i386/64 need this but not
> other targets (such as i386/32), and why only those three functions
> (from the ones in libgcc)?
>
> Anyhow, below is one possible way of fixing it.

It fixed the libgcc failure.  Can you check it in?

Thanks.

-- 
H.J.

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-25 17:28               ` H.J. Lu
@ 2011-05-25 17:30                 ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-25 17:30 UTC (permalink / raw)
  To: H.J. Lu; +Cc: Joseph S. Myers, GCC Patches, Ian Lance Taylor

On 05/25/2011 04:38 PM, H.J. Lu wrote:
> On Wed, May 25, 2011 at 6:52 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>> Anyhow, below is one possible way of fixing it.
> 
> It fixed the libgcc failure.  Can you check it in?

I suppose it is reasonably obvious. Done.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-24 10:33   ` Ian Lance Taylor
@ 2011-05-26 12:56     ` Bernd Schmidt
  2011-05-27  6:23       ` Jack Howarth
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-26 12:56 UTC (permalink / raw)
  To: Ian Lance Taylor; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 458 bytes --]

It occurred to me to do another test, building libgcc with and without
the patch and comparing the binaries. That showed a problem - if there
are multiple version files, their order matters. In all cases where
$$(libgcc_objdir)/libgcc-std.ver occurs, it occurs first, so I've
changed the order in srcdirify to match. I also need to properly svn rm
the old libgcc-std.ver file.

Will check this in today after a bootstrap unless there are objections.


Bernd

[-- Attachment #2: libver-fix.diff --]
[-- Type: text/plain, Size: 1720 bytes --]

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 174276)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,9 @@
+2011-05-26  Bernd Schmidt  <bernds@codesourcery.com>
+
+	* Makefile.in (srcdirify): Change order so that libgcc_objdir is
+	substituted first.
+	* libgcc-std.ver: Delete file.
+
 2011-05-26  Jakub Jelinek  <jakub@redhat.com>
 
 	PR c++/49165
Index: gcc/Makefile.in
===================================================================
--- gcc/Makefile.in	(revision 174276)
+++ gcc/Makefile.in	(working copy)
@@ -1894,13 +1894,15 @@ cc1$(exeext): $(C_OBJS) cc1-checksum.o $
 LIB2ADD = $(LIB2FUNCS_EXTRA)
 LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA)
 
-# All source files for libgcc are either in the source directory (in
-# which case they will start with $(srcdir)), or generated into the build
-# directory (in which case they will be relative paths).
-srcdirify = $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
-            $(patsubst $$(libgcc_objdir)/%,%, \
+# All source files for libgcc are either generated in the libgcc build
+# directory which will be substituted for $$(libgcc_objdir), in the
+# source directory (in which case they will start with $(srcdir)), or
+# generated into the build directory (in which case they will be
+# relative paths).
+srcdirify = $(patsubst $$(libgcc_objdir)/%,%, \
 		$(filter $$(libgcc_objdir)%,$(1))) \
-            $(patsubst %,$$(gcc_objdir)/%, \
+	    $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
+	    $(patsubst %,$$(gcc_objdir)/%, \
 		$(filter-out $(srcdir)% $$(libgcc_objdir)%,$(1)))
 
 # The distinction between these two variables is no longer relevant,

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 9/11: Allow defining attributes in terms of another
  2011-05-25 14:22       ` Hans-Peter Nilsson
@ 2011-05-26 13:51         ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-26 13:51 UTC (permalink / raw)
  To: Hans-Peter Nilsson; +Cc: GCC Patches

On 05/25/2011 01:45 PM, Hans-Peter Nilsson wrote:
> On Wed, 25 May 2011, Bernd Schmidt wrote:
> 
>> I'm not sure where you're looking for added documentation for this
>> patch.
> 
> I guess no surprise that'd be md.texi node Defining Attributes,

That covers define_attr, not set_attr, so it seems inappropriate.

> or an updated example in node Attr Example since the
> documentation for "default" basically just refers to it.  Or
> perhaps better node Expressions where (attr x) is documented,
> since it says it's mostly useful for numeric attributes and not
> so for non-numeric attributes.  Perhaps add after that sentence
> "It can also be used to yield the value of another attribute,
> useful to e.g. set the value of the current attribute if they
> share a domain".  You can probably find a better wording. :)

To be honest I can't think of anything reasonable to add there. The
documentation already says you can use (attr "...") to return the value
of another attribute... all my patch did was make that actually work in
some situations.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-26 12:56     ` Bernd Schmidt
@ 2011-05-27  6:23       ` Jack Howarth
  2011-05-27  9:59         ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Jack Howarth @ 2011-05-27  6:23 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Ian Lance Taylor, GCC Patches

On Thu, May 26, 2011 at 12:04:43PM +0000, Bernd Schmidt wrote:
> It occurred to me to do another test, building libgcc with and without
> the patch and comparing the binaries. That showed a problem - if there
> are multiple version files, their order matters. In all cases where
> $$(libgcc_objdir)/libgcc-std.ver occurs, it occurs first, so I've
> changed the order in srcdirify to match. I also need to properly svn rm
> the old libgcc-std.ver file.
> 
> Will check this in today after a bootstrap unless there are objections.
> 

This patch breaks the bootstrap on all darwin targets...

http://gcc.gnu.org/regtest/HEAD/native-lastbuild.txt.gzip

make[3]: *** No rule to make target `/Users/regress/tbox/svn-gcc/libgcc/../gcc/libgcc-std.ver', needed by `libgcc.map'.  Stop.
make[3]: *** Waiting for unfinished jobs....

> 
> Bernd

> Index: gcc/ChangeLog
> ===================================================================
> --- gcc/ChangeLog	(revision 174276)
> +++ gcc/ChangeLog	(working copy)
> @@ -1,3 +1,9 @@
> +2011-05-26  Bernd Schmidt  <bernds@codesourcery.com>
> +
> +	* Makefile.in (srcdirify): Change order so that libgcc_objdir is
> +	substituted first.
> +	* libgcc-std.ver: Delete file.
> +
>  2011-05-26  Jakub Jelinek  <jakub@redhat.com>
>  
>  	PR c++/49165
> Index: gcc/Makefile.in
> ===================================================================
> --- gcc/Makefile.in	(revision 174276)
> +++ gcc/Makefile.in	(working copy)
> @@ -1894,13 +1894,15 @@ cc1$(exeext): $(C_OBJS) cc1-checksum.o $
>  LIB2ADD = $(LIB2FUNCS_EXTRA)
>  LIB2ADD_ST = $(LIB2FUNCS_STATIC_EXTRA)
>  
> -# All source files for libgcc are either in the source directory (in
> -# which case they will start with $(srcdir)), or generated into the build
> -# directory (in which case they will be relative paths).
> -srcdirify = $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
> -            $(patsubst $$(libgcc_objdir)/%,%, \
> +# All source files for libgcc are either generated in the libgcc build
> +# directory which will be substituted for $$(libgcc_objdir), in the
> +# source directory (in which case they will start with $(srcdir)), or
> +# generated into the build directory (in which case they will be
> +# relative paths).
> +srcdirify = $(patsubst $$(libgcc_objdir)/%,%, \
>  		$(filter $$(libgcc_objdir)%,$(1))) \
> -            $(patsubst %,$$(gcc_objdir)/%, \
> +	    $(patsubst $(srcdir)%,$$(gcc_srcdir)%,$(filter $(srcdir)%,$(1))) \
> +	    $(patsubst %,$$(gcc_objdir)/%, \
>  		$(filter-out $(srcdir)% $$(libgcc_objdir)%,$(1)))
>  
>  # The distinction between these two variables is no longer relevant,

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Prefixes for libgcc symbols (C6X 9.5/11)
  2011-05-27  6:23       ` Jack Howarth
@ 2011-05-27  9:59         ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-27  9:59 UTC (permalink / raw)
  To: Jack Howarth; +Cc: Ian Lance Taylor, GCC Patches

[-- Attachment #1: Type: text/plain, Size: 539 bytes --]

On 05/27/2011 02:32 AM, Jack Howarth wrote:
> This patch breaks the bootstrap on all darwin targets...
> 
> http://gcc.gnu.org/regtest/HEAD/native-lastbuild.txt.gzip
> 
> make[3]: *** No rule to make target `/Users/regress/tbox/svn-gcc/libgcc/../gcc/libgcc-std.ver', needed by `libgcc.map'.  Stop.
> make[3]: *** Waiting for unfinished jobs....

Yeah, I'd grepped gcc/config for occurrences of that file, but didn't
account for the half-transition to libgcc/. As reported in PR49173, the
following fixes it, and I've committed it.


Bernd

[-- Attachment #2: mapfiles.diff --]
[-- Type: text/plain, Size: 2270 bytes --]

Index: libgcc/ChangeLog
===================================================================
--- libgcc/ChangeLog	(revision 174320)
+++ libgcc/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2011-05-27  Bernd Schmidt  <bernds@codesourcery.com>
+
+	PR bootstrap/49173
+	* config/t-slibgcc-darwin (SHLIB_MAPFILES): Look for
+	libgcc-std.ver in the build directory.
+	* config/s390/t-linux (SHLIB_MAPFILES): Likewise.
+	* config/sh/t-linux (SHLIB_MAPFILES): Likewise.
+
 2011-05-25  Bernd Schmidt  <bernds@codesourcery.com>
 
 	* libgcc-std.ver.in: New file.
Index: libgcc/config/t-slibgcc-darwin
===================================================================
--- libgcc/config/t-slibgcc-darwin	(revision 174179)
+++ libgcc/config/t-slibgcc-darwin	(working copy)
@@ -24,7 +24,7 @@ SHLIB_LINK = $(CC) $(LIBGCC2_CFLAGS) -dy
 
 SHLIB_MKMAP = $(gcc_srcdir)/mkmap-flat.awk
 SHLIB_MKMAP_OPTS = -v leading_underscore=1
-SHLIB_MAPFILES += $(gcc_srcdir)/libgcc-std.ver $(gcc_srcdir)/libgcc-libsystem.ver
+SHLIB_MAPFILES += libgcc-std.ver $(gcc_srcdir)/libgcc-libsystem.ver
 
 # we're only going to build the stubs if the target slib is /usr/lib
 # there is no other case in which they're useful in a live system.
Index: libgcc/config/s390/t-linux
===================================================================
--- libgcc/config/s390/t-linux	(revision 174179)
+++ libgcc/config/s390/t-linux	(working copy)
@@ -2,6 +2,6 @@ DFP_ENABLE = true
 
 # Override t-slibgcc-elf-ver to export some libgcc symbols with
 # the symbol versions that glibc used.
-SHLIB_MAPFILES = $(gcc_srcdir)/libgcc-std.ver $(srcdir)/config/s390/libgcc-glibc.ver
+SHLIB_MAPFILES = libgcc-std.ver $(srcdir)/config/s390/libgcc-glibc.ver
 
 HOST_LIBGCC2_CFLAGS += -mlong-double-128
\ No newline at end of file
Index: libgcc/config/sh/t-linux
===================================================================
--- libgcc/config/sh/t-linux	(revision 174179)
+++ libgcc/config/sh/t-linux	(working copy)
@@ -5,7 +5,7 @@ HOST_LIBGCC2_CFLAGS = -fpic -mieee -DNO_
 # routines which should not be called via PLT.  We have to create
 # the list from scratch.
 SHLIB_MAPFILES = \
-	$(gcc_srcdir)/libgcc-std.ver \
+	libgcc-std.ver \
 	$(gcc_srcdir)/config/sh/libgcc-excl.ver \
 	$(gcc_srcdir)/config/sh/libgcc-glibc.ver
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-25  7:15   ` Vladimir Makarov
@ 2011-05-27 16:33     ` Bernd Schmidt
  2011-07-13 10:26     ` Bernd Schmidt
  1 sibling, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-27 16:33 UTC (permalink / raw)
  To: Vladimir Makarov; +Cc: GCC Patches

On 05/25/2011 12:29 AM, Vladimir Makarov wrote:
> So I need to finish review of the 4th patch (I hope to finish it
> tomorrow).  All other patches is ok.

Thanks, Vlad. I'm trickling them in now.

>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00755.html
>>
> Ok. Only changelog entry for deps_analyze_insn is missed.

Hmm? As far as I can tell it's there.

Anyhow, I've committed the second version of this, with Alex Monakov's
comment taken into account.

>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00750.html
> Ok.  But changelog entry for sched_change_pattern is absent. 

Will fix that, and I will also make a small change there to also reset
the cost for resolved dependencies, as these will be used when
recomputing INSN_TICK. That showed up on C6X with some followup patches
I was working on this week.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-17  7:19       ` Paolo Bonzini
@ 2011-05-27 17:40         ` Bernd Schmidt
  2011-05-27 23:26           ` Paolo Bonzini
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-27 17:40 UTC (permalink / raw)
  To: Paolo Bonzini; +Cc: Joseph S. Myers, GCC Patches

[-- Attachment #1: Type: text/plain, Size: 548 bytes --]

On 05/17/2011 06:34 AM, Paolo Bonzini wrote:
> On 05/12/2011 05:40 PM, Bernd Schmidt wrote:
>> +  if (targetm.calls.function_arg_round_to_arg_boundary (passed_mode,
>> type))
>> +    round_boundary = boundary;
>> +  else
>> +    round_boundary = PARM_BOUNDARY;
> 
> Why add an if, instead of making the new target hook
> function_arg_round_boundary?  The default implementation can then reuse
> default_function_arg_boundary and C6X will redefine it to
> c6x_function_arg_boundary.

Like this? Untested so far beyond making sure it builds.


Bernd

[-- Attachment #2: farb.diff --]
[-- Type: text/plain, Size: 6935 bytes --]

	* doc/tm.texi.in (FUNCTION_ARG_PADDING): Mention
	TARGET_FUNCTION_ARG_ROUND_BOUNDARY.
	(TARGET_FUNCTION_ARG_ROUND_BOUNDARY): Add hook.
	* function.c (locate_and_pad_parm): Take it into account.
	* target.def (function_arg_round_boundary): New hook.
	* targhooks.c (default_function_arg_round_boundary): New function.
	* targhooks.h (default_function_arg_round_boundary): Declare.
	* doc/tm.texi: Regenerate.

Index: gcc/doc/tm.texi
===================================================================
--- gcc/doc/tm.texi	(revision 174339)
+++ gcc/doc/tm.texi	(working copy)
@@ -4165,9 +4165,9 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro, but by the
+target hook @code{TARGET_FUNCTION_ARG_ROUND_BOUNDARY}.  It is
+always just enough to reach the next multiple of that boundary. 
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4200,6 +4200,13 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@deftypefn {Target Hook} {unsigned int} TARGET_FUNCTION_ARG_ROUND_BOUNDARY (enum machine_mode @var{mode}, const_tree @var{type})
+Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY},
+which is the default value for this hook.  You can define this hook to
+return a different value if an argument size must be rounded to a larger
+value.
+@end deftypefn
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: gcc/doc/tm.texi.in
===================================================================
--- gcc/doc/tm.texi.in	(revision 174339)
+++ gcc/doc/tm.texi.in	(working copy)
@@ -4153,9 +4153,9 @@ to pad out an argument with extra space.
 @code{enum direction}: either @code{upward} to pad above the argument,
 @code{downward} to pad below, or @code{none} to inhibit padding.
 
-The @emph{amount} of padding is always just enough to reach the next
-multiple of @code{TARGET_FUNCTION_ARG_BOUNDARY}; this macro does not
-control it.
+The @emph{amount} of padding is not controlled by this macro, but by the
+target hook @code{TARGET_FUNCTION_ARG_ROUND_BOUNDARY}.  It is
+always just enough to reach the next multiple of that boundary. 
 
 This macro has a default definition which is right for most systems.
 For little-endian machines, the default is to pad upward.  For
@@ -4188,6 +4188,8 @@ with the specified mode and type.  The d
 @code{PARM_BOUNDARY} for all arguments.
 @end deftypefn
 
+@hook TARGET_FUNCTION_ARG_ROUND_BOUNDARY
+
 @defmac FUNCTION_ARG_REGNO_P (@var{regno})
 A C expression that is nonzero if @var{regno} is the number of a hard
 register in which function arguments are sometimes passed.  This does
Index: gcc/targhooks.c
===================================================================
--- gcc/targhooks.c	(revision 174339)
+++ gcc/targhooks.c	(working copy)
@@ -614,6 +614,13 @@ default_function_arg_boundary (enum mach
   return PARM_BOUNDARY;
 }
 
+unsigned int
+default_function_arg_round_boundary (enum machine_mode mode ATTRIBUTE_UNUSED,
+				     const_tree type ATTRIBUTE_UNUSED)
+{
+  return PARM_BOUNDARY;
+}
+
 void
 hook_void_bitmap (bitmap regs ATTRIBUTE_UNUSED)
 {
Index: gcc/targhooks.h
===================================================================
--- gcc/targhooks.h	(revision 174339)
+++ gcc/targhooks.h	(working copy)
@@ -115,6 +115,8 @@ extern rtx default_function_incoming_arg
   (CUMULATIVE_ARGS *, enum machine_mode, const_tree, bool);
 extern unsigned int default_function_arg_boundary (enum machine_mode,
 						   const_tree);
+extern unsigned int default_function_arg_round_boundary (enum machine_mode,
+							 const_tree);
 extern bool hook_bool_const_rtx_commutative_p (const_rtx, int);
 extern rtx default_function_value (const_tree, const_tree, bool);
 extern rtx default_libcall_value (enum machine_mode, const_rtx);
Index: gcc/target.def
===================================================================
--- gcc/target.def	(revision 174339)
+++ gcc/target.def	(working copy)
@@ -2055,6 +2055,15 @@ DEFHOOK
  unsigned int, (enum machine_mode mode, const_tree type),
  default_function_arg_boundary)
 
+DEFHOOK
+(function_arg_round_boundary,
+ "Normally, the size of an argument is rounded up to @code{PARM_BOUNDARY},\n\
+which is the default value for this hook.  You can define this hook to\n\
+return a different value if an argument size must be rounded to a larger\n\
+value.",
+ unsigned int, (enum machine_mode mode, const_tree type),
+ default_function_arg_round_boundary)
+
 /* Return the diagnostic message string if function without a prototype
    is not allowed for this 'val' argument; NULL otherwise. */
 DEFHOOK
Index: gcc/function.c
===================================================================
--- gcc/function.c	(revision 174339)
+++ gcc/function.c	(working copy)
@@ -3709,7 +3709,7 @@ locate_and_pad_parm (enum machine_mode p
 {
   tree sizetree;
   enum direction where_pad;
-  unsigned int boundary;
+  unsigned int boundary, round_boundary;
   int reg_parm_stack_space = 0;
   int part_size_in_regs;
 
@@ -3741,6 +3741,8 @@ locate_and_pad_parm (enum machine_mode p
     = type ? size_in_bytes (type) : size_int (GET_MODE_SIZE (passed_mode));
   where_pad = FUNCTION_ARG_PADDING (passed_mode, type);
   boundary = targetm.calls.function_arg_boundary (passed_mode, type);
+  round_boundary = targetm.calls.function_arg_round_boundary (passed_mode,
+							      type);
   locate->where_pad = where_pad;
 
   /* Alignment can't exceed MAX_SUPPORTED_STACK_ALIGNMENT.  */
@@ -3787,8 +3789,8 @@ locate_and_pad_parm (enum machine_mode p
     tree s2 = sizetree;
     if (where_pad != none
 	&& (!host_integerp (sizetree, 1)
-	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-      s2 = round_up (s2, PARM_BOUNDARY / BITS_PER_UNIT);
+	    || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+      s2 = round_up (s2, round_boundary / BITS_PER_UNIT);
     SUB_PARM_SIZE (locate->slot_offset, s2);
   }
 
@@ -3840,8 +3842,8 @@ locate_and_pad_parm (enum machine_mode p
 
   if (where_pad != none
       && (!host_integerp (sizetree, 1)
-	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % PARM_BOUNDARY))
-    sizetree = round_up (sizetree, PARM_BOUNDARY / BITS_PER_UNIT);
+	  || (tree_low_cst (sizetree, 1) * BITS_PER_UNIT) % round_boundary))
+    sizetree = round_up (sizetree, round_boundary / BITS_PER_UNIT);
 
   ADD_PARM_SIZE (locate->size, sizetree);
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 8/11: A new FUNCTION_ARG macro
  2011-05-27 17:40         ` Bernd Schmidt
@ 2011-05-27 23:26           ` Paolo Bonzini
  0 siblings, 0 replies; 99+ messages in thread
From: Paolo Bonzini @ 2011-05-27 23:26 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Joseph S. Myers, GCC Patches

On 05/27/2011 05:54 PM, Bernd Schmidt wrote:
> Like this? Untested so far beyond making sure it builds.
>

Yes.

Paolo

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Ping: The TI C6X port
  2011-05-10 15:36 The TI C6X port Bernd Schmidt
                   ` (15 preceding siblings ...)
  2011-05-23 10:44 ` Ping: C6X libgcc changes Bernd Schmidt
@ 2011-05-30 11:21 ` Bernd Schmidt
  2011-06-06 11:26   ` Bernd Schmidt
  2011-06-06 12:54   ` Gerald Pfeifer
  16 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-05-30 11:21 UTC (permalink / raw)
  To: GCC Patches

Pings for the C6X port patches.

6/11: REG_WORDS_BIG_ENDIAN
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html

7/11: Cope with using a section name other than ".rodata".
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html

8/11: Round function arg sizes to more than PARM_BOUNDARY
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html

9/11: Make eq_attr work if an attribute uses (attr "...")
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html

10/11: The port
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html

11/11: Testcases
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 5/11: Track predication conditions more accurately
  2011-05-10 15:54 ` C6X port 5/11: Track predication conditions more accurately Bernd Schmidt
  2011-05-11 12:26   ` Alexander Monakov
@ 2011-05-31 20:34   ` Steve Ellcey
       [not found]     ` <4DE5489F.4020005@hotbox.ru>
  1 sibling, 1 reply; 99+ messages in thread
From: Steve Ellcey @ 2011-05-31 20:34 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

Bernd,

This patch (r174336) is causing me many testsuite failures on IA64.
Tests like gcc.c-torture/compile/20010408-1.c are dying with a 
seg fault in vinsn_detach.

#0  0x55b8760:0 in vinsn_detach (vi=0xf)
#1  0x55bda30:0 in clear_expr (expr=0x7fffeef0)
#2  0x562ea50:0 in schedule_expr_on_boundary (bnd=0x4040cf14, 
    expr_vliw=0x4040c4ac, seqno=-1)
#3  0x562fab0:0 in fill_insns (fence=0x4040bdec, seqno=-1, 
    scheduled_insns_tailpp=0x7fffeff0)
#4  0x563d3b0:0 in schedule_on_fences (fences=0x4040bde8, max_seqno=1, 
    scheduled_insns_tailpp=0x7fffeff0)
#5  0x563eb70:0 in sel_sched_region_2 (orig_max_seqno=22)
#6  0x563f1b0:0 in sel_sched_region_1 ()
#7  0x56403f0:0 in sel_sched_region (rgn=9)
#8  0x5640980:0 in run_selective_scheduling ()
#9  0x613d0f0:0 in ia64_reorg ()

I am still trying to get more information but I was wondering if you
have already seen this problem or if anyone else has reported it?

Steve Ellcey
sje@cup.hp.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 5/11: Track predication conditions more accurately
       [not found]     ` <4DE5489F.4020005@hotbox.ru>
@ 2011-06-01  8:19       ` Andrey Belevantsev
  2011-06-01 15:40         ` Steve Ellcey
  0 siblings, 1 reply; 99+ messages in thread
From: Andrey Belevantsev @ 2011-06-01  8:19 UTC (permalink / raw)
  To: Steve Ellcey; +Cc: Bernd Schmidt, GCC Patches

On 31.05.2011 23:59, Andrey Belevantsev wrote:
>
> On 31.05.2011 22:24, Steve Ellcey wrote:
>> Bernd,
>>
>> This patch (r174336) is causing me many testsuite failures on IA64.
>> Tests like gcc.c-torture/compile/20010408-1.c are dying with a
>> seg fault in vinsn_detach.
> I will look at it tomorrow. Bernd, Steve, please let us know about any
> issues with sel-sched code so we can help.
I cannot reproduce this with today's trunk with a cross either to 
ia64-linux or ia64-hpux, can you give me a test case with compiler options 
etc.?

Andrey

>
> Andrey
>
>>
>> #0 0x55b8760:0 in vinsn_detach (vi=0xf)
>> #1 0x55bda30:0 in clear_expr (expr=0x7fffeef0)
>> #2 0x562ea50:0 in schedule_expr_on_boundary (bnd=0x4040cf14,
>> expr_vliw=0x4040c4ac, seqno=-1)
>> #3 0x562fab0:0 in fill_insns (fence=0x4040bdec, seqno=-1,
>> scheduled_insns_tailpp=0x7fffeff0)
>> #4 0x563d3b0:0 in schedule_on_fences (fences=0x4040bde8, max_seqno=1,
>> scheduled_insns_tailpp=0x7fffeff0)
>> #5 0x563eb70:0 in sel_sched_region_2 (orig_max_seqno=22)
>> #6 0x563f1b0:0 in sel_sched_region_1 ()
>> #7 0x56403f0:0 in sel_sched_region (rgn=9)
>> #8 0x5640980:0 in run_selective_scheduling ()
>> #9 0x613d0f0:0 in ia64_reorg ()
>>
>> I am still trying to get more information but I was wondering if you
>> have already seen this problem or if anyone else has reported it?
>>
>> Steve Ellcey
>> sje@cup.hp.com
>>

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 5/11: Track predication conditions more accurately
  2011-06-01  8:19       ` Andrey Belevantsev
@ 2011-06-01 15:40         ` Steve Ellcey
  2011-06-02 11:30           ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Alexander Monakov
  0 siblings, 1 reply; 99+ messages in thread
From: Steve Ellcey @ 2011-06-01 15:40 UTC (permalink / raw)
  To: Andrey Belevantsev; +Cc: Bernd Schmidt, GCC Patches

On Wed, 2011-06-01 at 12:18 +0400, Andrey Belevantsev wrote:
> On 31.05.2011 23:59, Andrey Belevantsev wrote:
> >
> > On 31.05.2011 22:24, Steve Ellcey wrote:
> >> Bernd,
> >>
> >> This patch (r174336) is causing me many testsuite failures on IA64.
> >> Tests like gcc.c-torture/compile/20010408-1.c are dying with a
> >> seg fault in vinsn_detach.
> > I will look at it tomorrow. Bernd, Steve, please let us know about any
> > issues with sel-sched code so we can help.
> I cannot reproduce this with today's trunk with a cross either to 
> ia64-linux or ia64-hpux, can you give me a test case with compiler options 
> etc.?
> 
> Andrey

gcc.c-torture/compile/20010408-1.c was the test case that the stack
trace was from.  That test failed on IA64 HP-UX with just the -O3
option.  It looks like that passes in 64 bit mode though (-mlp64) so
that is probably why it also doesn't fail on Linux.

It looks like the failures on IA64 Linux require -g or
-fomit-frame-pointer in addition to -O3 in order to have the failure.

So for example, gcc.c-torture/execute/20020402-3.c, fails on IA64
Linux with -O3 -fomit-frame-pointer or with -O3 -g.

Steve Ellcey
sje@cup.hp.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately)
  2011-06-01 15:40         ` Steve Ellcey
@ 2011-06-02 11:30           ` Alexander Monakov
  2011-06-02 11:35             ` Initialize INSN_COND Bernd Schmidt
  2011-06-02 22:30             ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Steve Ellcey
  0 siblings, 2 replies; 99+ messages in thread
From: Alexander Monakov @ 2011-06-02 11:30 UTC (permalink / raw)
  To: Steve Ellcey; +Cc: Andrey Belevantsev, Bernd Schmidt, GCC Patches

Bernd,

The problem is INSN_COND should be reset when initializing a new deps
structure, otherwise instructions may get stale conditions from other
previously analyzed instructions.  Presuming that sd_init_insn is the
proper place for that, I'll test the following patch.


2011-06-02  Alexander Monakov  <amonakov@ispras.ru>

	* sched-deps.c (sd_init_insn): Initialize INSN_COND.
	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
	code_motion_path_driver returned 0 or 1.

diff --git a/gcc/sched-deps.c b/gcc/sched-deps.c
index 343d03c..e50f7ab 100644
--- a/gcc/sched-deps.c
+++ b/gcc/sched-deps.c
@@ -737,6 +737,7 @@ sd_init_insn (rtx insn)
   INSN_RESOLVED_BACK_DEPS (insn) = create_deps_list ();
   INSN_FORW_DEPS (insn) = create_deps_list ();
   INSN_RESOLVED_FORW_DEPS (insn) = create_deps_list ();
+  INSN_COND (insn) = NULL_RTX;
 
   /* ??? It would be nice to allocate dependency caches here.  */
 }
diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 3f22a3c..cb95f44 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -6675,7 +6675,7 @@ move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
 {
   struct moveop_static_params sparams;
   struct cmpd_local_params lparams;
-  bool res;
+  int res;
 
   /* Init params for code_motion_path_driver.  */
   sparams.dest = dest;
@@ -6694,6 +6694,8 @@ move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
   code_motion_path_driver_info = &move_op_hooks;
   res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
 
+  gcc_assert (res != -1);
+
   if (sparams.was_renamed)
     EXPR_WAS_RENAMED (expr_vliw) = true;
 


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-02 11:30           ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Alexander Monakov
@ 2011-06-02 11:35             ` Bernd Schmidt
  2011-06-03 17:44               ` Alexander Monakov
  2011-06-02 22:30             ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Steve Ellcey
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-02 11:35 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/02/2011 01:29 PM, Alexander Monakov wrote:
> Bernd,
> 
> The problem is INSN_COND should be reset when initializing a new deps
> structure, otherwise instructions may get stale conditions from other
> previously analyzed instructions.  Presuming that sd_init_insn is the
> proper place for that, I'll test the following patch.
> 
> 
> 2011-06-02  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* sched-deps.c (sd_init_insn): Initialize INSN_COND.
> 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> 	code_motion_path_driver returned 0 or 1.

Ok. Although I wonder how sel-sched can end up reusing an entry in
h_d_i_d? How does it use this machinery? If it's not doing a normal
forward scan as in sched_analyze, the INSN_COND mechanism may break in
other ways.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately)
  2011-06-02 11:30           ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Alexander Monakov
  2011-06-02 11:35             ` Initialize INSN_COND Bernd Schmidt
@ 2011-06-02 22:30             ` Steve Ellcey
  2011-06-03 17:38               ` Steve Ellcey
  1 sibling, 1 reply; 99+ messages in thread
From: Steve Ellcey @ 2011-06-02 22:30 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Andrey Belevantsev, Bernd Schmidt, GCC Patches

On Thu, 2011-06-02 at 15:29 +0400, Alexander Monakov wrote:
> Bernd,
> 
> The problem is INSN_COND should be reset when initializing a new deps
> structure, otherwise instructions may get stale conditions from other
> previously analyzed instructions.  Presuming that sd_init_insn is the
> proper place for that, I'll test the following patch.
> 
> 
> 2011-06-02  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* sched-deps.c (sd_init_insn): Initialize INSN_COND.
> 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> 	code_motion_path_driver returned 0 or 1.

I tested this patch on my IA64 HP-UX box and did not see any
regressions.  It fixed the problem I was having.

Steve Ellcey
sje@cup.hp.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately)
  2011-06-02 22:30             ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Steve Ellcey
@ 2011-06-03 17:38               ` Steve Ellcey
  2011-06-03 18:04                 ` Steve Ellcey
  0 siblings, 1 reply; 99+ messages in thread
From: Steve Ellcey @ 2011-06-03 17:38 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Andrey Belevantsev, Bernd Schmidt, GCC Patches

On Thu, 2011-06-02 at 15:30 -0700, Steve Ellcey wrote:
> On Thu, 2011-06-02 at 15:29 +0400, Alexander Monakov wrote:
> > Bernd,
> > 
> > The problem is INSN_COND should be reset when initializing a new deps
> > structure, otherwise instructions may get stale conditions from other
> > previously analyzed instructions.  Presuming that sd_init_insn is the
> > proper place for that, I'll test the following patch.
> > 
> > 
> > 2011-06-02  Alexander Monakov  <amonakov@ispras.ru>
> > 
> > 	* sched-deps.c (sd_init_insn): Initialize INSN_COND.
> > 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> > 	code_motion_path_driver returned 0 or 1.
> 
> I tested this patch on my IA64 HP-UX box and did not see any
> regressions.  It fixed the problem I was having.
> 
> Steve Ellcey
> sje@cup.hp.com

Alexander, It may have spoke too soon.  Last night's testing showed a
regression that I didn't see yesterday.

gfortran.dg/array_constructor_9.f90 is failing on IA64 HP-UX in 32 bit
mode but not in 64 bit mode.  It is also not failing on IA64 Linux.

It fails with the options:

	-O3 -fomit-frame-pointer -funroll-all-loops -finline-functions
or

	-O3 -fomit-frame-pointer -funroll-loops

The failure mode is:


array_constructor_9.f90: In function 'gen':
array_constructor_9.f90:14:0: internal compiler error: in code_motion_path_driver, at sel-sched.c:6573
Please submit a full bug report,
with preprocessed source if appropriate.
See <http://gcc.gnu.org/bugs.html> for instructions.


Note that I am using r174594 sources with your patch *AND* with the patch
Bernd proposed for PR 48673 (http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02470.html).
So this regression may be due to the other change.  I will look into it some
more to see if I can figure out which change is causing this regression.  I did not
see any other regressions.

Steve Ellcey
sje@cup.hp.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-02 11:35             ` Initialize INSN_COND Bernd Schmidt
@ 2011-06-03 17:44               ` Alexander Monakov
  2011-06-03 17:50                 ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Alexander Monakov @ 2011-06-03 17:44 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Steve Ellcey, Andrey Belevantsev, GCC Patches



On Thu, 2 Jun 2011, Bernd Schmidt wrote:

> Ok. Although I wonder how sel-sched can end up reusing an entry in
> h_d_i_d? How does it use this machinery? If it's not doing a normal
> forward scan as in sched_analyze, the INSN_COND mechanism may break in
> other ways.

Indeed, that patch did not completely solve the problem, as stale INSN_CONDs
can still be seen (I have a testcase reduced from combine.c).  Selective
scheduler's dependency analysis is certainly not limited to a single pass, as
it will test more dependencies on the fly after e.g. creating bookkeeping.

Was there some particular breakage you had in mind when mentioning that
INSN_CONDs may break in other ways?

Can you tell why you chose to place INSN_CONDs into HDID instead of HID?
HID seems a bit more natural choice to me, and as it explicitely populated
with zeros, it fixes the above combine.c testcase for me.  However, moving
INSN_CONDs to HID breaks sel-sched in a different way because sometimes HID is
not extended early enough; if that approach is generally ok for you, I can see
whether I can produce a working patch in that vein.

FWIW, we have a patch that adds predication support for the selective
scheduler (allowing the scheduler to transform insns into predicated form)
that we plan to submit during this stage1.

Thanks.
Alexander

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-03 17:44               ` Alexander Monakov
@ 2011-06-03 17:50                 ` Bernd Schmidt
  2011-06-07 17:40                   ` Alexander Monakov
  0 siblings, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-03 17:50 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/03/2011 07:44 PM, Alexander Monakov wrote:
> 
> 
> On Thu, 2 Jun 2011, Bernd Schmidt wrote:
> 
>> Ok. Although I wonder how sel-sched can end up reusing an entry in
>> h_d_i_d? How does it use this machinery? If it's not doing a normal
>> forward scan as in sched_analyze, the INSN_COND mechanism may break in
>> other ways.
> 
> Indeed, that patch did not completely solve the problem, as stale INSN_CONDs
> can still be seen (I have a testcase reduced from combine.c).  Selective
> scheduler's dependency analysis is certainly not limited to a single pass, as
> it will test more dependencies on the fly after e.g. creating bookkeeping.
> 
> Was there some particular breakage you had in mind when mentioning that
> INSN_CONDs may break in other ways?

Well, sched-deps expects that we walk the insns sequentially, setting
INSN_COND when an insn is seen for the first time, and then setting it
to const_true_rtx once the condition is no longer valid for mutex_p
comparisons.

> Can you tell why you chose to place INSN_CONDs into HDID instead of HID?

It's only used in sched-deps.c, during the scan.

> FWIW, we have a patch that adds predication support for the selective
> scheduler (allowing the scheduler to transform insns into predicated form)
> that we plan to submit during this stage1.

I have such a patch for sched-ebb.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately)
  2011-06-03 17:38               ` Steve Ellcey
@ 2011-06-03 18:04                 ` Steve Ellcey
  0 siblings, 0 replies; 99+ messages in thread
From: Steve Ellcey @ 2011-06-03 18:04 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Andrey Belevantsev, Bernd Schmidt, GCC Patches



> Note that I am using r174594 sources with your patch *AND* with the patch
> Bernd proposed for PR 48673 (http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02470.html).
> So this regression may be due to the other change.  I will look into it some
> more to see if I can figure out which change is causing this regression.  I did not
> see any other regressions.
> 
> Steve Ellcey
> sje@cup.hp.com

Alexander,

Following up to my own email, removing Bernd's patch for PR 48673 did
not make this failure go away.  But Bernd's patch does fix the
gfortran.dg/sms-* failures I reported in PR 48673 so unless you or
Andrey have an objection to it, I would like to approve that patch for
checkin.

Steve Ellcey
sje@cup.hp.com


^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
@ 2011-06-06 11:26   ` Bernd Schmidt
  2011-06-14 11:18     ` Bernd Schmidt
  2011-06-14 21:33     ` Vladimir Makarov
  2011-06-06 12:54   ` Gerald Pfeifer
  1 sibling, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-06 11:26 UTC (permalink / raw)
  To: GCC Patches

Ping^3 for the C6X port. Now with extra patches:

Additional preliminary scheduler tweaks:
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02408.html

Allow alternatives in attr "predicable":
http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00094.html

regrename across basic block boundaries:
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02193.html
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02194.html

> 6/11: REG_WORDS_BIG_ENDIAN
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
> 
> 7/11: Cope with using a section name other than ".rodata".
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
> 
> 8/11: Round function arg sizes to more than PARM_BOUNDARY
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html
> 
> 9/11: Make eq_attr work if an attribute uses (attr "...")
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html
> 
> 10/11: The port
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html
> 
> 11/11: Testcases
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
  2011-06-06 11:26   ` Bernd Schmidt
@ 2011-06-06 12:54   ` Gerald Pfeifer
  2011-06-06 13:02     ` Bernd Schmidt
  2011-07-11 11:03     ` Bernd Schmidt
  1 sibling, 2 replies; 99+ messages in thread
From: Gerald Pfeifer @ 2011-06-06 12:54 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: gcc-patches

Hi Bernd,

not a direct approval for any of the outstanding patches, but I am happy 
to report that the steering committee is appointing you maintainer of the 
C6X port.

Please go ahead and add yourself to the MAINTAINERS file as part of the
patch that actually adds the port (10/11 if I recall correctly).

Thanks for contributing this work, and happy hacking!  And do think of
contributing a news item for the main page. :-)

Gerald

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-06 12:54   ` Gerald Pfeifer
@ 2011-06-06 13:02     ` Bernd Schmidt
  2011-07-11 11:03     ` Bernd Schmidt
  1 sibling, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-06 13:02 UTC (permalink / raw)
  To: Gerald Pfeifer; +Cc: gcc-patches

On 06/06/2011 02:53 PM, Gerald Pfeifer wrote:
> not a direct approval for any of the outstanding patches, but I am happy 
> to report that the steering committee is appointing you maintainer of the 
> C6X port.

Thanks!

> Thanks for contributing this work, and happy hacking!  And do think of
> contributing a news item for the main page. :-)

I did, and you approved it :)
http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00983.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-03 17:50                 ` Bernd Schmidt
@ 2011-06-07 17:40                   ` Alexander Monakov
  2011-06-07 18:11                     ` Gary Funck
  2011-06-07 20:45                     ` Bernd Schmidt
  0 siblings, 2 replies; 99+ messages in thread
From: Alexander Monakov @ 2011-06-07 17:40 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Steve Ellcey, Andrey Belevantsev, GCC Patches



On Fri, 3 Jun 2011, Bernd Schmidt wrote:

> >> Ok. Although I wonder how sel-sched can end up reusing an entry in
> >> h_d_i_d?

Unlike Haifa scheduler, we recompute INSN_LUIDs for each region.  However, we
call sched_deps_{init,finish} once per function (like Haifa) and that makes us
reuse entries in h_d_i_d.

The proposed patch clears h_d_i_d when finishing a region in sel-sched.
Bootstrapped and regtested on ia64-linux, OK for trunk?  I also verified that
HPUX failure mentioned by Steve is fixed on a cross-compiler.

> >> How does it use this machinery? If it's not doing a normal
> >> forward scan as in sched_analyze, the INSN_COND mechanism may break in
> >> other ways.

Normal forward scan is only done to compute insn priorities; now, it will also
reset INSN_CONDs for instructions followed by an assignment to their
predicate (for exposed-pipeline targets). After that, sel-sched's dependency
analysis will treat such instructions as if they had no predicate, which is
very conservative.  Unfortunately, correctness still may be broken after a
predicate assignment is moved into a different BB (or copied to one as a
bookkeeping copy).  I'll try to think of a way to fix it when preparing the
predication patch.


2011-06-07  Alexander Monakov  <amonakov@ispras.ru>

	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
	code_motion_path_driver returned 0 or 1.
	(sel_region_finish): Clear h_d_i_d.

diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c
index 3f22a3c..8a39d80 100644
--- a/gcc/sel-sched.c
+++ b/gcc/sel-sched.c
@@ -6675,7 +6675,7 @@ move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
 {
   struct moveop_static_params sparams;
   struct cmpd_local_params lparams;
-  bool res;
+  int res;
 
   /* Init params for code_motion_path_driver.  */
   sparams.dest = dest;
@@ -6694,6 +6694,8 @@ move_op (insn_t insn, av_set_t orig_ops, expr_t expr_vliw,
   code_motion_path_driver_info = &move_op_hooks;
   res = code_motion_path_driver (insn, orig_ops, NULL, &lparams, &sparams);
 
+  gcc_assert (res != -1);
+
   if (sparams.was_renamed)
     EXPR_WAS_RENAMED (expr_vliw) = true;
 
@@ -7269,6 +7271,7 @@ sel_region_finish (bool reset_sched_cycles_p)
 
   finish_deps_global ();
   sched_finish_luids ();
+  VEC_free (haifa_deps_insn_data_def, heap, h_d_i_d);
 
   sel_finish_bbs ();
   BITMAP_FREE (blocks_to_reschedule);

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-07 17:40                   ` Alexander Monakov
@ 2011-06-07 18:11                     ` Gary Funck
  2011-06-07 18:28                       ` Gary Funck
                                         ` (2 more replies)
  2011-06-07 20:45                     ` Bernd Schmidt
  1 sibling, 3 replies; 99+ messages in thread
From: Gary Funck @ 2011-06-07 18:11 UTC (permalink / raw)
  To: Alexander Monakov
  Cc: Bernd Schmidt, Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/07/11 21:39:57, Alexander Monakov wrote:
> 2011-06-07  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> 	code_motion_path_driver returned 0 or 1.
> 	(sel_region_finish): Clear h_d_i_d.

Alexander, will this patch fix the recently reported PR49303 and PR49304?
If so, can a note be added to the ChangeLog entry?  Also, would a
DG test case make sense to help find future regressions, or is this
failure mode simply too specific?

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-07 18:11                     ` Gary Funck
@ 2011-06-07 18:28                       ` Gary Funck
  2011-06-07 18:35                       ` Gary Funck
  2011-06-07 18:56                       ` Alexander Monakov
  2 siblings, 0 replies; 99+ messages in thread
From: Gary Funck @ 2011-06-07 18:28 UTC (permalink / raw)
  To: nenad; +Cc: Bernd Schmidt, Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/07/11 21:39:57, Alexander Monakov wrote:
> 2011-06-07  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> 	code_motion_path_driver returned 0 or 1.
> 	(sel_region_finish): Clear h_d_i_d.

Alexander, will this patch fix the recently reported PR49303 and PR49304?
If so, can a note be added to the ChangeLog entry?  Also, would a
DG test case make sense to help find future regressions, or is this
failure mode simply too specific?

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-07 18:11                     ` Gary Funck
  2011-06-07 18:28                       ` Gary Funck
@ 2011-06-07 18:35                       ` Gary Funck
  2011-06-07 18:56                       ` Alexander Monakov
  2 siblings, 0 replies; 99+ messages in thread
From: Gary Funck @ 2011-06-07 18:35 UTC (permalink / raw)
  To: nenad; +Cc: Bernd Schmidt, Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/07/11 21:39:57, Alexander Monakov wrote:
> 2011-06-07  Alexander Monakov  <amonakov@ispras.ru>
> 
> 	* sel-sched.c (move_op): Use correct type for 'res'.  Verify that
> 	code_motion_path_driver returned 0 or 1.
> 	(sel_region_finish): Clear h_d_i_d.

Alexander, will this patch fix the recently reported PR49303 and PR49304?
If so, can a note be added to the ChangeLog entry?  Also, would a
DG test case make sense to help find future regressions, or is this
failure mode simply too specific?

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-07 18:11                     ` Gary Funck
  2011-06-07 18:28                       ` Gary Funck
  2011-06-07 18:35                       ` Gary Funck
@ 2011-06-07 18:56                       ` Alexander Monakov
  2 siblings, 0 replies; 99+ messages in thread
From: Alexander Monakov @ 2011-06-07 18:56 UTC (permalink / raw)
  To: Gary Funck; +Cc: Bernd Schmidt, Steve Ellcey, Andrey Belevantsev, GCC Patches

On Tue, Jun 7, 2011 at 10:09 PM, Gary Funck <gary@intrepid.com> wrote:
> On 06/07/11 21:39:57, Alexander Monakov wrote:
>> 2011-06-07  Alexander Monakov  <amonakov@ispras.ru>
>>
>>       * sel-sched.c (move_op): Use correct type for 'res'.  Verify that
>>       code_motion_path_driver returned 0 or 1.
>>       (sel_region_finish): Clear h_d_i_d.
>
> Alexander, will this patch fix the recently reported PR49303 and PR49304?

Yes.

> If so, can a note be added to the ChangeLog entry?  Also, would a
> DG test case make sense to help find future regressions, or is this
> failure mode simply too specific?

I will amend the Changelog entry and add a smaller testcase that I
have reduced from combine.c. Thanks for reporting this — I was in a
hurry to submit this for approval before leaving.

Alexander

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Initialize INSN_COND
  2011-06-07 17:40                   ` Alexander Monakov
  2011-06-07 18:11                     ` Gary Funck
@ 2011-06-07 20:45                     ` Bernd Schmidt
  1 sibling, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-07 20:45 UTC (permalink / raw)
  To: Alexander Monakov; +Cc: Steve Ellcey, Andrey Belevantsev, GCC Patches

On 06/07/2011 07:39 PM, Alexander Monakov wrote:
> 
> 
> On Fri, 3 Jun 2011, Bernd Schmidt wrote:
> 
>>>> Ok. Although I wonder how sel-sched can end up reusing an entry in
>>>> h_d_i_d?
> 
> Unlike Haifa scheduler, we recompute INSN_LUIDs for each region.  However, we
> call sched_deps_{init,finish} once per function (like Haifa) and that makes us
> reuse entries in h_d_i_d.
> 
> The proposed patch clears h_d_i_d when finishing a region in sel-sched.
> Bootstrapped and regtested on ia64-linux, OK for trunk?

You probably know best, so I'll approve it. Thanks for working on this.

> Normal forward scan is only done to compute insn priorities; now, it will also
> reset INSN_CONDs for instructions followed by an assignment to their
> predicate (for exposed-pipeline targets). After that, sel-sched's dependency
> analysis will treat such instructions as if they had no predicate, which is
> very conservative.  Unfortunately, correctness still may be broken after a
> predicate assignment is moved into a different BB (or copied to one as a
> bookkeeping copy).  I'll try to think of a way to fix it when preparing the
> predication patch.

It's probably not urgent. We can't really use sel-sched on c6x, as I'd
have to add the backtracking machinery to sel-sched for scheduling delay
slots, and I don't understand it well enough to do so.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-06 11:26   ` Bernd Schmidt
@ 2011-06-14 11:18     ` Bernd Schmidt
  2011-06-19  1:10       ` Richard Henderson
  2011-06-27 10:20       ` Bernd Schmidt
  2011-06-14 21:33     ` Vladimir Makarov
  1 sibling, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-14 11:18 UTC (permalink / raw)
  To: GCC Patches

Ping^4 for the C6X port.

> Additional preliminary scheduler tweaks:
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02408.html
> 
> Allow alternatives in attr "predicable":
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00094.html
> 
> regrename across basic block boundaries:
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02193.html
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02194.html
> 
>> 6/11: REG_WORDS_BIG_ENDIAN
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
>>
>> 7/11: Cope with using a section name other than ".rodata".
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
>>
>> 8/11: Round function arg sizes to more than PARM_BOUNDARY
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html
>>
>> 9/11: Make eq_attr work if an attribute uses (attr "...")
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html
>>
>> 10/11: The port
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html
>>
>> 11/11: Testcases
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html
> 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-06 11:26   ` Bernd Schmidt
  2011-06-14 11:18     ` Bernd Schmidt
@ 2011-06-14 21:33     ` Vladimir Makarov
  2011-07-14 12:15       ` Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: Vladimir Makarov @ 2011-06-14 21:33 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On 06/06/2011 07:26 AM, Bernd Schmidt wrote:
> Ping^3 for the C6X port. Now with extra patches:
>
> Additional preliminary scheduler tweaks:
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02408.html
>
It is ok for me.  Thanks, Bernd.
> Allow alternatives in attr "predicable":
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00094.html
>
> regrename across basic block boundaries:
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02193.html
> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02194.html
>
>> 6/11: REG_WORDS_BIG_ENDIAN
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
>>
>> 7/11: Cope with using a section name other than ".rodata".
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
>>
>> 8/11: Round function arg sizes to more than PARM_BOUNDARY
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html
>>
>> 9/11: Make eq_attr work if an attribute uses (attr "...")
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html
>>
>> 10/11: The port
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html
>>
>> 11/11: Testcases
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 10/11: The port
  2011-05-16 18:45         ` Bernd Schmidt
@ 2011-06-16 21:45           ` Joseph S. Myers
  0 siblings, 0 replies; 99+ messages in thread
From: Joseph S. Myers @ 2011-06-16 21:45 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Paul Brook

On Mon, 16 May 2011, Bernd Schmidt wrote:

> +#if 0 /* FIXME: Reenable when TI's tools are fixed.  */
> +  /* ??? Ideally we'd check flag_short_wchar somehow.  */

Ideally you'd check wchar_type_node, the front-end tree node instead of 
the front-end flag used initializing that node.  See what ARM does (via a 
kludge using REGISTER_TARGET_PRAGMAS to call 
arm_lang_object_attributes_init).

> +  asm_fprintf (asm_out_file, "\t.c6xabi_attribute Tag_ABI_wchar_t, %d\n", 2);
> +#endif

-- 
Joseph S. Myers
joseph@codesourcery.com

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-14 11:18     ` Bernd Schmidt
@ 2011-06-19  1:10       ` Richard Henderson
  2011-06-27 10:20       ` Bernd Schmidt
  1 sibling, 0 replies; 99+ messages in thread
From: Richard Henderson @ 2011-06-19  1:10 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On 06/14/2011 03:40 AM, Bernd Schmidt wrote:
>> Allow alternatives in attr "predicable":
>> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg00094.html

Ok.


r~

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-14 11:18     ` Bernd Schmidt
  2011-06-19  1:10       ` Richard Henderson
@ 2011-06-27 10:20       ` Bernd Schmidt
  2011-07-07 22:32         ` Bernd Schmidt
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-06-27 10:20 UTC (permalink / raw)
  To: GCC Patches

On 06/14/11 12:40, Bernd Schmidt wrote:
> Ping^5 for the C6X port.
>> regrename across basic block boundaries:
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02193.html
http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01595.html
>>
>>> 6/11: REG_WORDS_BIG_ENDIAN
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
>>>
>>> 7/11: Cope with using a section name other than ".rodata".
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
>>>
>>> 8/11: Round function arg sizes to more than PARM_BOUNDARY
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html
>>>
>>> 9/11: Make eq_attr work if an attribute uses (attr "...")
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html
>>>
>>> 10/11: The port
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html
>>>
>>> 11/11: Testcases
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html

Hardware loop library for use during target reorg:
http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01593.html

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-27 10:20       ` Bernd Schmidt
@ 2011-07-07 22:32         ` Bernd Schmidt
  2011-07-07 22:36           ` Richard Henderson
  2011-07-07 22:37           ` Richard Henderson
  0 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-07 22:32 UTC (permalink / raw)
  To: GCC Patches
  Cc: Jeffrey A Law, Richard Henderson, Richard Guenther, Ian Lance Taylor

Ping^6 for the C6X port.

6/11, 7/11, 8/11, 9/11 should be relatively quick to review.  Cc'ing
some maintainers.

10/11 is of course out of date by now, but there's little sense posting
new versions all the time...

>>> regrename across basic block boundaries:
>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02193.html
> http://gcc.gnu.org/ml/gcc-patches/2011-06/msg01595.html
>>>
>>>> 6/11: REG_WORDS_BIG_ENDIAN
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html
>>>>
>>>> 7/11: Cope with using a section name other than ".rodata".
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html
>>>>
>>>> 8/11: Round function arg sizes to more than PARM_BOUNDARY
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html
>>>>
>>>> 9/11: Make eq_attr work if an attribute uses (attr "...")
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html
>>>>
>>>> 10/11: The port
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00764.html
>>>>
>>>> 11/11: Testcases
>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00762.html


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-07-07 22:32         ` Bernd Schmidt
@ 2011-07-07 22:36           ` Richard Henderson
  2011-07-07 22:37           ` Richard Henderson
  1 sibling, 0 replies; 99+ messages in thread
From: Richard Henderson @ 2011-07-07 22:36 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches, Nick Clifton

On 07/07/2011 03:26 PM, Bernd Schmidt wrote:
>>>>> 6/11: REG_WORDS_BIG_ENDIAN
>>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00757.html

Ok.

Nick, consider using this on the rx port.  This should solve
the problem with the mulsidi3 pattern not available for BE.


r~

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-07-07 22:32         ` Bernd Schmidt
  2011-07-07 22:36           ` Richard Henderson
@ 2011-07-07 22:37           ` Richard Henderson
  1 sibling, 0 replies; 99+ messages in thread
From: Richard Henderson @ 2011-07-07 22:37 UTC (permalink / raw)
  To: Bernd Schmidt
  Cc: GCC Patches, Jeffrey A Law, Richard Guenther, Ian Lance Taylor

On 07/07/2011 03:26 PM, Bernd Schmidt wrote:
>>>>> 7/11: Cope with using a section name other than ".rodata".
>>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00909.html

Ok.

>>>>> 8/11: Round function arg sizes to more than PARM_BOUNDARY
>>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02170.html

Ok.

>>>>> 9/11: Make eq_attr work if an attribute uses (attr "...")
>>>>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00761.html

Ok.


r~

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-06 12:54   ` Gerald Pfeifer
  2011-06-06 13:02     ` Bernd Schmidt
@ 2011-07-11 11:03     ` Bernd Schmidt
  2011-07-11 16:05       ` Mike Stump
  1 sibling, 1 reply; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-11 11:03 UTC (permalink / raw)
  To: Gerald Pfeifer; +Cc: gcc-patches

On 06/06/11 14:53, Gerald Pfeifer wrote:
> not a direct approval for any of the outstanding patches, but I am happy 
> to report that the steering committee is appointing you maintainer of the 
> C6X port.
> 
> Please go ahead and add yourself to the MAINTAINERS file as part of the
> patch that actually adds the port (10/11 if I recall correctly).

Internally, the question came up whether that means I can just commit
the port once the preliminary patches are approved (which I think is
now). Opinions?


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-07-11 11:03     ` Bernd Schmidt
@ 2011-07-11 16:05       ` Mike Stump
  2011-07-11 16:24         ` Gerald Pfeifer
  0 siblings, 1 reply; 99+ messages in thread
From: Mike Stump @ 2011-07-11 16:05 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: Gerald Pfeifer, gcc-patches

On Jul 11, 2011, at 3:18 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> On 06/06/11 14:53, Gerald Pfeifer wrote:
>> not a direct approval for any of the outstanding patches, but I am happy 
>> to report that the steering committee is appointing you maintainer of the 
>> C6X port.
>> 
>> Please go ahead and add yourself to the MAINTAINERS file as part of the
>> patch that actually adds the port (10/11 if I recall correctly).
> 
> Internally, the question came up whether that means I can just commit
> the port once the preliminary patches are approved (which I think is
> now). Opinions?

My take, you need approval for everything outside your area, once you have that, and that work is checked in, then, you can check in all the target bits, self approving those bits, if they meet your standard.  Your free to reject them as well.  ;-).

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-07-11 16:05       ` Mike Stump
@ 2011-07-11 16:24         ` Gerald Pfeifer
  2011-07-15  9:42           ` Bernd Schmidt
  0 siblings, 1 reply; 99+ messages in thread
From: Gerald Pfeifer @ 2011-07-11 16:24 UTC (permalink / raw)
  To: Bernd Schmidt, gcc-patches, Mike Stump

On Mon, 11 Jul 2011, Mike Stump wrote:
> My take, you need approval for everything outside your area, once you 
> have that, and that work is checked in, then, you can check in all the 
> target bits, self approving those bits, if they meet your standard.  

That's my understanding as well.  (With the caveat that if someone is
really hating something in your new port, it would be good to take that
very seriously. :-)

Gerald

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: The TI C6X port
  2011-05-25  7:15   ` Vladimir Makarov
  2011-05-27 16:33     ` Bernd Schmidt
@ 2011-07-13 10:26     ` Bernd Schmidt
  1 sibling, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-13 10:26 UTC (permalink / raw)
  To: Vladimir Makarov; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 340 bytes --]

On 05/25/11 02:29, Vladimir Makarov wrote:
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg00750.html
> Ok.  But changelog entry for sched_change_pattern is absent.

I've committed this with a slight change in sched_change_pattern;
another patch I'm working on showed a need to also clear the cached cost
for resolved dependencies.


Bernd

[-- Attachment #2: depcost3.diff --]
[-- Type: text/plain, Size: 2922 bytes --]

Index: gcc/ChangeLog
===================================================================
--- gcc/ChangeLog	(revision 176225)
+++ gcc/ChangeLog	(working copy)
@@ -1,3 +1,11 @@
+2011-07-13  Bernd Schmidt  <bernds@codesourcery.com>
+
+	* sched-int.h (struct _dep): Add member cost.
+	(DEP_COST, UNKNOWN_DEP_COST): New macros.
+	* sched-deps.c (init_dep_1): Initialize DEP_COST.
+	* haifa-sched.c (dep_cost_1): Use and set DEP_COST.
+	(sched_change_pattern): Reset it for dependent insns.
+
 2011-07-13  Rainer Orth  <ro@CeBiTec.Uni-Bielefeld.DE>
 
 	* Makefile.in (CRT0STUFF_T_CFLAGS): Remove.
Index: gcc/haifa-sched.c
===================================================================
--- gcc/haifa-sched.c	(revision 176171)
+++ gcc/haifa-sched.c	(working copy)
@@ -854,6 +854,9 @@ dep_cost_1 (dep_t link, dw_t dw)
   rtx used = DEP_CON (link);
   int cost;
 
+  if (DEP_COST (link) != UNKNOWN_DEP_COST)
+    return DEP_COST (link);
+
   /* A USE insn should never require the value used to be computed.
      This allows the computation of a function's result and parameter
      values to overlap the return and call.  We don't care about the
@@ -911,6 +914,7 @@ dep_cost_1 (dep_t link, dw_t dw)
 	cost = 0;
     }
 
+  DEP_COST (link) = cost;
   return cost;
 }
 
@@ -4864,11 +4868,21 @@ fix_recovery_deps (basic_block rec)
 void
 sched_change_pattern (rtx insn, rtx new_pat)
 {
+  sd_iterator_def sd_it;
+  dep_t dep;
   int t;
 
   t = validate_change (insn, &PATTERN (insn), new_pat, 0);
   gcc_assert (t);
   dfa_clear_single_insn_cache (insn);
+
+  for (sd_it = sd_iterator_start (insn, (SD_LIST_FORW | SD_LIST_BACK
+					 | SD_LIST_RES_BACK));
+       sd_iterator_cond (&sd_it, &dep);)
+    {
+      DEP_COST (dep) = UNKNOWN_DEP_COST;
+      sd_iterator_next (&sd_it);
+    }
 }
 
 /* Change pattern of INSN to NEW_PAT.  Invalidate cached haifa
Index: gcc/sched-deps.c
===================================================================
--- gcc/sched-deps.c	(revision 176171)
+++ gcc/sched-deps.c	(working copy)
@@ -107,6 +107,7 @@ init_dep_1 (dep_t dep, rtx pro, rtx con,
   DEP_CON (dep) = con;
   DEP_TYPE (dep) = type;
   DEP_STATUS (dep) = ds;
+  DEP_COST (dep) = UNKNOWN_DEP_COST;
 }
 
 /* Init DEP with the arguments.
Index: gcc/sched-int.h
===================================================================
--- gcc/sched-int.h	(revision 176171)
+++ gcc/sched-int.h	(working copy)
@@ -215,6 +215,9 @@ struct _dep
   /* Dependency status.  This field holds all dependency types and additional
      information for speculative dependencies.  */
   ds_t status;
+
+  /* Cached cost of the dependency.  */
+  int cost;
 };
 
 typedef struct _dep dep_def;
@@ -224,6 +227,9 @@ typedef dep_def *dep_t;
 #define DEP_CON(D) ((D)->con)
 #define DEP_TYPE(D) ((D)->type)
 #define DEP_STATUS(D) ((D)->status)
+#define DEP_COST(D) ((D)->cost)
+
+#define UNKNOWN_DEP_COST INT_MIN
 
 /* Functions to work with dep.  */
 

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-06-14 21:33     ` Vladimir Makarov
@ 2011-07-14 12:15       ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-14 12:15 UTC (permalink / raw)
  To: Vladimir Makarov; +Cc: GCC Patches

On 06/14/11 22:52, Vladimir Makarov wrote:
> On 06/06/2011 07:26 AM, Bernd Schmidt wrote:
>> Ping^3 for the C6X port. Now with extra patches:
>>
>> Additional preliminary scheduler tweaks:
>> http://gcc.gnu.org/ml/gcc-patches/2011-05/msg02408.html
>>
> It is ok for me.  Thanks, Bernd.

I've committed this with one change: I've dropped the hunk that resolves
debug_insn dependencies rather than deleting them. We should do that,
but when I tested these changes together with the backtracking
scheduler, I saw some problems, so I'll postpone this.


Bernd

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: Ping: The TI C6X port
  2011-07-11 16:24         ` Gerald Pfeifer
@ 2011-07-15  9:42           ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-15  9:42 UTC (permalink / raw)
  To: Gerald Pfeifer; +Cc: gcc-patches, Mike Stump, Paul Brook

[-- Attachment #1: Type: text/plain, Size: 1202 bytes --]

On 07/11/11 18:20, Gerald Pfeifer wrote:
> On Mon, 11 Jul 2011, Mike Stump wrote:
>> My take, you need approval for everything outside your area, once you 
>> have that, and that work is checked in, then, you can check in all the 
>> target bits, self approving those bits, if they meet your standard.  
> 
> That's my understanding as well.  (With the caveat that if someone is
> really hating something in your new port, it would be good to take that
> very seriously. :-)

No one seems to care very much one way or another :)

Thanks guys. This is what I committed. Compared to the previously posted
version, it includes new development from the last two months, updates
for gcc changes in the last two months, a bug fix for an interaction
between the movmem expanders and the new improved DSE, and support for
the TARGET_BUILTIN_DECL hook. I've removed some traces of EABI unwind
support; as mentioned before, Paul Brook will submit these bits.

Retested with c6x-elf; results essentially as expected. Note that there
is a floating point scheduling bug (seen on C674X targets when using
real hardware) which is currently blocked on
  http://gcc.gnu.org/ml/gcc-patches/2011-07/msg00855.html


Bernd

[-- Attachment #2: c6xport-0715.diff.gz --]
[-- Type: application/x-gzip, Size: 91902 bytes --]

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 11/11: Testcases
  2011-05-10 16:56 ` C6X port 11/11: Testcases Bernd Schmidt
@ 2011-07-15 10:06   ` Bernd Schmidt
  2011-07-15 12:48     ` H.J. Lu
  2011-07-15 18:23     ` Mike Stump
  0 siblings, 2 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-15 10:06 UTC (permalink / raw)
  To: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 314 bytes --]

On 05/10/11 17:51, Bernd Schmidt wrote:
> This contains the testsuite changes for the C6X port.

Committed this version. No one commented about the changes outside
gcc.target/tic6x, but I think they are reasonably obvious. I'm open to
suggestions for other names for the check_effective_target functions.


Bernd


[-- Attachment #2: c6xts0715.diff --]
[-- Type: text/plain, Size: 27072 bytes --]

Index: gcc/testsuite/gcc.target/tic6x/weak-call.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/weak-call.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/weak-call.c	(revision 0)
@@ -0,0 +1,17 @@
+/* { dg-do compile } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.f" } } */
+/* { dg-final { scan-assembler-not "call\[\\t ]*.s.\[\\t ]*.g" } } */
+
+extern void f () __attribute__ ((weak));
+extern void g () __attribute__ ((weak)) __attribute__ ((noinline));
+
+void g ()
+{
+}
+
+int main ()
+{
+  f ();
+  g ();
+}
Index: gcc/testsuite/gcc.target/tic6x/builtin-math-7.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtin-math-7.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtin-math-7.c	(revision 0)
@@ -0,0 +1,94 @@
+/* Copyright (C) 2009  Free Software Foundation.
+
+   Verify that folding of complex mul and div work correctly.
+   TI C6X specific version, reduced by two tests that fails due to the
+   use of implicit -freciprocal-math.
+
+   Origin: Kaveh R. Ghazi,  August 13, 2009.  */
+
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+/* { dg-add-options ieee } */
+
+extern void link_error(int);
+
+/* Evaluate this expression at compile-time.  */
+#define COMPILETIME_TESTIT(TYPE,X,OP,Y,RES) do { \
+  if ((_Complex TYPE)(X) OP (_Complex TYPE)(Y) != (_Complex TYPE)(RES)) \
+    link_error(__LINE__); \
+} while (0)
+
+/* Use this error function for cases which only evaluate at
+   compile-time when optimizing.  */
+#ifdef __OPTIMIZE__
+# define ERROR_FUNC(X) link_error(X)
+#else
+# define ERROR_FUNC(X) __builtin_abort()
+#endif
+
+/* Evaluate this expression at compile-time using static initializers.  */
+#define STATICINIT_TESTIT(TYPE,X,OP,Y,RES) do { \
+  static const _Complex TYPE foo = (_Complex TYPE)(X) OP (_Complex TYPE)(Y); \
+  if (foo != (_Complex TYPE)(RES)) \
+    ERROR_FUNC (__LINE__); \
+} while (0)
+
+/* Evaluate this expression at runtime.  */
+#define RUNTIME_TESTIT(TYPE,X,OP,Y,RES) do { \
+  volatile _Complex TYPE foo; \
+  foo = (_Complex TYPE)(X); \
+  foo OP##= (_Complex TYPE)(Y); \
+  if (foo != (_Complex TYPE)(RES)) \
+    __builtin_abort(); \
+} while (0)
+
+/* Evaluate this expression at compile-time and runtime.  */
+#define TESTIT(TYPE,X,OP,Y,RES) do { \
+  STATICINIT_TESTIT(TYPE,X,OP,Y,RES); \
+  COMPILETIME_TESTIT(TYPE,X,OP,Y,RES); \
+  RUNTIME_TESTIT(TYPE,X,OP,Y,RES); \
+} while (0)
+
+/* Either the real or imaginary parts should be infinity.  */
+#define TEST_ONE_PART_INF(VAL) do { \
+  static const _Complex double foo = (VAL); \
+  if (! __builtin_isinf(__real foo) && ! __builtin_isinf(__imag foo)) \
+    ERROR_FUNC (__LINE__); \
+  if (! __builtin_isinf(__real (VAL)) && ! __builtin_isinf(__imag (VAL))) \
+    __builtin_abort(); \
+} while (0)
+
+int main()
+{
+  /* Test some regular finite values.  */
+  TESTIT (double, 3.+4.i, *, 2, 6+8i);
+  TESTIT (double, 3.+4.i, /, 2, 1.5+2i);
+  TESTIT (int, 3+4i, *, 2, 6+8i);
+  TESTIT (int, 3+4i, /, 2, 1+2i);
+
+  TESTIT (double, 3.+4.i, *, 2+5i, -14+23i);
+  TESTIT (int, 3+4i, *, 2+5i, -14+23i);
+  TESTIT (int, 30+40i, /, 5i, 8-6i);
+  TESTIT (int, 14+6i, /, 7+3i, 2);
+  TESTIT (int, 8+24i, /, 4+12i, 2);
+
+  /* Test for accuracy.  */
+  COMPILETIME_TESTIT (double,
+		      (1 + __DBL_EPSILON__ + 1i),
+		      *,
+		      (1 - __DBL_EPSILON__ + 1i),
+		      -4.93038065763132378382330353301741393545754021943139377981e-32+2i);
+
+  /* This becomes (NaN + iInf).  */
+#define VAL1 ((_Complex double)__builtin_inf() * 1i)
+
+  /* Test some C99 Annex G special cases.  */
+  TEST_ONE_PART_INF ((VAL1) * (VAL1));
+  TEST_ONE_PART_INF ((_Complex double)1 / (_Complex double)0);
+  TEST_ONE_PART_INF ((VAL1) / (_Complex double)1);
+
+  RUNTIME_TESTIT (double, 1, /, VAL1, 0);
+  STATICINIT_TESTIT (double, 1, /, VAL1, 0);
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/fpcmp.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/fpcmp.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/fpcmp.c	(revision 0)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c67x } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-times "cmpeq.p" 4 } } */
+
+double gedf (double x, double y)
+{
+  return x >= y;
+}
+
+double ledf (double x, double y)
+{
+  return x <= y;
+}
+
+float gesf (float x, float y)
+{
+  return x >= y;
+}
+
+float lesf (float x, float y)
+{
+  return x <= y;
+}
Index: gcc/testsuite/gcc.target/tic6x/tic6x.exp
===================================================================
--- gcc/testsuite/gcc.target/tic6x/tic6x.exp	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/tic6x.exp	(revision 0)
@@ -0,0 +1,62 @@
+# Copyright (C) 2010 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `dg.exp' driver.
+
+if ![istarget tic6x-*-*] then {
+  return
+}
+
+# Load support procs.
+load_lib gcc-dg.exp
+
+# Like dg-options, but treats certain C6X-specific options specially:
+#
+#    -march=*
+#	Select the target architecture. Skip the test if the multilib
+#	flags force a different arch.
+proc dg-c6x-options {args} {
+    upvar dg-extra-tool-flags extra_tool_flags
+    upvar dg-do-what do_what
+
+    set multilib_arch ""
+    set arch ""
+
+    foreach flag [target_info multilib_flags] {
+	regexp "^-march=(.*)" $flag dummy multilib_arch
+    }
+
+    set flags [lindex $args 1]
+
+    foreach flag $flags {
+	regexp "^-march=(.*)" $flag dummy arch
+    }
+
+    if {$multilib_arch == "" || $multilib_cpu == $arch} {
+	set extra_tool_flags $flags
+    } else {
+	set do_what [list [lindex $do_what 0] "N" "P"]
+    }
+}
+
+# Initialize `dg'.
+dg-init
+
+# Main loop.
+dg-runtest [lsort [glob -nocomplain $srcdir/$subdir/*.\[cCS\]]]	"" ""
+
+# All done.
+dg-finish
Index: gcc/testsuite/gcc.target/tic6x/fpdiv.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/fpdiv.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/fpdiv.c	(revision 0)
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c67x } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "rcpdp" } } */
+/* { dg-final { scan-assembler "rcpsp" } } */
+
+double f (double x, double y)
+{
+  return x / y;
+}
+
+float g (float x, float y)
+{
+  return x / y;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c	(revision 0)
@@ -0,0 +1,19 @@
+#include <c6x_intrinsics.h>
+extern void abort (void);
+
+int a1 = 0x50000000;
+int b1 = 0xc0000000;
+int a2 = 0xd0000000;
+int b2 = 0x20000000;
+int c = 0x80000000;
+int main ()
+{
+  if (_smpyh (a1, b1) != 0xd8000000)
+    abort ();
+  if (_smpyh (a2, b2) != 0xf4000000)
+    abort ();
+  if (_smpyh (c, c) != 0x7fffffff)
+    abort ();
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp	(revision 0)
@@ -0,0 +1,25 @@
+# Copyright (C) 2009 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with GCC; see the file COPYING3.  If not see
+# <http://www.gnu.org/licenses/>.
+
+# GCC testsuite that uses the `c-torture.exp' driver, looping over
+# optimization options.
+
+load_lib gcc-dg.exp
+
+dg-init
+gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] ""
+dg-finish
+
Index: gcc/testsuite/gcc.target/tic6x/builtins/extclr.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/extclr.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/extclr.c	(revision 0)
@@ -0,0 +1,36 @@
+#include <c6x_intrinsics.h>
+
+extern void abort (void);
+
+#define N 4
+
+int vals[N] = { 0, 0xffffffff, 0x89abcdef, 0xdeadbeef };
+
+int main ()
+{
+  int i;
+  for (i = 0; i < N; i++)
+    {
+      int shf1, shf2;
+      int v = vals[i];
+      unsigned int uv = v;
+
+      for (shf1 = 0; shf1 < 32; shf1++)
+	for (shf2 = 0; shf2 < 32; shf2++)
+	  {
+	    int r = (shf1 << 5) | shf2;
+	    if (shf2 > shf1)
+	      {
+		unsigned int mask = (1u << (shf2 - shf1) << 1) - 1;
+		mask <<= shf1;
+		if (_clrr (v, r) != (v & ~mask))
+		  abort ();
+	      }
+	    if (_extr (v, r) != v << shf1 >> shf2)
+	      abort ();
+	    if (_extru (v, r) != uv << shf1 >> shf2)
+	      abort ();
+	  }
+    }
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/smpy.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/smpy.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/smpy.c	(revision 0)
@@ -0,0 +1,20 @@
+#include <c6x_intrinsics.h>
+
+extern void abort (void);
+
+int a1 = 0x5000;
+int b1 = 0xc000;
+int a2 = 0xd000;
+int b2 = 0x2000;
+int c = 0x8000;
+int main ()
+{
+  if (_smpy (a1, b1) != 0xd8000000)
+    abort ();
+  if (_smpy (a2, b2) != 0xf4000000)
+    abort ();
+  if (_smpy (c, c) != 0x7fffffff)
+    abort ();
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c	(revision 0)
@@ -0,0 +1,47 @@
+#include <c6x_intrinsics.h>
+
+extern void abort (void);
+
+int a1 = 0x50000000;
+int b1 = 0xc0000000;
+int c1 = 0x40000000;
+int a2 = 0xd0000000;
+int b2 = 0x20000000;
+int c2 = 0x90000000;
+int d = 0x80000000;
+
+int main ()
+{
+  if (_sadd (a1, b1) != 0x10000000)
+    abort ();
+  if (_sadd (a2, b2) != 0xf0000000)
+    abort ();
+  if (_sadd (a1, c1) != 0x7fffffff)
+    abort ();
+  if (_sadd (a2, c2) != 0x80000000)
+    abort ();
+
+  if (_ssub (a1, b1) != 0x7fffffff)
+    abort ();
+  if (_ssub (a2, b2) != 0xb0000000)
+    abort ();
+  if (_ssub (b1, a1) != 0x80000000)
+    abort ();
+  if (_ssub (b2, a2) != 0x50000000)
+    abort ();
+
+  if (_abs (a1) != 0x50000000)
+    abort ();
+  if (_abs (b1) != 0x40000000)
+    abort ();
+  if (_abs (d) != 0x7fffffff)
+    abort ();
+
+  if (_sshl (a1, 1) != 0x7fffffff
+      || _sshl (b2, 1) != 0x40000000
+      || _sshl (a2, 1) != 0xa0000000
+      || _sshl (a2, 4) != 0x80000000)
+    abort ();
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c	(revision 0)
@@ -0,0 +1,26 @@
+#include <c6x_intrinsics.h>
+
+extern void abort (void);
+
+int a1 = 0x5000;
+int b1 = 0xc0000000;
+int a2 = 0xd000;
+int b2 = 0x20000000;
+int c = 0x8000;
+int main ()
+{
+  if (_smpylh (a1, b1) != 0xd8000000)
+    abort ();
+  if (_smpylh (a2, b2) != 0xf4000000)
+    abort ();
+  if (_smpylh (c, 0x80000000) != 0x7fffffff)
+    abort ();
+  if (_smpyhl (b1, a1) != 0xd8000000)
+    abort ();
+  if (_smpyhl (b2, a2) != 0xf4000000)
+    abort ();
+  if (_smpyhl (0x80000000, c) != 0x7fffffff)
+    abort ();
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/builtins/arith24.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/arith24.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/builtins/arith24.c	(revision 0)
@@ -0,0 +1,83 @@
+/* { dg-require-effective-target ti_c64xp } */
+
+#include <c6x_intrinsics.h>
+
+extern void abort (void);
+
+typedef short  __v2hi __attribute ((vector_size(4)));
+
+int a = 0x5000d000;
+int b = 0xc0002000;
+int c = 0x40009000;
+int d = 0x80000001;
+int e = 0x50002001;
+int f = 0xc0008000;
+
+int a4 = 0x50d03080;
+int b4 = 0xc020f080;
+int c4 = 0xc0202080;
+int d4 = 0x50003080;
+int e4 = 0xc0202180;
+
+int main ()
+{
+  int v;
+  long long vll;
+
+  v = _add2 (a, b);
+  if (v != 0x1000f000)
+    abort ();
+  v = _sub2 (a, b);
+  if (v != 0x9000b000)
+    abort ();
+  v = _sub2 (b, a);
+  if (v != 0x70005000)
+    abort ();
+
+  v = _add4 (a4, b4);
+  if (v != 0x10f02000)
+    abort ();
+  v = _sub4 (a4, b4);
+  if (v != 0x90b04000)
+    abort ();
+  v = _saddu4 (a4, c4);
+  if (v != 0xfff050ff)
+    abort ();
+
+  v = _sadd2 (a, b);
+  if (v != 0x1000f000)
+    abort ();
+  v = _sadd2 (a, c);
+  if (v != 0x7fff8000)
+    abort ();
+
+  v = _ssub2 (a, b);
+  if (v != 0x7fffb000)
+    abort ();
+  v = _ssub2 (b, a);
+  if (v != 0x80005000)
+    abort ();
+
+  vll = _smpy2ll (a, b);
+  if (vll != 0xd8000000f4000000ll)
+    abort ();
+  vll = _smpy2ll (d, d);
+  if (vll != 0x7fffffff00000002ll)
+    abort ();
+
+  v = _avg2 (b, e);
+  if (v != 0x08002001)
+    abort ();
+  v = _avgu4 (d4, e4);
+  if (v != 0x88102980)
+    abort ();
+
+  v = _abs2 (a);
+  if (v != 0x50003000)
+    abort ();
+  v = _abs2 (f);
+  if (v != 0x40007fff)
+    abort ();
+
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/rotdi16-scan.c	(revision 0)
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c64xp } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler "dpackx" } } */
+
+#include <stdlib.h>
+
+unsigned long long z = 0x012389ab4567cdefull;
+
+int main ()
+{
+  unsigned long long z2 = (z << 48) | (z >> 16);
+  if (z2 != 0xcdef012389ab4567ull)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.target/tic6x/ffssi.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/ffssi.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/ffssi.c	(revision 0)
@@ -0,0 +1,18 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+int foo (int x)
+{
+  return __builtin_ffsl (x);
+}
+
+int bar (int x)
+{
+  return __builtin_clzl (x);
+}
+
+int baz (int x)
+{
+  return __builtin_ctzl (x);
+}
Index: gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/fpdiv-lib.c	(revision 0)
@@ -0,0 +1,15 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c67x } */
+/* { dg-options "-O2 -fno-reciprocal-math" } */
+/* { dg-final { scan-assembler-not "rcpdp" } } */
+/* { dg-final { scan-assembler-not "rcpsp" } } */
+
+double f (double x, double y)
+{
+  return x / y;
+}
+
+float g (float x, float y)
+{
+  return x / y;
+}
Index: gcc/testsuite/gcc.target/tic6x/cold-lc.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/cold-lc.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/cold-lc.c	(revision 0)
@@ -0,0 +1,21 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mlong-calls" } */
+
+extern void dump_stack (void) __attribute__ ((__cold__));
+struct thread_info {
+    struct task_struct *task;
+};
+extern struct thread_info *current_thread_info (void);
+
+void dump_stack (void)
+{
+    unsigned long stack;
+    show_stack ((current_thread_info ()->task), &stack);
+}
+
+void die (char *str, void *fp, int nr)
+{
+    dump_stack ();
+    while (1);
+}
+
Index: gcc/testsuite/gcc.target/tic6x/longcalls.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/longcalls.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/longcalls.c	(revision 0)
@@ -0,0 +1,27 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mlong-calls" } */
+/* { dg-final { scan-assembler-times "\\tcall\[p\]*\[\\t ]*.s" 3 } } */
+/* { dg-final { scan-assembler "call\[p\]*\[\\t ]*.s.\[\\t ]*.f" } } */
+/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.g" } } */
+/* { dg-final { scan-assembler-not "call\[p\]*\[\\t ]*.s.\[\\t ]*.h" } } */
+
+int x;
+
+static __attribute__ ((noinline)) void f ()
+{
+  x = 5;
+}
+
+extern void g ();
+
+static __attribute__ ((noinline)) __attribute__((section(".init.text"))) void h ()
+{
+  x = 5;
+}
+
+int bar ()
+{
+  f ();
+  g ();
+  h ();
+}
Index: gcc/testsuite/gcc.target/tic6x/abi-align-1.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/abi-align-1.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/abi-align-1.c	(revision 0)
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+
+/* common */
+char c;
+/* arrays must be 8 byte aligned, regardless of size */
+char c_ary[1];
+
+/* data */
+char d = 1;
+char d_ary[1] = {1};
+
+int main ()
+{
+  if (((unsigned long)&c_ary[0] & 7) != 0)
+    return 1;
+  if (((unsigned long)&d_ary[0] & 7) != 0)
+    return 1;
+  return 0;
+}
Index: gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/fpcmp-finite.c	(revision 0)
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c67x } */
+/* { dg-options "-O2 -ffinite-math-only" } */
+/* { dg-final { scan-assembler-not "cmpeq" } } */
+
+double gedf (double x, double y)
+{
+  return x >= y;
+}
+
+double ledf (double x, double y)
+{
+  return x <= y;
+}
+
+float gesf (float x, float y)
+{
+  return x >= y;
+}
+
+float lesf (float x, float y)
+{
+  return x <= y;
+}
Index: gcc/testsuite/gcc.target/tic6x/rotdi16.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/rotdi16.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/rotdi16.c	(revision 0)
@@ -0,0 +1,14 @@
+/* { dg-do run } */
+/* { dg-options "-O2" } */
+
+#include <stdlib.h>
+
+unsigned long long z = 0x012389ab4567cdefull;
+
+int main ()
+{
+  unsigned long long z2 = (z << 48) | (z >> 16);
+  if (z2 != 0xcdef012389ab4567ull)
+    abort ();
+  exit (0);
+}
Index: gcc/testsuite/gcc.target/tic6x/bswapl.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/bswapl.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/bswapl.c	(revision 0)
@@ -0,0 +1,13 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -march=c64x+" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+int foo (int x)
+{
+  return __builtin_bswap32 (x);
+}
+
+long long bar (long long x)
+{
+  return __builtin_bswap64 (x);
+}
Index: gcc/testsuite/gcc.target/tic6x/ffsdi.c
===================================================================
--- gcc/testsuite/gcc.target/tic6x/ffsdi.c	(revision 0)
+++ gcc/testsuite/gcc.target/tic6x/ffsdi.c	(revision 0)
@@ -0,0 +1,19 @@
+/* { dg-do compile } */
+/* { dg-require-effective-target ti_c64xp } */
+/* { dg-options "-O2" } */
+/* { dg-final { scan-assembler-not "call" } } */
+
+long long foo (long long x)
+{
+  return __builtin_ffsll (x);
+}
+
+long long bar (long long x)
+{
+  return __builtin_clzll (x);
+}
+
+long long baz (long long x)
+{
+  return __builtin_ctzll (x);
+}
Index: gcc/testsuite/lib/target-supports.exp
===================================================================
--- gcc/testsuite/lib/target-supports.exp	(revision 176308)
+++ gcc/testsuite/lib/target-supports.exp	(working copy)
@@ -568,6 +568,7 @@ proc check_profiling_available { test_wh
 	     || [istarget powerpc-*-eabi*]
 	     || [istarget powerpc-*-elf]
 	     || [istarget rx-*-*]	
+	     || [istarget tic6x-*-elf]
 	     || [istarget xstormy16-*]
 	     || [istarget xtensa*-*-elf]
 	     || [istarget *-*-netware*]
@@ -1398,6 +1399,25 @@ proc check_effective_target_broken_cplxf
     }]
 }
 
+# Return 1 is this is a TI C6X target supporting C67X instructions
+proc check_effective_target_ti_c67x { } {
+    return [check_no_compiler_messages ti_c67x assembly {
+	#if !defined(_TMS320C6700)
+	#error FOO
+	#endif
+    }]
+}
+
+# Return 1 is this is a TI C6X target supporting C64X+ instructions
+proc check_effective_target_ti_c64xp { } {
+    return [check_no_compiler_messages ti_c64xp assembly {
+	#if !defined(_TMS320C6400_PLUS)
+	#error FOO
+	#endif
+    }]
+}
+
+
 proc check_alpha_max_hw_available { } {
     return [check_runtime alpha_max_hw_available {
 	int main() { return __builtin_alpha_amask(1<<8) != 0; }
Index: gcc/testsuite/gcc.c-torture/execute/20101011-1.c
===================================================================
--- gcc/testsuite/gcc.c-torture/execute/20101011-1.c	(revision 176308)
+++ gcc/testsuite/gcc.c-torture/execute/20101011-1.c	(working copy)
@@ -12,6 +12,9 @@
 #elif defined (__sh__)
   /* On SH division by zero does not trap.  */
 # define DO_TEST 0
+#elif defined (__TMS320C6X__)
+  /* On TI C6X division by zero does not trap.  */
+# define DO_TEST 0
 #elif defined (__mips__) && !defined(__linux__)
   /* MIPS divisions do trap by default, but libgloss targets do not
      intercept the trap and raise a SIGFPE.  The same is probably
Index: gcc/testsuite/gcc.dg/pr27095.c
===================================================================
--- gcc/testsuite/gcc.dg/pr27095.c	(revision 176308)
+++ gcc/testsuite/gcc.dg/pr27095.c	(working copy)
@@ -16,10 +16,11 @@ main (int argc, char **argv)
   memset (x, argc, strlen (x));
   return 0;
 }
-/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* } } } } } */
+/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen" { target { ! { powerpc*-*-darwin* hppa*-*-hpux* ia64-*-hpux* alpha*-*-* spu-*-* tic6x-*-* } } } } } */
 /* hppa*-*-hpux* has an IMPORT statement for strlen (plus the branch). */
 /* *-*-darwin* has something similar. */
-/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* } } } */
+/* tic6x emits a comment at the point where the delayed branch happens.  */
+/* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target hppa*-*-hpux* tic6x-*-* } } } */
 /* { dg-final { scan-assembler-not "(?n)bl L_strlen\(.*\n\)+.*bl L_strlen" { target powerpc*-*-darwin* } } } */
 /* ia64-*-hpux* has a global statement, a type statement, and the branch. */
 /* { dg-final { scan-assembler-not "(?n)strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen\(.*\n\)+.*strlen" { target ia64-*-hpux* } } } */
Index: gcc/testsuite/gcc.dg/torture/pr37868.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr37868.c	(revision 176308)
+++ gcc/testsuite/gcc.dg/torture/pr37868.c	(working copy)
@@ -1,6 +1,6 @@
 /* { dg-do run } */
 /* { dg-options "-fno-strict-aliasing" } */
-/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* } "*" "" } */
+/* { dg-skip-if "unaligned access" { sparc*-*-* sh*-*-* tic6x-*-* } "*" "" } */
 
 extern void abort (void);
 #if (__SIZEOF_INT__ <= 2)
Index: gcc/testsuite/gcc.dg/torture/builtin-math-7.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/builtin-math-7.c	(revision 176308)
+++ gcc/testsuite/gcc.dg/torture/builtin-math-7.c	(working copy)
@@ -5,6 +5,7 @@
    Origin: Kaveh R. Ghazi,  August 13, 2009.  */
 
 /* { dg-do run } */
+/* { dg-skip-if "" { tic6x-*-* } "*" "" } */
 /* { dg-add-options ieee } */
 /* { dg-require-effective-target large_double } */
 
Index: gcc/testsuite/gcc.dg/20020312-2.c
===================================================================
--- gcc/testsuite/gcc.dg/20020312-2.c	(revision 176308)
+++ gcc/testsuite/gcc.dg/20020312-2.c	(working copy)
@@ -64,6 +64,8 @@ extern void abort (void);
 # define PIC_REG  "12"
 #elif defined(__sparc__)
 # define PIC_REG  "l7"
+#elif defined(__TMS320C6X__)
+# define PIC_REG "B14"
 #elif defined(__v850)
 /* No pic register.  */
 #elif defined(__vax__)
Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 176308)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -1,3 +1,37 @@
+2011-07-15  Bernd Schmidt  <bernds@codesourcery.com>
+
+	* gcc.target/tic6x/weak-call.c: New test.
+	* gcc.target/tic6x/fpcmp.c: New test.
+	* gcc.target/tic6x/fpdiv.c: New test.
+	* gcc.target/tic6x/rotdi16-scan.c: New test.
+	* gcc.target/tic6x/ffssi.c: New test.
+	* gcc.target/tic6x/fpdiv-lib.c: New test.
+	* gcc.target/tic6x/cold-lc.c: New test.
+	* gcc.target/tic6x/longcalls.c: New test.
+	* gcc.target/tic6x/abi-align-1.c: New test.
+	* gcc.target/tic6x/fpcmp-finite.c: New test.
+	* gcc.target/tic6x/rotdi16.c: New test.
+	* gcc.target/tic6x/bswapl.c: New test.
+	* gcc.target/tic6x/ffsdi.c: New test.
+	* gcc.target/tic6x/tic6x.exp: New file.
+	* gcc/testsuite/gcc.target/tic6x/builtins/arith24.c: New test.
+	* gcc/testsuite/gcc.target/tic6x/builtins/smpy.c: New test.
+	* gcc/testsuite/gcc.target/tic6x/builtins/smpylh.c: New test.
+	* gcc/testsuite/gcc.target/tic6x/builtins/smpyh.c: New test.
+	* gcc/testsuite/gcc.target/tic6x/builtins/sarith1.c: New test.
+	* gcc/testsuite/gcc.target/tic6x/builtins/extclr.c: New test
+	* gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp: New file.
+	* gcc.target/tic6x/builtin-math-7.c: New test, adapted from gcc.dg.
+	* lib/target-supports.exp (chck_profiling_available): Not on tic6x.
+	(check_effective_target_ti_c67x, check_effective_target_ti_c64xp):
+	New functions.
+	* gcc.c-torture/execute/20101011-1.c: Add a condition for
+	__TMS320C6X__.
+	* gcc.dg/20020312-2.c: Likewise.
+	* gcc.dg/pr27095.c: Handle tic6x like hppa.
+	* gcc.dg/torture/pr37868.c: Skip on tic6x.
+	* gcc.dg/torture/builtin-math-7.c: Likewise.
+
 2011-07-14  Andrew Pinski  <pinskia@gmail.com>
 
 	PR tree-opt/49309

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 11/11: Testcases
  2011-07-15 10:06   ` Bernd Schmidt
@ 2011-07-15 12:48     ` H.J. Lu
  2011-07-15 12:50       ` Bernd Schmidt
  2011-07-15 18:23     ` Mike Stump
  1 sibling, 1 reply; 99+ messages in thread
From: H.J. Lu @ 2011-07-15 12:48 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Fri, Jul 15, 2011 at 2:44 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
> On 05/10/11 17:51, Bernd Schmidt wrote:
>> This contains the testsuite changes for the C6X port.
>
> Committed this version. No one commented about the changes outside
> gcc.target/tic6x, but I think they are reasonably obvious. I'm open to
> suggestions for other names for the check_effective_target functions.
>
>

I think this caused:

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49757


-- 
H.J.

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 11/11: Testcases
  2011-07-15 12:48     ` H.J. Lu
@ 2011-07-15 12:50       ` Bernd Schmidt
  0 siblings, 0 replies; 99+ messages in thread
From: Bernd Schmidt @ 2011-07-15 12:50 UTC (permalink / raw)
  To: H.J. Lu; +Cc: GCC Patches

[-- Attachment #1: Type: text/plain, Size: 541 bytes --]

On 07/15/11 14:06, H.J. Lu wrote:
> On Fri, Jul 15, 2011 at 2:44 AM, Bernd Schmidt <bernds@codesourcery.com> wrote:
>> On 05/10/11 17:51, Bernd Schmidt wrote:
>>> This contains the testsuite changes for the C6X port.
>>
>> Committed this version. No one commented about the changes outside
>> gcc.target/tic6x, but I think they are reasonably obvious. I'm open to
>> suggestions for other names for the check_effective_target functions.
>>
>>
> 
> I think this caused:
> 
> http://gcc.gnu.org/bugzilla/show_bug.cgi?id=49757

Fixed.


Bernd


[-- Attachment #2: tfix.diff --]
[-- Type: text/plain, Size: 948 bytes --]

Index: gcc/testsuite/ChangeLog
===================================================================
--- gcc/testsuite/ChangeLog	(revision 176310)
+++ gcc/testsuite/ChangeLog	(working copy)
@@ -32,6 +32,10 @@
 	* gcc.dg/torture/pr37868.c: Skip on tic6x.
 	* gcc.dg/torture/builtin-math-7.c: Likewise.
 
+	PR testsuite/49757
+	* gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp: Return if
+	not testing tic6x-*-*.
+
 2011-07-14  Andrew Pinski  <pinskia@gmail.com>
 
 	PR tree-opt/49309
Index: gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp
===================================================================
--- gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp	(revision 176310)
+++ gcc/testsuite/gcc.target/tic6x/builtins/c6x-builtins.exp	(working copy)
@@ -19,6 +19,10 @@
 
 load_lib gcc-dg.exp
 
+if { ![istarget tic6x-*-*] } then {
+  return
+}
+
 dg-init
 gcc-dg-runtest [lsort [glob $srcdir/$subdir/*.c]] ""
 dg-finish

^ permalink raw reply	[flat|nested] 99+ messages in thread

* Re: C6X port 11/11: Testcases
  2011-07-15 10:06   ` Bernd Schmidt
  2011-07-15 12:48     ` H.J. Lu
@ 2011-07-15 18:23     ` Mike Stump
  1 sibling, 0 replies; 99+ messages in thread
From: Mike Stump @ 2011-07-15 18:23 UTC (permalink / raw)
  To: Bernd Schmidt; +Cc: GCC Patches

On Jul 15, 2011, at 2:44 AM, Bernd Schmidt wrote:
> Committed this version. No one commented about the changes outside
> gcc.target/tic6x, but I think they are reasonably obvious. I'm open to
> suggestions for other names for the check_effective_target functions.

They look fine.  For gcc.dg/torture/builtin-math-7.c, I'd prefer a 1 line comment on why skipping it.  Something short and sweet, "no denorms" or some such.  This lets people that fall into the same conceptual category as you quickly discover that and also skip.

^ permalink raw reply	[flat|nested] 99+ messages in thread

end of thread, other threads:[~2011-07-15 17:37 UTC | newest]

Thread overview: 99+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-05-10 15:36 The TI C6X port Bernd Schmidt
2011-05-10 15:38 ` C6X port 1/11: Reorganize schedule_block Bernd Schmidt
2011-05-10 15:40 ` C6X port 2/11: Use a structure for schedule_block variables Bernd Schmidt
2011-05-10 15:41 ` C6X port 3/11: Cache dependency costs Bernd Schmidt
2011-05-10 15:48 ` C6X port 4/11: Backtracking scheduler Bernd Schmidt
2011-05-11  9:14   ` Richard Sandiford
2011-05-11 11:24     ` Bernd Schmidt
2011-05-25 10:16   ` Hans-Peter Nilsson
2011-05-10 15:54 ` C6X port 5/11: Track predication conditions more accurately Bernd Schmidt
2011-05-11 12:26   ` Alexander Monakov
2011-05-12 18:31     ` Bernd Schmidt
2011-05-31 20:34   ` Steve Ellcey
     [not found]     ` <4DE5489F.4020005@hotbox.ru>
2011-06-01  8:19       ` Andrey Belevantsev
2011-06-01 15:40         ` Steve Ellcey
2011-06-02 11:30           ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Alexander Monakov
2011-06-02 11:35             ` Initialize INSN_COND Bernd Schmidt
2011-06-03 17:44               ` Alexander Monakov
2011-06-03 17:50                 ` Bernd Schmidt
2011-06-07 17:40                   ` Alexander Monakov
2011-06-07 18:11                     ` Gary Funck
2011-06-07 18:28                       ` Gary Funck
2011-06-07 18:35                       ` Gary Funck
2011-06-07 18:56                       ` Alexander Monakov
2011-06-07 20:45                     ` Bernd Schmidt
2011-06-02 22:30             ` Initialize INSN_COND (was: C6X port 5/11: Track predication conditions more accurately) Steve Ellcey
2011-06-03 17:38               ` Steve Ellcey
2011-06-03 18:04                 ` Steve Ellcey
2011-05-10 16:16 ` C6X port 6/11: REG_WORDS_BIG_ENDIAN Bernd Schmidt
2011-05-10 16:51 ` C6X port 8/11: A new FUNCTION_ARG macro Bernd Schmidt
2011-05-10 18:55   ` Joseph S. Myers
2011-05-12 18:20     ` Bernd Schmidt
2011-05-17  7:19       ` Paolo Bonzini
2011-05-27 17:40         ` Bernd Schmidt
2011-05-27 23:26           ` Paolo Bonzini
2011-05-10 16:54 ` C6X port 9/11: Allow defining attributes in terms of another Bernd Schmidt
2011-05-16 18:35   ` Bernd Schmidt
2011-05-25 10:27   ` Hans-Peter Nilsson
2011-05-25 12:03     ` Bernd Schmidt
2011-05-25 14:22       ` Hans-Peter Nilsson
2011-05-26 13:51         ` Bernd Schmidt
2011-05-10 16:56 ` C6X port 11/11: Testcases Bernd Schmidt
2011-07-15 10:06   ` Bernd Schmidt
2011-07-15 12:48     ` H.J. Lu
2011-07-15 12:50       ` Bernd Schmidt
2011-07-15 18:23     ` Mike Stump
2011-05-10 17:02 ` C6X port 10/11: The port Bernd Schmidt
2011-05-10 22:51   ` Joseph S. Myers
2011-05-13 13:59     ` Bernd Schmidt
2011-05-13 15:52       ` Joseph S. Myers
2011-05-13 16:00         ` Bernd Schmidt
2011-05-13 16:08           ` Joseph S. Myers
2011-05-16 18:45         ` Bernd Schmidt
2011-06-16 21:45           ` Joseph S. Myers
2011-05-10 18:29 ` The TI C6X port Joseph S. Myers
2011-05-11 12:18   ` Bernd Schmidt
2011-05-11 12:21     ` Joseph S. Myers
2011-05-13 14:57   ` C6X port 13/11: MAINTAINERS Bernd Schmidt
2011-05-22 18:26     ` Gerald Pfeifer
2011-05-13 13:59 ` Prefixes for libgcc symbols (C6X 9.5/11) Bernd Schmidt
2011-05-13 15:23   ` Joseph S. Myers
2011-05-13 18:24     ` Bernd Schmidt
2011-05-25 14:00       ` H.J. Lu
2011-05-25 14:20         ` Bernd Schmidt
2011-05-25 14:26           ` H.J. Lu
2011-05-25 14:29             ` Bernd Schmidt
2011-05-25 15:14               ` Jakub Jelinek
2011-05-25 17:28               ` H.J. Lu
2011-05-25 17:30                 ` Bernd Schmidt
2011-05-17  7:20   ` Paolo Bonzini
2011-05-24 10:33   ` Ian Lance Taylor
2011-05-26 12:56     ` Bernd Schmidt
2011-05-27  6:23       ` Jack Howarth
2011-05-27  9:59         ` Bernd Schmidt
2011-05-13 14:26 ` C6X port 12/11: htdocs Bernd Schmidt
2011-05-13 15:53   ` Joseph S. Myers
2011-05-13 16:28     ` Bernd Schmidt
2011-05-14  0:53       ` Gerald Pfeifer
2011-05-23 10:26 ` The TI C6X port Bernd Schmidt
2011-05-25  7:15   ` Vladimir Makarov
2011-05-27 16:33     ` Bernd Schmidt
2011-07-13 10:26     ` Bernd Schmidt
2011-05-23 10:33 ` Ping: C6X miscellaneous new hooks Bernd Schmidt
2011-05-23 10:44 ` Ping: C6X libgcc changes Bernd Schmidt
2011-05-30 11:21 ` Ping: The TI C6X port Bernd Schmidt
2011-06-06 11:26   ` Bernd Schmidt
2011-06-14 11:18     ` Bernd Schmidt
2011-06-19  1:10       ` Richard Henderson
2011-06-27 10:20       ` Bernd Schmidt
2011-07-07 22:32         ` Bernd Schmidt
2011-07-07 22:36           ` Richard Henderson
2011-07-07 22:37           ` Richard Henderson
2011-06-14 21:33     ` Vladimir Makarov
2011-07-14 12:15       ` Bernd Schmidt
2011-06-06 12:54   ` Gerald Pfeifer
2011-06-06 13:02     ` Bernd Schmidt
2011-07-11 11:03     ` Bernd Schmidt
2011-07-11 16:05       ` Mike Stump
2011-07-11 16:24         ` Gerald Pfeifer
2011-07-15  9:42           ` Bernd Schmidt

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).