Revision d26968ec
b/target-mips/helper.h | ||
---|---|---|
251 | 251 |
DEF_HELPER(void, do_wait, (void)) |
252 | 252 |
|
253 | 253 |
/* Bitfield operations. */ |
254 |
DEF_HELPER(target_ulong, do_ext, (target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size))
|
|
254 |
DEF_HELPER(target_ulong, do_ext, (target_ulong t1, uint32_t pos, uint32_t size)) |
|
255 | 255 |
DEF_HELPER(target_ulong, do_ins, (target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size)) |
256 |
DEF_HELPER(target_ulong, do_wsbh, (target_ulong t0, target_ulong t1))
|
|
256 |
DEF_HELPER(target_ulong, do_wsbh, (target_ulong t1)) |
|
257 | 257 |
#ifdef TARGET_MIPS64 |
258 |
DEF_HELPER(target_ulong, do_dext, (target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size))
|
|
258 |
DEF_HELPER(target_ulong, do_dext, (target_ulong t1, uint32_t pos, uint32_t size)) |
|
259 | 259 |
DEF_HELPER(target_ulong, do_dins, (target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size)) |
260 |
DEF_HELPER(target_ulong, do_dsbh, (target_ulong t0, target_ulong t1))
|
|
261 |
DEF_HELPER(target_ulong, do_dshd, (target_ulong t0, target_ulong t1))
|
|
260 |
DEF_HELPER(target_ulong, do_dsbh, (target_ulong t1)) |
|
261 |
DEF_HELPER(target_ulong, do_dshd, (target_ulong t1)) |
|
262 | 262 |
#endif |
b/target-mips/op_helper.c | ||
---|---|---|
1867 | 1867 |
} |
1868 | 1868 |
|
1869 | 1869 |
/* Bitfield operations. */ |
1870 |
target_ulong do_ext(target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size)
|
|
1870 |
target_ulong do_ext(target_ulong t1, uint32_t pos, uint32_t size) |
|
1871 | 1871 |
{ |
1872 | 1872 |
return (int32_t)((t1 >> pos) & ((size < 32) ? ((1 << size) - 1) : ~0)); |
1873 | 1873 |
} |
... | ... | |
1879 | 1879 |
return (int32_t)((t0 & ~mask) | ((t1 << pos) & mask)); |
1880 | 1880 |
} |
1881 | 1881 |
|
1882 |
target_ulong do_wsbh(target_ulong t0, target_ulong t1)
|
|
1882 |
target_ulong do_wsbh(target_ulong t1) |
|
1883 | 1883 |
{ |
1884 | 1884 |
return (int32_t)(((t1 << 8) & ~0x00FF00FF) | ((t1 >> 8) & 0x00FF00FF)); |
1885 | 1885 |
} |
1886 | 1886 |
|
1887 | 1887 |
#if defined(TARGET_MIPS64) |
1888 |
target_ulong do_dext(target_ulong t0, target_ulong t1, uint32_t pos, uint32_t size)
|
|
1888 |
target_ulong do_dext(target_ulong t1, uint32_t pos, uint32_t size) |
|
1889 | 1889 |
{ |
1890 | 1890 |
return (t1 >> pos) & ((size < 64) ? ((1ULL << size) - 1) : ~0ULL); |
1891 | 1891 |
} |
... | ... | |
1897 | 1897 |
return (t0 & ~mask) | ((t1 << pos) & mask); |
1898 | 1898 |
} |
1899 | 1899 |
|
1900 |
target_ulong do_dsbh(target_ulong t0, target_ulong t1)
|
|
1900 |
target_ulong do_dsbh(target_ulong t1) |
|
1901 | 1901 |
{ |
1902 | 1902 |
return ((t1 << 8) & ~0x00FF00FF00FF00FFULL) | ((t1 >> 8) & 0x00FF00FF00FF00FFULL); |
1903 | 1903 |
} |
1904 | 1904 |
|
1905 |
target_ulong do_dshd(target_ulong t0, target_ulong t1)
|
|
1905 |
target_ulong do_dshd(target_ulong t1) |
|
1906 | 1906 |
{ |
1907 | 1907 |
t1 = ((t1 << 16) & ~0x0000FFFF0000FFFFULL) | ((t1 >> 16) & 0x0000FFFF0000FFFFULL); |
1908 | 1908 |
return (t1 << 32) | (t1 >> 32); |
b/target-mips/translate.c | ||
---|---|---|
464 | 464 |
tcg_temp_free(tmp); |
465 | 465 |
} |
466 | 466 |
|
467 |
static inline void tcg_gen_helper_0_2ii(void *func, TCGv arg1, TCGv arg2, TCGv arg3, TCGv arg4)
|
|
467 |
static inline void tcg_gen_helper_0_1ii(void *func, TCGv arg1, TCGv arg2, TCGv arg3)
|
|
468 | 468 |
{ |
469 |
TCGv tmp1 = tcg_const_i32(arg3);
|
|
469 |
TCGv tmp1 = tcg_const_i32(arg2);
|
|
470 | 470 |
TCGv tmp2 = tcg_const_i32(arg3); |
471 | 471 |
|
472 |
tcg_gen_helper_0_4(func, arg1, arg2, tmp1, tmp2);
|
|
472 |
tcg_gen_helper_0_3(func, arg1, tmp1, tmp2);
|
|
473 | 473 |
tcg_temp_free(tmp1); |
474 | 474 |
tcg_temp_free(tmp2); |
475 | 475 |
} |
... | ... | |
490 | 490 |
tcg_temp_free(tmp); |
491 | 491 |
} |
492 | 492 |
|
493 |
static inline void tcg_gen_helper_1_1ii(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3) |
|
494 |
{ |
|
495 |
TCGv tmp1 = tcg_const_i32(arg2); |
|
496 |
TCGv tmp2 = tcg_const_i32(arg3); |
|
497 |
|
|
498 |
tcg_gen_helper_1_3(func, ret, arg1, tmp1, tmp2); |
|
499 |
tcg_temp_free(tmp1); |
|
500 |
tcg_temp_free(tmp2); |
|
501 |
} |
|
502 |
|
|
493 | 503 |
static inline void tcg_gen_helper_1_2i(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3) |
494 | 504 |
{ |
495 | 505 |
TCGv tmp = tcg_const_i32(arg3); |
... | ... | |
501 | 511 |
static inline void tcg_gen_helper_1_2ii(void *func, TCGv ret, TCGv arg1, TCGv arg2, TCGv arg3, TCGv arg4) |
502 | 512 |
{ |
503 | 513 |
TCGv tmp1 = tcg_const_i32(arg3); |
504 |
TCGv tmp2 = tcg_const_i32(arg3);
|
|
514 |
TCGv tmp2 = tcg_const_i32(arg4);
|
|
505 | 515 |
|
506 | 516 |
tcg_gen_helper_1_4(func, ret, arg1, arg2, tmp1, tmp2); |
507 | 517 |
tcg_temp_free(tmp1); |
... | ... | |
2748 | 2758 |
case OPC_EXT: |
2749 | 2759 |
if (lsb + msb > 31) |
2750 | 2760 |
goto fail; |
2751 |
tcg_gen_helper_1_2ii(do_ext, t0, t0, t1, lsb, msb + 1);
|
|
2761 |
tcg_gen_helper_1_1ii(do_ext, t0, t1, lsb, msb + 1);
|
|
2752 | 2762 |
break; |
2753 | 2763 |
#if defined(TARGET_MIPS64) |
2754 | 2764 |
case OPC_DEXTM: |
2755 | 2765 |
if (lsb + msb > 63) |
2756 | 2766 |
goto fail; |
2757 |
tcg_gen_helper_1_2ii(do_dext, t0, t0, t1, lsb, msb + 1 + 32);
|
|
2767 |
tcg_gen_helper_1_1ii(do_dext, t0, t1, lsb, msb + 1 + 32);
|
|
2758 | 2768 |
break; |
2759 | 2769 |
case OPC_DEXTU: |
2760 | 2770 |
if (lsb + msb > 63) |
2761 | 2771 |
goto fail; |
2762 |
tcg_gen_helper_1_2ii(do_dext, t0, t0, t1, lsb + 32, msb + 1);
|
|
2772 |
tcg_gen_helper_1_1ii(do_dext, t0, t1, lsb + 32, msb + 1);
|
|
2763 | 2773 |
break; |
2764 | 2774 |
case OPC_DEXT: |
2765 | 2775 |
if (lsb + msb > 63) |
2766 | 2776 |
goto fail; |
2767 |
tcg_gen_helper_1_2ii(do_dext, t0, t0, t1, lsb, msb + 1);
|
|
2777 |
tcg_gen_helper_1_1ii(do_dext, t0, t1, lsb, msb + 1);
|
|
2768 | 2778 |
break; |
2769 | 2779 |
#endif |
2770 | 2780 |
case OPC_INS: |
... | ... | |
7388 | 7398 |
switch (op2) { |
7389 | 7399 |
case OPC_WSBH: |
7390 | 7400 |
gen_load_gpr(t1, rt); |
7391 |
tcg_gen_helper_1_2(do_wsbh, t0, t0, t1);
|
|
7401 |
tcg_gen_helper_1_1(do_wsbh, t0, t1);
|
|
7392 | 7402 |
gen_store_gpr(t0, rd); |
7393 | 7403 |
break; |
7394 | 7404 |
case OPC_SEB: |
... | ... | |
7490 | 7500 |
switch (op2) { |
7491 | 7501 |
case OPC_DSBH: |
7492 | 7502 |
gen_load_gpr(t1, rt); |
7493 |
tcg_gen_helper_1_2(do_dsbh, t0, t0, t1);
|
|
7503 |
tcg_gen_helper_1_1(do_dsbh, t0, t1);
|
|
7494 | 7504 |
break; |
7495 | 7505 |
case OPC_DSHD: |
7496 | 7506 |
gen_load_gpr(t1, rt); |
7497 |
tcg_gen_helper_1_2(do_dshd, t0, t0, t1);
|
|
7507 |
tcg_gen_helper_1_1(do_dshd, t0, t1);
|
|
7498 | 7508 |
break; |
7499 | 7509 |
default: /* Invalid */ |
7500 | 7510 |
MIPS_INVAL("dbshfl"); |
Also available in: Unified diff