modernc.org/ccgo/v3@v3.16.14/lib/testdata/gcc-9.1.0/gcc/testsuite/gcc.c-torture/execute/20020615-1.c (about)

     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  }