#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
#include "sys.h"
#include "crisutils.h"

/* this would be better to do in asm, it's an orgy in GCC inline asm now.  */

#define cris_addo_b(o, v) \
	asm volatile ("addo.b\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
#define cris_addo_w(o, v) \
	asm volatile ("addo.w\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
#define cris_addo_d(o, v) \
	asm volatile ("addo.d\t[%0], %1, $acr\n" : : "r" (o), "r" (v) : "acr");
#define cris_addo_pi_b(o, v) \
	asm volatile ("addo.b\t[%0+], %1, $acr\n" \
                         : "+b" (o): "r" (v) : "acr");
#define cris_addo_pi_w(o, v) \
	asm volatile ("addo.w\t[%0+], %1, $acr\n" \
                         : "+b" (o): "r" (v) : "acr");
#define cris_addo_pi_d(o, v) \
	asm volatile ("addo.d\t[%0+], %1, $acr\n" \
                         : "+b" (o): "r" (v) : "acr");

struct {
	uint32_t v1;
	uint16_t v2;
	uint32_t v3;
	uint8_t v4;
	uint8_t v5;
	uint16_t v6;
	uint32_t v7;
} y = {
	32769,
	-1,
	5,
	3, -4,
	2,
	-76789887
};

static int x[3] = {0x55aa77ff, 0xccff2244, 0x88ccee19};

int main(void)
{
	int *r;
	unsigned char *t, *p;

	/* Note, this test-case will trig an unaligned access, partly
	   to x[0] and to [x1].  */
	t = (unsigned char *)x;
	t -= 32768;
	p = (unsigned char *) &y.v1;
	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_pi_d(p, t);
	cris_tst_cc(1, 1, 1, 1);
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*r != 0x4455aa77)
		err();


	t += 32770;
	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_pi_w(p, t);
	cris_tst_cc(1, 1, 1, 1);
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*r != 0x4455aa77)
		err();

	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_d(p, r);
	cris_tst_cc(1, 1, 1, 1);
	p += 4;
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*r != 0xee19ccff)
		err();

	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_pi_b(p, t);
	cris_tst_cc(0, 0, 0, 0);
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*(uint16_t*)r != 0xff22)
		err();

	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_b(p, r);
	cris_tst_cc(1, 1, 1, 1);
	p += 1;
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*r != 0x4455aa77)
		err();

	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_w(p, r);
	cris_tst_cc(1, 1, 1, 1);
	p += 2;
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	if (*r != 0xff224455)
		err();

	mb(); /* don't reorder anything beyond here.  */
	cris_tst_cc_init();
	asm volatile ("setf\tzvnc\n");
	cris_addo_pi_d(p, t);
	cris_tst_cc(0, 0, 0, 0);
	asm volatile ("move.d\t$acr, %0\n" : "=r" (r));
	r = (void*)(((char *)r) + 76789885);
	if (*r != 0x55aa77ff)
		err();

	pass();
	return 0;
}
