#include <iostream>
#include <emmintrin.h>
using namespace std;
short input[8] = {0, -1, 2048, -2048, 0x7fff, -0x8000, short(2048*3.1415), short(2048*2.7182)};
float output[8];
int main() {
// get input:
__m128i val = _mm_loadu_si128((__m128i*)input);
// add 0x8000 to wrap to unsigned short domain:
val = _mm_add_epi16(val, _mm_set1_epi16(0x8000));
// interleave with upper part of float(1<<23)/2048.f:
__m128i lo = _mm_unpacklo_epi16(val, _mm_set1_epi16(0x4580));
__m128i hi = _mm_unpackhi_epi16(val, _mm_set1_epi16(0x4580));
// interpret as float and subtract float((1<<23) + (0x8000))/2048.f
__m128 lo_f = _mm_sub_ps(_mm_castsi128_ps(lo), _mm_set_ps1(float((1<<23) + (1<<15))/2048.f));
__m128 hi_f = _mm_sub_ps(_mm_castsi128_ps(hi), _mm_set_ps1(float((1<<23) + (1<<15))/2048.f));
// store:
_mm_storeu_ps(output, lo_f);
_mm_storeu_ps(output+4, hi_f);
for(int i=0; i<8; ++i)
std::cout << output[i] << " ";
std::cout << "\n";
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8ZW1taW50cmluLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc2hvcnQgaW5wdXRbOF0gPSB7MCwgLTEsIDIwNDgsIC0yMDQ4LCAweDdmZmYsIC0weDgwMDAsIHNob3J0KDIwNDgqMy4xNDE1KSwgc2hvcnQoMjA0OCoyLjcxODIpfTsKCmZsb2F0IG91dHB1dFs4XTsKCgoKaW50IG1haW4oKSB7CiAgICAvLyBnZXQgaW5wdXQ6CiAgICBfX20xMjhpIHZhbCA9IF9tbV9sb2FkdV9zaTEyOCgoX19tMTI4aSopaW5wdXQpOwogICAgLy8gYWRkIDB4ODAwMCB0byB3cmFwIHRvIHVuc2lnbmVkIHNob3J0IGRvbWFpbjoKICAgIHZhbCA9IF9tbV9hZGRfZXBpMTYodmFsLCBfbW1fc2V0MV9lcGkxNigweDgwMDApKTsKICAgIC8vIGludGVybGVhdmUgd2l0aCB1cHBlciBwYXJ0IG9mIGZsb2F0KDE8PDIzKS8yMDQ4LmY6CiAgICBfX20xMjhpIGxvID0gX21tX3VucGFja2xvX2VwaTE2KHZhbCwgX21tX3NldDFfZXBpMTYoMHg0NTgwKSk7CiAgICBfX20xMjhpIGhpID0gX21tX3VucGFja2hpX2VwaTE2KHZhbCwgX21tX3NldDFfZXBpMTYoMHg0NTgwKSk7CiAgICAvLyBpbnRlcnByZXQgYXMgZmxvYXQgYW5kIHN1YnRyYWN0IGZsb2F0KCgxPDwyMykgKyAoMHg4MDAwKSkvMjA0OC5mCiAgICBfX20xMjggbG9fZiA9IF9tbV9zdWJfcHMoX21tX2Nhc3RzaTEyOF9wcyhsbyksIF9tbV9zZXRfcHMxKGZsb2F0KCgxPDwyMykgKyAoMTw8MTUpKS8yMDQ4LmYpKTsKICAgIF9fbTEyOCBoaV9mID0gX21tX3N1Yl9wcyhfbW1fY2FzdHNpMTI4X3BzKGhpKSwgX21tX3NldF9wczEoZmxvYXQoKDE8PDIzKSArICgxPDwxNSkpLzIwNDguZikpOwogICAgLy8gc3RvcmU6CiAgICBfbW1fc3RvcmV1X3BzKG91dHB1dCwgbG9fZik7CiAgICBfbW1fc3RvcmV1X3BzKG91dHB1dCs0LCBoaV9mKTsKICAgIAogICAgZm9yKGludCBpPTA7IGk8ODsgKytpKQogICAgICAgc3RkOjpjb3V0IDw8IG91dHB1dFtpXSA8PCAiICI7CiAgICBzdGQ6OmNvdXQgPDwgIlxuIjsKfQ==