/* { dg-skip-if "too many arguments in function call" { bpf-*-* } } */

#define type unsigned char

type glob0, glob1;

#define E0 ((type *)10000000)
#define reg0 r0
#define indreg0 (*p0)
#define imm0 22
#define limm0 ((type)&glob0)
#define adr0 (*E0)
#define adrreg0 (p0[10000000])
#define adrx0 (E0[x0])
#define regx0 (p0[x0])

#define E1 ((type *)11111111)
#define reg1 r1
#define indreg1 (*p1)
#define imm1 33
#define limm1 ((type)&glob1)
#define adr1 (*E1)
#define adrreg1 (p1[1111111/4])
#define adrx1 (E1[x1])
#define regx1 (p1[x1])

reg0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= reg1) return 1; else return 0;}

reg0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= indreg1) return 1; else return 0;}

reg0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= imm1) return 1; else return 0;}

reg0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= limm1) return 1; else return 0;}

reg0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= adr1) return 1; else return 0;}

reg0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= adrreg1) return 1; else return 0;}

reg0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= adrx1) return 1; else return 0;}

reg0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (reg0 <= regx1) return 1; else return 0;}

indreg0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= reg1) return 1; else return 0;}

indreg0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= indreg1) return 1; else return 0;}

indreg0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= imm1) return 1; else return 0;}

indreg0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= limm1) return 1; else return 0;}

indreg0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= adr1) return 1; else return 0;}

indreg0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= adrreg1) return 1; else return 0;}

indreg0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= adrx1) return 1; else return 0;}

indreg0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (indreg0 <= regx1) return 1; else return 0;}

imm0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= reg1) return 1; else return 0;}

imm0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= indreg1) return 1; else return 0;}

imm0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= imm1) return 1; else return 0;}

imm0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= limm1) return 1; else return 0;}

imm0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= adr1) return 1; else return 0;}

imm0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= adrreg1) return 1; else return 0;}

imm0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= adrx1) return 1; else return 0;}

imm0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (imm0 <= regx1) return 1; else return 0;}

limm0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= reg1) return 1; else return 0;}

limm0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= indreg1) return 1; else return 0;}

limm0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= imm1) return 1; else return 0;}

limm0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= limm1) return 1; else return 0;}

limm0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= adr1) return 1; else return 0;}

limm0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= adrreg1) return 1; else return 0;}

limm0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= adrx1) return 1; else return 0;}

limm0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (limm0 <= regx1) return 1; else return 0;}

adr0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= reg1) return 1; else return 0;}

adr0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= indreg1) return 1; else return 0;}

adr0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= imm1) return 1; else return 0;}

adr0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= limm1) return 1; else return 0;}

adr0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= adr1) return 1; else return 0;}

adr0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= adrreg1) return 1; else return 0;}

adr0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= adrx1) return 1; else return 0;}

adr0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adr0 <= regx1) return 1; else return 0;}

adrreg0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= reg1) return 1; else return 0;}

adrreg0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= indreg1) return 1; else return 0;}

adrreg0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= imm1) return 1; else return 0;}

adrreg0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= limm1) return 1; else return 0;}

adrreg0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= adr1) return 1; else return 0;}

adrreg0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= adrreg1) return 1; else return 0;}

adrreg0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= adrx1) return 1; else return 0;}

adrreg0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrreg0 <= regx1) return 1; else return 0;}

adrx0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= reg1) return 1; else return 0;}

adrx0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= indreg1) return 1; else return 0;}

adrx0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= imm1) return 1; else return 0;}

adrx0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= limm1) return 1; else return 0;}

adrx0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= adr1) return 1; else return 0;}

adrx0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= adrreg1) return 1; else return 0;}

adrx0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= adrx1) return 1; else return 0;}

adrx0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (adrx0 <= regx1) return 1; else return 0;}

regx0reg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= reg1) return 1; else return 0;}

regx0indreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= indreg1) return 1; else return 0;}

regx0imm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= imm1) return 1; else return 0;}

regx0limm1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= limm1) return 1; else return 0;}

regx0adr1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= adr1) return 1; else return 0;}

regx0adrreg1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= adrreg1) return 1; else return 0;}

regx0adrx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= adrx1) return 1; else return 0;}

regx0regx1 (r0, r1, x0, x1, p0, p1)
type r0, r1;  type *p0, *p1;
{if (regx0 <= regx1) return 1; else return 0;}

