Code: Select all
// Algorithm...
x = x / 3.4;
x = clip(x, -1, +1);
x = (abs(x)-2)*x;
x = (abs(x)-2)*x;
// ABS constant
__declspec(align(16)) struct U32Quad
{
uint32 a,b,c,d;
};
const U32Quad MASK_FOR_ABS = {0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF, 0x7FFFFFFF};
// SSE code
// XMM0 = x
MULSS XMM0,0.29411f; // (1/3.4)
MINPS XMM0,1.0f
MAXPS XMM0,-1.0f
MOVSS XMM1,XMM0
ANDPS XMM0,MASK_FOR_ABS
SUBSS XMM0,2.0f
MULSS XMM0,XMM1
MOVSS XMM1,XMM0
ANDPS XMM0,MASK_FOR_ABS
SUBSS XMM0,2.0f
MULSS XMM0,XMM1
It looks like this...

red is tanh, yellow is the imposter.
