Скачиваний:
34
Добавлен:
15.09.2014
Размер:
3.77 Кб
Скачать
// AVMiS_MMX.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <windows.h>

using namespace std;

char mathSymbols[] = "+|";

__int64 CountMath(char * stringToDo)
{
	SYSTEMTIME time1, time2;
	__int64 MMX[2];
	__int64 firstNumber = 0, secondNumber = 0, result = 0;
	unsigned int i = 1, j=0;
	char tempBuffer[50],operation;
	while (i < strlen(stringToDo))
	{
		if (strchr(mathSymbols,stringToDo[i]))
		{
			tempBuffer[i-1] = '\0';
			operation = stringToDo[i++];
			break;
		}
		if (stringToDo[i] < '0' && stringToDo[i] > '9')
			return -1;
		tempBuffer[i-1] = stringToDo[i];
		++i;
	}
	firstNumber = _atoi64(tempBuffer);
	while (i < strlen(stringToDo))
	{
		if (stringToDo[i] < '0' && stringToDo[i] > '9')
			return -1;
		tempBuffer[j++] = stringToDo[i++];
	}
	tempBuffer[j] = '\0';
	secondNumber = _atoi64(tempBuffer);
	
	
	switch (operation)
	{
		case '+': GetSystemTime(&time1);
				  for (i = 0; i < 10000000; ++i)
				  {
					  __asm
					  {
						  movq mm0,firstNumber
						  movq mm1,secondNumber
						  movq MMX[0],mm0
						  movq MMX[1],mm1
					  }
					  //for (i = 0; i < 2; ++i)
						cout << "MM" << 1 << ": " << MMX[1] << endl;
					  __asm
					  {
						  paddq mm0,mm1
						  movq result,mm0  
						  movq MMX[0],mm0
						  movq MMX[1],mm1
					  }
				  }
				  GetSystemTime(&time2);
				  time2.wSecond -= time1.wSecond;
				  time2.wMilliseconds -= time1.wMilliseconds;
				  cout << "With MMX: " << time2.wSecond << ":" << time2.wMilliseconds << endl;
				  GetSystemTime(&time1);
				  for (i = 0; i < 10000000; ++i)
					  result = firstNumber + secondNumber;
				  GetSystemTime(&time2);
				  time2.wSecond -= time1.wSecond;
				  time2.wMilliseconds -= time1.wMilliseconds;
				  cout << "Without MMX: " << time2.wSecond  << ":" << time2.wMilliseconds << endl;
				  //for (i = 0; i < 2; ++i)
					//	cout << "MM" << i << ": " << MMX[i] << endl;
				  break;
		case '|': GetSystemTime(&time1);
				  for (i = 0; i < 10000000; ++i)
				  {
					__asm
					{
					  movq mm0,firstNumber
					  movq mm1,secondNumber
					  pandn mm0,mm0
					  por mm0,mm1
					  movq result,mm0
					  movq MMX[0],mm0
					  movq MMX[1],mm1
					  
					}
				  }
				  GetSystemTime(&time2);
				  time2.wSecond -= time1.wSecond;
				  time2.wMilliseconds -= time1.wMilliseconds;
				  cout << "With MMX: " << time2.wSecond << ":" << time2.wMilliseconds << endl;
				  GetSystemTime(&time1);
				  for (i = 0; i < 10000000; ++i)
					  result = firstNumber + secondNumber;
				  GetSystemTime(&time2);
				  time2.wSecond -= time1.wSecond;
				  time2.wMilliseconds -= time1.wMilliseconds;
				  cout << "Without MMX: " << time2.wSecond  << ":" << time2.wMilliseconds << endl;
					for (i = 0; i < 2; ++i)
						cout << "MM" << i << ": " << MMX[i] << endl;
				  break;
		default:  return -1;
	}
	__asm
	{
		emms//osvobodit registry mmx
	}
	return result;
}



int _tmain(int argc, _TCHAR* argv[])
{
	__int64 returnValue = 0;
	char stringToDo[50];
	while(1)
	{
		returnValue = 0;
		cout << "Enter command or math equiption, begin with =" << endl;
		cout << "    Available math actions:" << endl;
		cout << "addition(+)" << endl;
		cout << "OR      (|)" << endl;
		cin >> stringToDo;
		system("cls");
		if (stringToDo[0] == '=')
			returnValue = CountMath(stringToDo);
		switch (returnValue)
		{
			case -1: cout << "Error in math eqiption" << endl;
					 break;
			case -2: cout << "Error in command" << endl;
					 break;
			case -3: return 0;
			case -4: break;
			default: cout << returnValue << stringToDo << endl;
		}
	}
}