#include "xed-immed.h"
#include "xed-portability.h"
xed_int64_t xed_immed_from_bytes(xed_int8_t* bytes, xed_uint_t n) {
xed_int64_t r;
xed_union64_t m1, m2;
int i;
xed_uint8_t* ub = (xed_uint8_t*) bytes;
m1.s.hi32 = 0xFFFFFFFF;
m1.s.lo32 = 0;
m2.s.hi32 = 0xFFFFFFFF;
m2.s.lo32 = 0xFFFF0000;
if (n == 0)
return 0;
else if (n == 4) {
r = ((xed_uint64_t)ub[3] << 24) | ((xed_uint64_t)ub[2] << 16) | ((xed_uint64_t)ub[1] << 8) | (xed_uint64_t)ub[0];
if (bytes[3] < 0) {
r = r | m1.i64;
}
return r;
}
else if (n == 1)
return bytes[0];
else if (n == 8) {
r = 0;
for(i=n-1;i>=0;i--)
r = (r << 8) | ub[i];
return r;
}
else if (n == 2) {
r = (ub[1] << 8) | ub[0];
if (bytes[1] < 0) {
r = r | m2.i64;
}
return r;
}
xed_assert(n==0||n==1||n==2||n==4||n==8);
return 0;
}