iwmmxt_helper.c

来自「xen虚拟机源代码安装包」· C语言 代码 · 共 683 行 · 第 1/2 页

C
683
字号
        SIMD8_SET(ZBIT8((a >> 32) & 0xff), SIMD_ZBIT, 4) |                \        SIMD8_SET(ZBIT8((a >> 40) & 0xff), SIMD_ZBIT, 5) |                \        SIMD8_SET(ZBIT8((a >> 48) & 0xff), SIMD_ZBIT, 6) |                \        SIMD8_SET(ZBIT8((a >> 56) & 0xff), SIMD_ZBIT, 7);                 \    return a;                                                             \}IWMMXT_OP_AVGB(0)IWMMXT_OP_AVGB(1)#undef IWMMXT_OP_AVGB#undef AVGB#define AVGW(SHR) ((( \        ((a >> SHR) & 0xffff) + ((b >> SHR) & 0xffff) + round) >> 1) << SHR)#define IWMMXT_OP_AVGW(r)                                               \uint64_t HELPER(iwmmxt_avgw##r)(CPUState *env, uint64_t a, uint64_t b)  \{                                                                       \    const int round = r;                                                \    a = AVGW(0) | AVGW(16) | AVGW(32) | AVGW(48);                       \    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =                               \        SIMD16_SET(ZBIT16((a >> 0) & 0xffff), SIMD_ZBIT, 0) |           \        SIMD16_SET(ZBIT16((a >> 16) & 0xffff), SIMD_ZBIT, 1) |          \        SIMD16_SET(ZBIT16((a >> 32) & 0xffff), SIMD_ZBIT, 2) |          \        SIMD16_SET(ZBIT16((a >> 48) & 0xffff), SIMD_ZBIT, 3);           \    return a;                                                           \}IWMMXT_OP_AVGW(0)IWMMXT_OP_AVGW(1)#undef IWMMXT_OP_AVGW#undef AVGWuint64_t HELPER(iwmmxt_msadb)(uint64_t a, uint64_t b){    a =  ((((a >> 0 ) & 0xffff) * ((b >> 0) & 0xffff) +           ((a >> 16) & 0xffff) * ((b >> 16) & 0xffff)) & 0xffffffff) |         ((((a >> 32) & 0xffff) * ((b >> 32) & 0xffff) +           ((a >> 48) & 0xffff) * ((b >> 48) & 0xffff)) << 32);    return a;}uint64_t HELPER(iwmmxt_align)(uint64_t a, uint64_t b, uint32_t n){    a >>= n << 3;    a |= b << (64 - (n << 3));    return a;}uint64_t HELPER(iwmmxt_insr)(uint64_t x, uint32_t a, uint32_t b, uint32_t n){    x &= ~((uint64_t) b << n);    x |= (uint64_t) (a & b) << n;    return x;}uint32_t HELPER(iwmmxt_setpsr_nz)(uint64_t x){    return SIMD64_SET((x == 0), SIMD_ZBIT) |           SIMD64_SET((x & (1ULL << 63)), SIMD_NBIT);}uint64_t HELPER(iwmmxt_bcstb)(uint32_t arg){    arg &= 0xff;    return        ((uint64_t) arg << 0 ) | ((uint64_t) arg << 8 ) |        ((uint64_t) arg << 16) | ((uint64_t) arg << 24) |        ((uint64_t) arg << 32) | ((uint64_t) arg << 40) |        ((uint64_t) arg << 48) | ((uint64_t) arg << 56);}uint64_t HELPER(iwmmxt_bcstw)(uint32_t arg){    arg &= 0xffff;    return        ((uint64_t) arg << 0 ) | ((uint64_t) arg << 16) |        ((uint64_t) arg << 32) | ((uint64_t) arg << 48);}uint64_t HELPER(iwmmxt_bcstl)(uint32_t arg){    return arg | ((uint64_t) arg << 32);}uint64_t HELPER(iwmmxt_addcb)(uint64_t x){    return        ((x >> 0) & 0xff) + ((x >> 8) & 0xff) +        ((x >> 16) & 0xff) + ((x >> 24) & 0xff) +        ((x >> 32) & 0xff) + ((x >> 40) & 0xff) +        ((x >> 48) & 0xff) + ((x >> 56) & 0xff);}uint64_t HELPER(iwmmxt_addcw)(uint64_t x){    return        ((x >> 0) & 0xffff) + ((x >> 16) & 0xffff) +        ((x >> 32) & 0xffff) + ((x >> 48) & 0xffff);}uint64_t HELPER(iwmmxt_addcl)(uint64_t x){    return (x & 0xffffffff) + (x >> 32);}uint32_t HELPER(iwmmxt_msbb)(uint64_t x){    return        ((x >> 7) & 0x01) | ((x >> 14) & 0x02) |        ((x >> 21) & 0x04) | ((x >> 28) & 0x08) |        ((x >> 35) & 0x10) | ((x >> 42) & 0x20) |        ((x >> 49) & 0x40) | ((x >> 56) & 0x80);}uint32_t HELPER(iwmmxt_msbw)(uint64_t x){    return        ((x >> 15) & 0x01) | ((x >> 30) & 0x02) |        ((x >> 45) & 0x04) | ((x >> 52) & 0x08);}uint32_t HELPER(iwmmxt_msbl)(uint64_t x){    return ((x >> 31) & 0x01) | ((x >> 62) & 0x02);}/* FIXME: Split wCASF setting into a separate op to avoid env use.  */uint64_t HELPER(iwmmxt_srlw)(CPUState *env, uint64_t x, uint32_t n){    x = (((x & (0xffffll << 0)) >> n) & (0xffffll << 0)) |        (((x & (0xffffll << 16)) >> n) & (0xffffll << 16)) |        (((x & (0xffffll << 32)) >> n) & (0xffffll << 32)) |        (((x & (0xffffll << 48)) >> n) & (0xffffll << 48));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) |        NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3);    return x;}uint64_t HELPER(iwmmxt_srll)(CPUState *env, uint64_t x, uint32_t n){    x = ((x & (0xffffffffll << 0)) >> n) |        ((x >> n) & (0xffffffffll << 32));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1);    return x;}uint64_t HELPER(iwmmxt_srlq)(CPUState *env, uint64_t x, uint32_t n){    x >>= n;    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);    return x;}uint64_t HELPER(iwmmxt_sllw)(CPUState *env, uint64_t x, uint32_t n){    x = (((x & (0xffffll << 0)) << n) & (0xffffll << 0)) |        (((x & (0xffffll << 16)) << n) & (0xffffll << 16)) |        (((x & (0xffffll << 32)) << n) & (0xffffll << 32)) |        (((x & (0xffffll << 48)) << n) & (0xffffll << 48));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) |        NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3);    return x;}uint64_t HELPER(iwmmxt_slll)(CPUState *env, uint64_t x, uint32_t n){    x = ((x << n) & (0xffffffffll << 0)) |        ((x & (0xffffffffll << 32)) << n);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1);    return x;}uint64_t HELPER(iwmmxt_sllq)(CPUState *env, uint64_t x, uint32_t n){    x <<= n;    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);    return x;}uint64_t HELPER(iwmmxt_sraw)(CPUState *env, uint64_t x, uint32_t n){    x = ((uint64_t) ((EXTEND16(x >> 0) >> n) & 0xffff) << 0) |        ((uint64_t) ((EXTEND16(x >> 16) >> n) & 0xffff) << 16) |        ((uint64_t) ((EXTEND16(x >> 32) >> n) & 0xffff) << 32) |        ((uint64_t) ((EXTEND16(x >> 48) >> n) & 0xffff) << 48);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) |        NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3);    return x;}uint64_t HELPER(iwmmxt_sral)(CPUState *env, uint64_t x, uint32_t n){    x = (((EXTEND32(x >> 0) >> n) & 0xffffffff) << 0) |        (((EXTEND32(x >> 32) >> n) & 0xffffffff) << 32);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1);    return x;}uint64_t HELPER(iwmmxt_sraq)(CPUState *env, uint64_t x, uint32_t n){    x = (int64_t) x >> n;    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);    return x;}uint64_t HELPER(iwmmxt_rorw)(CPUState *env, uint64_t x, uint32_t n){    x = ((((x & (0xffffll << 0)) >> n) |          ((x & (0xffffll << 0)) << (16 - n))) & (0xffffll << 0)) |        ((((x & (0xffffll << 16)) >> n) |          ((x & (0xffffll << 16)) << (16 - n))) & (0xffffll << 16)) |        ((((x & (0xffffll << 32)) >> n) |          ((x & (0xffffll << 32)) << (16 - n))) & (0xffffll << 32)) |        ((((x & (0xffffll << 48)) >> n) |          ((x & (0xffffll << 48)) << (16 - n))) & (0xffffll << 48));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) |        NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3);    return x;}uint64_t HELPER(iwmmxt_rorl)(CPUState *env, uint64_t x, uint32_t n){    x = ((x & (0xffffffffll << 0)) >> n) |        ((x >> n) & (0xffffffffll << 32)) |        ((x << (32 - n)) & (0xffffffffll << 0)) |        ((x & (0xffffffffll << 32)) << (32 - n));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(x >> 0, 0) | NZBIT32(x >> 32, 1);    return x;}uint64_t HELPER(iwmmxt_rorq)(CPUState *env, uint64_t x, uint32_t n){    x = (x >> n) | (x << (64 - n));    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] = NZBIT64(x);    return x;}uint64_t HELPER(iwmmxt_shufh)(CPUState *env, uint64_t x, uint32_t n){    x = (((x >> ((n << 4) & 0x30)) & 0xffff) << 0) |        (((x >> ((n << 2) & 0x30)) & 0xffff) << 16) |        (((x >> ((n << 0) & 0x30)) & 0xffff) << 32) |        (((x >> ((n >> 2) & 0x30)) & 0xffff) << 48);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(x >> 0, 0) | NZBIT16(x >> 16, 1) |        NZBIT16(x >> 32, 2) | NZBIT16(x >> 48, 3);    return x;}/* TODO: Unsigned-Saturation */uint64_t HELPER(iwmmxt_packuw)(CPUState *env, uint64_t a, uint64_t b){    a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |        (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |        (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) |        (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) |        NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) |        NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) |        NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7);    return a;}uint64_t HELPER(iwmmxt_packul)(CPUState *env, uint64_t a, uint64_t b){    a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |        (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) |        NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3);    return a;}uint64_t HELPER(iwmmxt_packuq)(CPUState *env, uint64_t a, uint64_t b){    a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1);    return a;}/* TODO: Signed-Saturation */uint64_t HELPER(iwmmxt_packsw)(CPUState *env, uint64_t a, uint64_t b){    a = (((a >> 0) & 0xff) << 0) | (((a >> 16) & 0xff) << 8) |        (((a >> 32) & 0xff) << 16) | (((a >> 48) & 0xff) << 24) |        (((b >> 0) & 0xff) << 32) | (((b >> 16) & 0xff) << 40) |        (((b >> 32) & 0xff) << 48) | (((b >> 48) & 0xff) << 56);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT8(a >> 0, 0) | NZBIT8(a >> 8, 1) |        NZBIT8(a >> 16, 2) | NZBIT8(a >> 24, 3) |        NZBIT8(a >> 32, 4) | NZBIT8(a >> 40, 5) |        NZBIT8(a >> 48, 6) | NZBIT8(a >> 56, 7);    return a;}uint64_t HELPER(iwmmxt_packsl)(CPUState *env, uint64_t a, uint64_t b){    a = (((a >> 0) & 0xffff) << 0) | (((a >> 32) & 0xffff) << 16) |        (((b >> 0) & 0xffff) << 32) | (((b >> 32) & 0xffff) << 48);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT16(a >> 0, 0) | NZBIT16(a >> 16, 1) |        NZBIT16(a >> 32, 2) | NZBIT16(a >> 48, 3);    return a;}uint64_t HELPER(iwmmxt_packsq)(CPUState *env, uint64_t a, uint64_t b){    a = (a & 0xffffffff) | ((b & 0xffffffff) << 32);    env->iwmmxt.cregs[ARM_IWMMXT_wCASF] =        NZBIT32(a >> 0, 0) | NZBIT32(a >> 32, 1);    return a;}uint64_t HELPER(iwmmxt_muladdsl)(uint64_t c, uint32_t a, uint32_t b){    return c + ((int32_t) EXTEND32(a) * (int32_t) EXTEND32(b));}uint64_t HELPER(iwmmxt_muladdsw)(uint64_t c, uint32_t a, uint32_t b){    c += EXTEND32(EXTEND16S((a >> 0) & 0xffff) *                  EXTEND16S((b >> 0) & 0xffff));    c += EXTEND32(EXTEND16S((a >> 16) & 0xffff) *                  EXTEND16S((b >> 16) & 0xffff));    return c;}uint64_t HELPER(iwmmxt_muladdswl)(uint64_t c, uint32_t a, uint32_t b){    return c + (EXTEND32(EXTEND16S(a & 0xffff) *                         EXTEND16S(b & 0xffff)));}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?