Last active
March 14, 2017 16:19
-
-
Save shilrobot/fef8a7f425d5763cba8110238125c5d2 to your computer and use it in GitHub Desktop.
On Release x64 on VC++ 2015 update 3 this doesn't work, on Debug x64/x86 this works just fine... >:|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <stdint.h> | |
#include <stdio.h> | |
#include <stdlib.h> | |
#include <string.h> | |
#include "emmintrin.h" | |
struct Color4 | |
{ | |
uint8_t red; | |
uint8_t green; | |
uint8_t blue; | |
uint8_t alpha; | |
Color4(uint8_t red, uint8_t green, uint8_t blue, uint8_t alpha = 255) | |
: red(red), green(green), blue(blue), alpha(alpha) {} | |
explicit Color4(uint32_t rgba) | |
{ | |
red = (uint8_t)(rgba & 0xFF); | |
green = (uint8_t)((rgba >> 8)&0xFF); | |
blue = (uint8_t)((rgba >> 16) & 0xFF); | |
alpha = (uint8_t)((rgba >> 24) & 0xFF); | |
} | |
}; | |
Color4 PackUnpack(Color4 col) | |
{ | |
uint32_t tmp; | |
memcpy(&tmp, &col, sizeof(tmp)); | |
__m128 aFloat = _mm_cvtepi32_ps( | |
_mm_unpacklo_epi16( | |
_mm_unpacklo_epi8( | |
_mm_set1_epi32(tmp), | |
_mm_setzero_si128() | |
), | |
_mm_setzero_si128() | |
) | |
); | |
__m128i ret = _mm_packus_epi16( | |
_mm_packs_epi32( | |
_mm_cvtps_epi32(aFloat), | |
_mm_setzero_si128() | |
), | |
_mm_setzero_si128() | |
); | |
return Color4((uint32_t)_mm_cvtsi128_si32(ret)); | |
} | |
int main() | |
{ | |
#ifdef _DEBUG | |
printf("DEBUG\n"); | |
#else | |
printf("RELEASE\n"); | |
#endif | |
Color4 c = PackUnpack(Color4(32, 64, 128, 255)); | |
// Debug x64 or Debug/Release x86: Prints "32 64 128 255" | |
// Release x64: Prints "255 0 0 0" | |
printf("%d %d %d %d\n", c.red, c.green, c.blue, c.alpha); | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment