1// PR target/11689
2// Originator: thor@math.tu-berlin.de
3
4// { dg-do compile }
5// { dg-options "-O3 -funroll-loops -mtune=k6 -fomit-frame-pointer" { target { { i?86-*-* x86_64-*-* } && ia32 } } }
6
7
8// This used to fail to assemble because of an out-of-range 'loop' instructions.
9
10
11class JKeeper {
12public:
13  unsigned long a0;
14};
15
16class EBCOTLut : public JKeeper {
17  unsigned char a1[1<<8];
18  unsigned char a2[1<<9];
19  unsigned char a3[1<<9];
20  long          a4[1<<9];
21public:
22  EBCOTLut(void);
23};
24
25EBCOTLut::EBCOTLut(void)
26{
27  unsigned char inter[36];   // intermediate lookup table;
28  unsigned long i;
29  for(i=0;i<36;i++) {
30    inter[i] = 0;
31  }
32  for(i=1;i<16;i++) {
33    a1[i | (1<<7)] = 8<<1;
34    a1[i | (1<<6)] = 8<<1;
35  }
36  for(i=0;i < ((1<<9)-1);i++) {
37    int ds = (i>>0) & 0x01;    // significance of DOWN
38    int us = (i>>1) & 0x01;    // significance of UP
39    int rs = (i>>2) & 0x01;    // significance of RIGHT
40    int ls = (i>>3) & 0x01;    // significance of LEFT
41    int dn = (i>>5) & 0x01;    // sign of DOWN
42    int un = (i>>6) & 0x01;    // sign of UP
43    int rn = (i>>7) & 0x01;    // sign of RIGHT
44    int ln = (i>>8) & 0x01;    // sign of LEFT
45    int h,v;                   // h and v as in the VM description
46
47    h = ls*(1-ln*2) + rs*(1-2*rn);
48    v = us*(1-un*2) + ds*(1-2*dn);
49    h = (h >= -1)?(h):(-1);
50    v = (v >= -1)?(v):(-1);
51    h = (h <=  1)?(h):(1);
52    v = (v <=  1)?(v):(1);
53    a2[i] = inter[((h+1)<<3) | (v+1)];
54    a3[i] = inter[((h+1)<<3) | (v+1)] & (unsigned char)(~1);
55  }
56  for(i=0;i< 1<<9; i++) {
57    a4[i]    = 2*(i-(1<<(9-1)))*(i-(1<<(9-1))) -
58      ((i< (1<<(9-1)))?
59       (2*(i-(1<<(9-2)))*(i-(1<<(9-2)))):
60       (2*(i-(3<<(9-2)))*(i-(3<<(9-2)))));
61
62  }
63}
64