gdal/autotest/cpp/testsse.cpp

263 строки
8.5 KiB
C++

#include <stdio.h>
#include "gdalsse_priv.h"
#define MY_ASSERT(x) \
do \
{ \
if (!(x)) \
{ \
printf("test at line %d failed !\n", __LINE__); \
exit(1); \
} \
} while (0)
int main()
{
{
double x = 1.23;
XMMReg4Double reg = XMMReg4Double::Load1ValHighAndLow(&x);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == x);
MY_ASSERT(res[1] == x);
MY_ASSERT(res[2] == x);
MY_ASSERT(res[3] == x);
}
{
unsigned char input[] = {1, 2, 3, 4};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
unsigned char output[4];
reg.Store4Val(output);
MY_ASSERT(output[0] == input[0]);
MY_ASSERT(output[1] == input[1]);
MY_ASSERT(output[2] == input[2]);
MY_ASSERT(output[3] == input[3]);
}
{
unsigned short input[] = {1, 65535, 3, 65534};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
unsigned short output[4];
reg.Store4Val(output);
MY_ASSERT(output[0] == input[0]);
MY_ASSERT(output[1] == input[1]);
MY_ASSERT(output[2] == input[2]);
MY_ASSERT(output[3] == input[3]);
}
{
short input[] = {1, 32767, 3, -32768};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
}
{
float input[] = {1.0f, 2.0f, 3.0f, 4.0f};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
float output[4];
reg.Store4Val(output);
MY_ASSERT(output[0] == input[0]);
MY_ASSERT(output[1] == input[1]);
MY_ASSERT(output[2] == input[2]);
MY_ASSERT(output[3] == input[3]);
}
{
double input[] = {1.0, 2.0, 3.0, 4.0};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
double res[4];
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
MY_ASSERT(reg.GetHorizSum() ==
input[0] + input[1] + input[2] + input[3]);
double input2[] = {100.0, 200.0};
reg.AddToLow(XMMReg2Double::Load2Val(input2));
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0] + input2[0]);
MY_ASSERT(res[1] == input[1] + input2[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
}
{
double input[] = {1.0, 2.0, 3.0, 4.0};
double input2[] = {10.0, 9.0, 8.0, 7.0};
XMMReg4Double reg = XMMReg4Double::Load4Val(input);
XMMReg4Double reg2 = XMMReg4Double::Load4Val(input2);
double res[4];
(reg + reg2).Store4Val(res);
MY_ASSERT(res[0] == input[0] + input2[0]);
MY_ASSERT(res[1] == input[1] + input2[1]);
MY_ASSERT(res[2] == input[2] + input2[2]);
MY_ASSERT(res[3] == input[3] + input2[3]);
reg += reg2;
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0] + input2[0]);
MY_ASSERT(res[1] == input[1] + input2[1]);
MY_ASSERT(res[2] == input[2] + input2[2]);
MY_ASSERT(res[3] == input[3] + input2[3]);
reg = reg - reg2;
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
(reg * reg2).Store4Val(res);
MY_ASSERT(res[0] == input[0] * input2[0]);
MY_ASSERT(res[1] == input[1] * input2[1]);
MY_ASSERT(res[2] == input[2] * input2[2]);
MY_ASSERT(res[3] == input[3] * input2[3]);
(reg / reg2).Store4Val(res);
MY_ASSERT(res[0] == input[0] / input2[0]);
MY_ASSERT(res[1] == input[1] / input2[1]);
MY_ASSERT(res[2] == input[2] / input2[2]);
MY_ASSERT(res[3] == input[3] / input2[3]);
reg *= reg2;
reg.Store4Val(res);
MY_ASSERT(res[0] == input[0] * input2[0]);
MY_ASSERT(res[1] == input[1] * input2[1]);
MY_ASSERT(res[2] == input[2] * input2[2]);
MY_ASSERT(res[3] == input[3] * input2[3]);
reg = XMMReg4Double::Load4Val(input);
reg2 = reg;
reg2.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == input[3]);
unsigned char mask[32];
XMMReg4Double::Equals(reg, reg).StoreMask(mask);
MY_ASSERT(mask[0] == 0xFF);
MY_ASSERT(mask[8] == 0xFF);
MY_ASSERT(mask[16] == 0xFF);
MY_ASSERT(mask[24] == 0xFF);
XMMReg4Double::NotEquals(reg, reg).StoreMask(mask);
MY_ASSERT(mask[0] == 0);
MY_ASSERT(mask[8] == 0);
MY_ASSERT(mask[16] == 0);
MY_ASSERT(mask[24] == 0);
XMMReg4Double::Greater(reg, reg).StoreMask(mask);
MY_ASSERT(mask[0] == 0);
MY_ASSERT(mask[8] == 0);
MY_ASSERT(mask[16] == 0);
MY_ASSERT(mask[24] == 0);
double diff[] = {1.5, -1.5, -0.5, 0.5};
XMMReg4Double::Greater(reg, reg + XMMReg4Double::Load4Val(diff))
.StoreMask(mask);
MY_ASSERT(mask[0] == 0);
MY_ASSERT(mask[8] == 0xFF);
MY_ASSERT(mask[16] == 0xFF);
MY_ASSERT(mask[24] == 0);
XMMReg4Double::Min(reg, reg + XMMReg4Double::Load4Val(diff))
.Store4Val(res);
MY_ASSERT(res[0] == input[0]);
MY_ASSERT(res[1] == input[1] + diff[1]);
MY_ASSERT(res[2] == input[2] + diff[2]);
MY_ASSERT(res[3] == input[3]);
reg = XMMReg4Double::Load4Val(input);
XMMReg4Double reg_diff = XMMReg4Double::Load4Val(diff);
XMMReg4Double::Ternary(XMMReg4Double::Greater(reg, reg + reg_diff), reg,
reg_diff)
.Store4Val(res);
MY_ASSERT(res[0] == diff[0]);
MY_ASSERT(res[1] == input[1]);
MY_ASSERT(res[2] == input[2]);
MY_ASSERT(res[3] == diff[3]);
}
#ifndef USE_SSE2_EMULATION
{
float input[] = {-1.3f, 1.5f, 40000.3f, 65537.0f};
GUInt16 output[4];
GDALCopy4Words(input, output);
MY_ASSERT(output[0] == 0);
MY_ASSERT(output[1] == 2);
MY_ASSERT(output[2] == 40000);
MY_ASSERT(output[3] == 65535);
}
#endif
#ifndef USE_SSE2_EMULATION
{
float input[] = {-1.3f, 1.5f, 40000.3f, 65537.0f,
40000.3f, 1.3f, 65537.0f, -1.3f};
GUInt16 output[8];
GDALCopy8Words(input, output);
MY_ASSERT(output[0] == 0);
MY_ASSERT(output[1] == 2);
MY_ASSERT(output[2] == 40000);
MY_ASSERT(output[3] == 65535);
MY_ASSERT(output[4] == 40000);
MY_ASSERT(output[5] == 1);
MY_ASSERT(output[6] == 65535);
MY_ASSERT(output[7] == 0);
}
{
float input[] = {-1.3f, 1.5f, 40000.3f, 65537.0f,
40000.3f, 1.3f, 65537.0f, -1.3f};
unsigned char output[8];
GDALCopy8Words<float, unsigned char>(input, output);
MY_ASSERT(output[0] == 0);
MY_ASSERT(output[1] == 2);
MY_ASSERT(output[2] == 255);
MY_ASSERT(output[3] == 255);
MY_ASSERT(output[4] == 255);
MY_ASSERT(output[5] == 1);
MY_ASSERT(output[6] == 255);
MY_ASSERT(output[7] == 0);
}
#endif
return 0;
}