# 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;
# }
# <<<
