| /* { dg-do compile } */ |
| /* { dg-skip-if "" { ! { clmcpu } } } */ |
| /* { dg-options "-mcpu=arc700 -O2 -fpic" } */ |
| |
| /* Test if the compiler generates a constant address having that uses |
| a neg keyword on the pic unspec. */ |
| |
| typedef unsigned int uint32_t; |
| typedef unsigned char uint8_t; |
| typedef unsigned short int uint16_t; |
| typedef unsigned long long int uint64_t; |
| |
| enum type { |
| t_undef = 0x01, |
| t_group = 0x02, |
| t_partition = 0x04, |
| t_spare = 0x08, |
| t_linear = 0x10, |
| t_raid0 = 0x20, |
| t_raid1 = 0x40, |
| t_raid4 = 0x80, |
| t_raid5_ls = 0x100, |
| t_raid5_rs = 0x200, |
| t_raid5_la = 0x400, |
| t_raid5_ra = 0x800, |
| t_raid6 = 0x1000, |
| }; |
| |
| struct raid_set { |
| enum type type; |
| }; |
| |
| void |
| _find_factors (struct raid_set *rs, uint8_t * div, uint8_t * sub) |
| { |
| struct factors { |
| const uint8_t level; |
| const uint8_t div, sub; |
| }; |
| static struct factors factors[] = { |
| {0, 1, 0}, |
| {1, 2, 0}, |
| {2, 2, 0}, |
| {5, 1, 1}, |
| }; |
| struct factors *f = (factors + (sizeof (factors) / sizeof (*factors))); |
| |
| while (f-- > factors) { |
| if (rs->type == f->level) { |
| *div = f->div; |
| *sub = f->sub; |
| return; |
| } |
| } |
| |
| *div = 1; |
| *sub = 0; |
| } |