shithub: femtolisp

ref: b7f08e854fa7b693837c3c2c2d141954c973117d
dir: /llt/attic/trash.c/

View raw version
/* moving data in small power-of-2 sized units */
void copy_el(char *dest, char *src, size_t sz)
{
    switch (sz) {
    case 16:
        *(int64_t*)&dest[0] = *(int64_t*)&src[0];
        *(int64_t*)&dest[8] = *(int64_t*)&src[8];
        break;
    case 8: *(int64_t*)dest = *(int64_t*)src; break;
    case 4: *(int32_t*)dest = *(int32_t*)src; break;
    case 2: *(int16_t*)dest = *(int16_t*)src; break;
    case 1: *dest = *src; break;
    }
}

void swap_el(char *a, char *b, size_t sz)
{
    int64_t i64;
    int32_t i32;
    int16_t i16;
    int8_t i8;
    switch (sz) {
    case 16:
        i64 = *(int64_t*)&a[0];
        *(int64_t*)&a[0] = *(int64_t*)&b[0];
        *(int64_t*)&b[0] = i64;
        i64 = *(int64_t*)&a[8];
        *(int64_t*)&a[8] = *(int64_t*)&b[8];
        *(int64_t*)&b[8] = i64;
        break;
    case 8:
        i64 = *(int64_t*)a;
        *(int64_t*)a = *(int64_t*)b;
        *(int64_t*)b = i64;
        break;
    case 4:
        i32 = *(int32_t*)a;
        *(int32_t*)a = *(int32_t*)b;
        *(int32_t*)b = i32;
        break;
    case 2:
        i16 = *(int16_t*)a;
        *(int16_t*)a = *(int16_t*)b;
        *(int16_t*)b = i16;
        break;
    case 1:
        i8 = *a;
        *a = *b;
        *b = i8;
        break;
    }
}

void neg_any(void *dest, void *a, numerictype_t tag)
{
    switch (tag) {
    case T_INT8:   *(int8_t  *)dest = -*(int8_t  *)a; break;
    case T_UINT8:  *(uint8_t *)dest = -*(uint8_t *)a; break;
    case T_INT16:  *(int16_t *)dest = -*(int16_t *)a; break;
    case T_UINT16: *(uint16_t*)dest = -*(uint16_t*)a; break;
    case T_INT32:  *(int32_t *)dest = -*(int32_t *)a; break;
    case T_UINT32: *(uint32_t*)dest = -*(uint32_t*)a; break;
    case T_INT64:  *(int64_t *)dest = -*(int64_t *)a; break;
    case T_UINT64: *(uint64_t*)dest = -*(uint64_t*)a; break;
    case T_FLOAT:  *(float   *)dest = -*(float   *)a; break;
    case T_DOUBLE: *(double  *)dest = -*(double  *)a; break;
    }
}