| /* PR target/7042. When reorg.c changed branches into return insns, it |
| completely forgot about any current_function_epilogue_delay_list and |
| dropped those insns. Uncovered on cris-axis-elf, where an insn in an |
| epilogue delay-slot set the return-value register with the testcase |
| below. Derived from ghostscript-6.52 (GPL) by hp@axis.com. */ |
| |
| typedef struct font_hints_s { |
| int axes_swapped; |
| int x_inverted, y_inverted; |
| } font_hints; |
| typedef struct gs_fixed_point_s { |
| long x, y; |
| } gs_fixed_point; |
| |
| int |
| line_hints(const font_hints *fh, const gs_fixed_point *p0, |
| const gs_fixed_point *p1) |
| { |
| long dx = p1->x - p0->x; |
| long dy = p1->y - p0->y; |
| long adx, ady; |
| int xi = fh->x_inverted, yi = fh->y_inverted; |
| int hints; |
| if (xi) |
| dx = -dx; |
| if (yi) |
| dy = -dy; |
| if (fh->axes_swapped) { |
| long t = dx; |
| int ti = xi; |
| dx = dy, xi = yi; |
| dy = t, yi = ti; |
| } |
| adx = dx < 0 ? -dx : dx; |
| ady = dy < 0 ? -dy : dy; |
| if (dy != 0 && (adx <= ady >> 4)) { |
| hints = dy > 0 ? 2 : 1; |
| if (xi) |
| hints ^= 3; |
| } else if (dx != 0 && (ady <= adx >> 4)) { |
| hints = dx < 0 ? 8 : 4; |
| if (yi) |
| hints ^= 12; |
| } else |
| hints = 0; |
| return hints; |
| } |
| int main () |
| { |
| static font_hints fh[] = {{0, 1, 0}, {0, 0, 1}, {0, 0, 0}}; |
| static gs_fixed_point gsf[] |
| = {{0x30000, 0x13958}, {0x30000, 0x18189}, |
| {0x13958, 0x30000}, {0x18189, 0x30000}}; |
| if (line_hints (fh, gsf, gsf + 1) != 1 |
| || line_hints (fh + 1, gsf + 2, gsf + 3) != 8 |
| || line_hints (fh + 2, gsf + 2, gsf + 3) != 4) |
| abort (); |
| exit (0); |
| } |