# amd64 address-folding stress export function w $f0(l %a, l %b) { @start %c =l add %b, 2 %d =l mul %c, 4 %e =l add %a, %d %q =l loadw %e ret %q } export function w $f1(l %a, l %b) { @start %c =l add 1, %b %f =l add %c, 1 %d =l mul %f, 4 %e =l add %d, %a %q =l loadw %e ret %q } export function w $f2(l %a, l %b) { @start %l =l mul %b, 4 %d =l add 8, %l %e =l add %a, %d %q =l loadw %e ret %q } # fixme: folding is not good here export function w $f3(l %a, l %b) { @start %l =l mul %b, 4 %d =l add 4, %l %f =l add 4, %d %e =l add %a, %f %q =l loadw %e ret %q } export function w $f4(l %a, l %b) { @start %c =l add 1, %b %d =l mul %c, 4 %e =l add 4, %d %f =l add %e, %a %q =l loadw %f ret %q } # >>> driver # int a[] = {1, 2, 3, 4}; # typedef int loadf(int *, long long); # extern loadf f0, f1, f2, f3, f4; # loadf *fns[] = {&f0, &f1, &f2, &f3, &f4, 0}; # int main() { # loadf **f; # int n; # for (n=1,f=fns; *f; f++,n++) # if ((*f)(a, 1) != 4) return n; # return 0; # } # <<<