summaryrefslogtreecommitdiff
path: root/gcc/testsuite/gcc.c-torture
diff options
context:
space:
mode:
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-15 18:14:50 +0000
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2002-06-15 18:14:50 +0000
commita0af33ad8a5bddd049fdf7b5a35717785cd173af (patch)
treefce345c5354c1122bccd8f46ce569df228d61c43 /gcc/testsuite/gcc.c-torture
parentadff42e6a4389342740fc2ffe1a9e71798c87423 (diff)
downloadgcc-a0af33ad8a5bddd049fdf7b5a35717785cd173af.tar.gz
* gcc.c-torture/execute/20020615-1.c: New test.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@54650 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/testsuite/gcc.c-torture')
-rw-r--r--gcc/testsuite/gcc.c-torture/execute/20020615-1.c59
1 files changed, 59 insertions, 0 deletions
diff --git a/gcc/testsuite/gcc.c-torture/execute/20020615-1.c b/gcc/testsuite/gcc.c-torture/execute/20020615-1.c
new file mode 100644
index 00000000000..8a0d37d8070
--- /dev/null
+++ b/gcc/testsuite/gcc.c-torture/execute/20020615-1.c
@@ -0,0 +1,59 @@
+/* PR target/7042. In cris.md the return pattern and its condition
+ had a bug uncovered by the combination of saved registers and
+ filled delay slot, where the delay-slot insn set the
+ return-value register. 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);
+}