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

#define CHIPS 5
#define LABELS 6

const char *chips[CHIPS] = {"Kaveri     ", "Trinity    ", "Llano      ", "Haswell    ", "Ivy Bridge"};
const char *labels[LABELS] = {"sse32:     ", "sse64:     ", "avx32:     ", "avx64:     ", "avxfma32:  ", "avxfma64:  "};

void spaces(float num){
	if(num<10)
		printf("       ");
	else if(num<100)
		printf("      ");
	else if(num<1000)
		printf("     ");
	else
		printf("    ");
}

int main(int argc, char **argv){
	uint32_t sse32_c[CHIPS] = {16, 16, 32, 32, 32};
	uint32_t sse64_c[CHIPS] = {8, 8, 16, 16, 16};
	uint32_t avx32_c[CHIPS] = {16, 16, 0, 64, 64};
	uint32_t avx64_c[CHIPS] = {8, 8, 0, 32, 32};
	uint32_t avxfma32_c[CHIPS] = {32, 32, 0, 128, 0};
	uint32_t avxfma64_c[CHIPS] = {16, 16, 0, 64, 0};

	float sse32_g[CHIPS] = {0,0,0,0,0};
	float sse64_g[CHIPS] = {0,0,0,0,0};
	float avx32_g[CHIPS] = {0,0,0,0,0};
	float avx64_g[CHIPS] = {0,0,0,0,0};
	float avxfma32_g[CHIPS] = {0,0,0,0,0};
	float avxfma64_g[CHIPS] = {0,0,0,0,0};

	//float MHz[CLOCKS] = {3.0, 3.3, 3.6, 3.8, 4.0, 4.2, 4.4};

	uint32_t num1, num2;
	if(argc != 2)
		exit(1);
	float target_GHz = atof(argv[1]);
	char buf[16];

	for(num1=0; num1<CHIPS; num1++){
		sse32_g[num1] = target_GHz*sse32_c[num1];
		sse64_g[num1] = target_GHz*sse64_c[num1];
		avx32_g[num1] = target_GHz*avx32_c[num1];
		avx64_g[num1] = target_GHz*avx64_c[num1];
		avxfma32_g[num1] = target_GHz*avxfma32_c[num1];
		avxfma64_g[num1] = target_GHz*avxfma64_c[num1];
	}
	printf("           ");
	for(num1=0; num1<CHIPS; num1++){
		printf("%s", chips[num1]);
	}
	printf("\n");
	num2=0;

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", sse32_g[num1]);
spaces(sse32_g[num1]);
}
//(void)sprintf("%.02f", sse32_g[num1]);
//}
printf("\n");

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", sse64_g[num1]);
spaces(sse64_g[num1]);
}
printf("\n");

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", avx32_g[num1]);
spaces(avx32_g[num1]);
}
printf("\n");

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", avx64_g[num1]);
spaces(avx64_g[num1]);
}
printf("\n");

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", avxfma32_g[num1]);
spaces(avxfma32_g[num1]);
}
printf("\n");

printf("%s", labels[num2++]);
for(num1=0; num1<CHIPS; num1++){
printf("%.02f", avxfma64_g[num1]);
spaces(avxfma64_g[num1]);
}
printf("\n");



	return 0;
}
