263 строки
8.5 KiB
C++
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;
|
|
}
|