1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
|
/* PR rtl-optimization/51187 */
/* Reported by Jurij Smakov <jurij@wooyd.org> */
/* { dg-do compile } */
/* { dg-options "-g -O2" } */
extern int printf (__const char *__restrict __format, ...);
extern void print_c_condition (const char *);
enum decision_type
{
DT_num_insns,
DT_mode, DT_code, DT_veclen,
DT_elt_zero_int, DT_elt_one_int, DT_elt_zero_wide, DT_elt_zero_wide_safe,
DT_const_int,
DT_veclen_ge, DT_dup, DT_pred, DT_c_test,
DT_accept_op, DT_accept_insn
};
struct decision_test
{
struct decision_test *next;
enum decision_type type;
union
{
int num_insns;
struct
{
const char *name;
} pred;
const char *c_test;
int veclen;
int dup;
long intval;
int opno;
struct {
int code_number;
int lineno;
int num_clobbers_to_add;
} insn;
} u;
};
enum routine_type {
RECOG, SPLIT, PEEPHOLE2
};
void
write_cond (struct decision_test *p, int depth,
enum routine_type subroutine_type)
{
switch (p->type)
{
case DT_num_insns:
printf ("peep2_current_count >= %d", p->u.num_insns);
break;
case DT_code:
printf ("GET_CODE (x%d) == ", depth);
break;
case DT_veclen:
printf ("XVECLEN (x%d, 0) == %d", depth, p->u.veclen);
break;
case DT_elt_zero_int:
printf ("XINT (x%d, 0) == %d", depth, (int) p->u.intval);
break;
case DT_elt_one_int:
printf ("XINT (x%d, 1) == %d", depth, (int) p->u.intval);
break;
case DT_elt_zero_wide:
case DT_elt_zero_wide_safe:
printf ("XWINT (x%d, 0) == ", depth);
print_host_wide_int (p->u.intval);
break;
case DT_const_int:
printf ("x%d == const_int_rtx[MAX_SAVED_CONST_INT + (%d)]",
depth, (int) p->u.intval);
break;
case DT_veclen_ge:
printf ("XVECLEN (x%d, 0) >= %d", depth, p->u.veclen);
break;
case DT_dup:
printf ("rtx_equal_p (x%d, operands[%d])", depth, p->u.dup);
break;
case DT_pred:
printf ("%s (x%d)", p->u.pred.name, depth);
break;
case DT_c_test:
print_c_condition (p->u.c_test);
break;
case DT_accept_insn:
((void)(__builtin_expect(!(subroutine_type == RECOG), 0) ? __builtin_unreachable(), 0 : 0));
((void)(__builtin_expect(!(p->u.insn.num_clobbers_to_add), 0) ? __builtin_unreachable(), 0 : 0));
printf ("pnum_clobbers != NULL");
break;
default:
__builtin_unreachable();
}
}
/* { dg-final { scan-assembler "printf" } } */
|