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 + -
显示快捷键?