| /* { dg-do compile } */ |
| /* { dg-options "-O2 -fsplit-paths -fdump-tree-dom3-details" } */ |
| |
| /* There should be two references to bufferstep that turn into |
| constants. */ |
| /* { dg-final { scan-tree-dump-times "Replaced .bufferstep_\[0-9\]+. with constant .0." 1 "dom3"} } */ |
| /* { dg-final { scan-tree-dump-times "Replaced .bufferstep_\[0-9\]+. with constant .1." 1 "dom3"} } */ |
| |
| /* And some assignments ought to fold down to constants. */ |
| /* { dg-final { scan-tree-dump-times "Folded to: _\[0-9\]+ = 1;" 1 "dom3"} } */ |
| /* { dg-final { scan-tree-dump-times "Folded to: _\[0-9\]+ = 0;" 1 "dom3"} } */ |
| |
| /* The XOR operations should have been optimized to constants. */ |
| /* { dg-final { scan-tree-dump-not "bit_xor" "dom3"} } */ |
| |
| |
| extern int *stepsizeTable; |
| |
| void |
| adpcm_coder (signed char *outdata, int len) |
| { |
| signed char *outp; |
| int delta; |
| int outputbuffer; |
| int bufferstep = 0; |
| outp = (signed char *) outdata; |
| int step = 0; |
| int index = 0; |
| int diff = 0; |
| for (; len > 0; len--) |
| { |
| delta = 0; |
| if (diff >= step) |
| delta = 4; |
| step = stepsizeTable[index]; |
| if (bufferstep) |
| outputbuffer = (delta << 4) & 0xf0; |
| else |
| *outp++ = (delta & 0x0f) | outputbuffer; |
| bufferstep = !bufferstep; |
| } |
| } |