1  /* PR target/7042.  When reorg.c changed branches into return insns, it
       2     completely forgot about any current_function_epilogue_delay_list and
       3     dropped those insns.  Uncovered on cris-axis-elf, where an insn in an
       4     epilogue delay-slot set the return-value register with the testcase
       5     below.  Derived from ghostscript-6.52 (GPL) by hp@axis.com.  */
       6  
       7  typedef struct font_hints_s {
       8    int axes_swapped;
       9    int x_inverted, y_inverted;
      10  } font_hints;
      11  typedef struct gs_fixed_point_s {
      12    long x, y;
      13  } gs_fixed_point;
      14  
      15  int
      16  line_hints(const font_hints *fh, const gs_fixed_point *p0,
      17  	   const gs_fixed_point *p1)
      18  {
      19    long dx = p1->x - p0->x;
      20    long dy = p1->y - p0->y;
      21    long adx, ady;
      22    int xi = fh->x_inverted, yi = fh->y_inverted;
      23    int hints;
      24    if (xi)
      25      dx = -dx;
      26    if (yi)
      27      dy = -dy;
      28    if (fh->axes_swapped) {
      29      long t = dx;
      30      int ti = xi;
      31      dx = dy, xi = yi;
      32      dy = t, yi = ti;
      33    }
      34    adx = dx < 0 ? -dx : dx;
      35    ady = dy < 0 ? -dy : dy;
      36    if (dy != 0 && (adx <= ady >> 4)) {
      37      hints = dy > 0 ? 2 : 1;
      38      if (xi)
      39        hints ^= 3;
      40    } else if (dx != 0 && (ady <= adx >> 4)) {
      41      hints = dx < 0 ? 8 : 4;
      42      if (yi)
      43        hints ^= 12;
      44    } else
      45      hints = 0;
      46    return hints;
      47  }
      48  int main ()
      49  {
      50    static font_hints fh[] = {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}};
      51    static gs_fixed_point gsf[]
      52      = {{0x30000, 0x13958}, {0x30000, 0x18189},
      53         {0x13958, 0x30000}, {0x18189, 0x30000}};
      54    if (line_hints (fh, gsf, gsf + 1) != 1
      55        || line_hints (fh + 1, gsf + 2, gsf + 3) != 8
      56        || line_hints (fh + 2, gsf + 2, gsf + 3) != 4)
      57      abort ();
      58    exit (0);
      59  }