#include <stdio.h>

void calc(unsigned int r1, unsigned int r2);

int main()
{
	unsigned int r1, r2;

	for(r1 = 0x3fff8000; r1 < 0x40007000; r1 += 0x1000){
		calc(r1, 0x2);
	}
	calc(0x7fffffff, 0x2);
	calc(0x80000000, 0x2);
	calc(0x80000001, 0x2);
}

void calc(unsigned int r1, unsigned int r2)
{
	unsigned int tmp, result, dummy;
	unsigned long long rlong;

	rlong = (unsigned long long)r1;
	rlong *= (unsigned long long)r2;

	asm volatile (
		"mov	%4, #0x80000000\n\t"
		"sub	%4, %4, #1\n\t"

		"umull	%0, %1, %2, %3\n\t"

		"cmp	%1, #0\n\t"
		"movne	%0, %4\n\t"

		"cmp	%0, #0\n\t"
		"movmi	%0, %4\n\t"
		: "=&r" (result)
		: "r" (tmp), "r" (r1), "r" (r2), "r" (dummy)
		);

	printf("res:%lx rlong=%llx\n", result, rlong);

#if 0
	/* r2 * r3 = r5 */
	/* break: r0, r2, r3 */
	/* ret  : r5 */
	asm volatile (
		"umull	r5, r0, r2, r3\n\t"

		"cmp	r0, #0\n\t"
		"ldrne	r5, [pc, #8]\n\t"

		"cmp	r5, #0\n\t"
		"ldrmi	r5, [pc, #0]\n\t"
		"mov	pc, lr\n\t"
		"l: .long 0x7fffffff\n\t"
		);
#endif
}

