diff --git a/target-mips/dsp_helper.c b/target-mips/dsp_helper.c index 805247d252..9212789b4e 100644 --- a/target-mips/dsp_helper.c +++ b/target-mips/dsp_helper.c @@ -2921,7 +2921,7 @@ target_ulong helper_##name(CPUMIPSState *env, target_ulong rs, \ return rt; \ } \ \ - filter = ((int32_t)0x01 << size) - 1; \ + filter = ((int64_t)0x01 << size) - 1; \ filter = filter << pos; \ temprs = (rs << pos) & filter; \ temprt = rt & ~filter; \ @@ -2930,7 +2930,7 @@ target_ulong helper_##name(CPUMIPSState *env, target_ulong rs, \ return (target_long)(ret_type)temp; \ } -BIT_INSV(insv, 0x1F, 0x1F, int32_t); +BIT_INSV(insv, 0x1F, 0x3F, int32_t); #ifdef TARGET_MIPS64 BIT_INSV(dinsv, 0x7F, 0x3F, target_long); #endif diff --git a/tests/tcg/mips/mips32-dsp/insv.c b/tests/tcg/mips/mips32-dsp/insv.c index 243b00733d..9d674697cc 100644 --- a/tests/tcg/mips/mips32-dsp/insv.c +++ b/tests/tcg/mips/mips32-dsp/insv.c @@ -19,5 +19,18 @@ int main() ); assert(rt == result); + dsp = 0x1000; + rt = 0xF0F0F0F0; + rs = 0xA5A5A5A5; + result = 0xA5A5A5A5; + + __asm + ("wrdsp %2\n\t" + "insv %0, %1\n\t" + : "+r"(rt) + : "r"(rs), "r"(dsp) + ); + assert(rt == result); + return 0; }