Добавил:
Mymnan
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Сборка Часть1 / avmis_labs / неразобрано / 503 / Лаб_MMX / Жуков П.А / AVMiS_MMX / AVMiS_MMX / AVMiS_MMX
.cpp// 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;
}
}
}