#include <stdlib.h>
#include <stdio.h>

float *mem_segment;

int main(int argc, char **argv){
	//cycles per access
	int a_elements;	
	int set_size;
	int num1;
float foo = 10, bar = 15;
	/*4KB to 64MB
	for(a_elements=1024; a_elements<16777216; a_elements*=2){
		mem_segment = malloc(sizeof(float)*a_elements);
		

		free(mem_segment);
	}*/

	a_elements=16777216;
	mem_segment = malloc(sizeof(float)*a_elements);
	
	for(num1=0; num1<256; num1++){
		mem_segment[num1] = num1; 
	}

	//for(set_size=1024; set_size<16777216; set_size*=2){
/*
                __asm__(
			//"addl  %ebx,%eax\n"
			"movups (mem_segment), %xmm0\n"         //64 bytes total, 16 floats
			//"movups %xmm0, %xmm1\n"
                        "movups (mem_segment+0x10), %xmm2\n"
                        //"movups %xmm2, %xmm3\n"
                        "movups (mem_segment+0x20), %xmm4\n"
                        //"movups %xmm4, %xmm5\n"
                        "movups (mem_segment+0x30), %xmm6\n"
                        //"movups %xmm6, %xmm7\n"
			//"mov  %%xmm0,%%eax\n"
			//"mov  %%xmm2,%%ebx\n"
                         //    :"=a"(foo)
                           //  :"a"(foo), "b"(bar)
			);

printf("foo=%f\n", foo);
printf("bar=%f\n", bar);
*/
        for(num1=0; num1<16; num1++){
                printf("%d: %f\n", num1, mem_segment[num1]);
        }

	

printf("foo=%f bar=%f\n", foo, bar);
	__asm__ __volatile__ ("add %%bx,%%ax\n" 
		: "=ax"(foo) 		// ouput
		: "ax"(foo), "bx"(bar)// input
		: "ax"			// modify
	);
printf("foo=%f bar=%f\n", foo, bar);













/*
        asm ("leal (%1,%1,4), %0"
             : "=r" (five_times_x)
             : "r" (x) 
             );

instr	%segreg:disp(base,index,scale),foo
movl	0x20(%ebx),%eax
addl	(%ebx,%ecx,0x2),%eax
leal	(%ebx,%ecx),%eax
subl	-0x20(%ebx,%ecx,0x4),%eax




        float a=10, b=5;
        __asm__ (
		"addl %%ebx,%%eax"
		//"addl (%%ebx,%%ecx,0x01),%%eax\n"
		//"leal (%%ebx,%%ecx),%%eax\n"
		//"subl -0x10(%%ebx,%%ecx,0x8),%%eax"

             :"=eax"(a)        // output 0
             :"eax"(a),"ebx"(b)         // input 1
             :"%eax"         // clobbered register
             );       
	printf("b=%f\n", a);


	//}
	//free(mem_segment);
	
        //int foo = 10, bar = 15;
        __asm__ __volatile__(//"addl  %%ebx,%%ecx\n"
                             //"addl  %%ecx,%%edx\n"
				//"movl (mem_segment), %%edx\n"
				"movl  %%edx,%%eax\n"
                             :"=a"(foo)
                             :"b"(mem_segment[1]), "c"(mem_segment[2]), "d"(mem_segment[3]), "a"(mem_segment[0])
                             );
        printf("foo+bar=%f\n", foo);
*/


free(mem_segment);


	return 0;
}
