fpu_plus(mips32)

This commit is contained in:
2026-06-25 16:28:36 +08:00
parent 10a984d911
commit faa8458e2c
22 changed files with 268 additions and 111 deletions

View File

@@ -127,9 +127,23 @@ static void free_list(host_memory_block_lists_t **lists)
return;
}
tlib_free((*lists)->elements);
tlib_free((*lists)->guest_to_host_nodes);
tlib_free((*lists)->host_to_guest_nodes);
/*
* tlib_free is backed by Renode's C# SimpleMemoryManager, not by plain libc
* free. Unlike free(NULL), SimpleMemoryManager.Free(IntPtr.Zero) is an error,
* so guard every optional allocation before releasing it.
*/
if((*lists)->elements != NULL)
{
tlib_free((*lists)->elements);
}
if((*lists)->guest_to_host_nodes != NULL)
{
tlib_free((*lists)->guest_to_host_nodes);
}
if((*lists)->host_to_guest_nodes != NULL)
{
tlib_free((*lists)->host_to_guest_nodes);
}
tlib_free(*lists);
*lists = NULL;
@@ -143,6 +157,12 @@ void renode_set_host_blocks(host_memory_block_packed_t *blocks, int count)
old_mappings = lists;
if(count <= 0) {
lists = NULL;
free_list(&old_mappings);
return;
}
new_mappings = tlib_malloc(sizeof(host_memory_block_lists_t));
new_mappings->size = count;
new_mappings->elements = tlib_malloc(sizeof(host_memory_block_t) * count);

View File

@@ -36,8 +36,8 @@ void cpu_reset(CPUState *env)
env->LO = 0;
// CP0寄存器
env->CP0_Status = CP0_STATUS_ERL | CP0_STATUS_CU1;
env->CP0_Cause = 0;
env->CP0_Status = CP0_STATUS_ERL | CP0_STATUS_CU1 | CP0_STATUS_BEV;
env->CP0_Cause = (1 << 23); // Cause.IV = 1中断使用独立向量 0xBFC00400
env->CP0_EPC = 0;
env->CP0_PRId = 0x00006302;
env->CP0_Config0 = 0x80000000;
@@ -273,6 +273,24 @@ void helper_fpu_math(CPUState *env, uint32_t insn) {
case 0x05: res = (uint32_t)fst0 & 0x7FFFFFFF; break; // abs.s
case 0x07: res = (uint32_t)fst0 ^ 0x80000000; break; // neg.s
case 0x08: res = float32_to_int64(wt0, &env->fp_status); break; // round.l.s
case 0x09: { // trunc.l.s - 单精度截断为长整数
res = (uint64_t)float32_to_int64(wt0, &env->fp_status);
break;
}
case 0x0A: { // ceil.l.s - 单精度向上取整为长整数
int old_mode = get_float_rounding_mode(&env->fp_status);
set_float_rounding_mode(float_round_up, &env->fp_status);
res = (uint64_t)float32_to_int64(wt0, &env->fp_status);
set_float_rounding_mode(old_mode, &env->fp_status);
break;
}
case 0x0B: { // floor.l.s - 单精度向下取整为长整数
int old_mode = get_float_rounding_mode(&env->fp_status);
set_float_rounding_mode(float_round_down, &env->fp_status);
res = (uint64_t)float32_to_int64(wt0, &env->fp_status);
set_float_rounding_mode(old_mode, &env->fp_status);
break;
}
case 0x10: { // movf.s - 如果FCC为假则传送
uint32_t cc = (insn >> 18) & 0x7;
int fcc = (env->fcr31 >> (23 + cc)) & 1;
@@ -300,7 +318,7 @@ void helper_fpu_math(CPUState *env, uint32_t insn) {
break;
}
case 0x20: res = int32_to_float32((int32_t)fst0, &env->fp_status); break; // cvt.s.w
case 0x21: res = int32_to_float64((int32_t)fst0, &env->fp_status); break; //cvt.d.w整数转双精度结果在单精度分支是因为源操作数是整数
case 0x21: res = float32_to_float64(wt0, &env->fp_status); break; // cvt.d.s单精度转双精度
case 0x24: res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); break; // cvt.w.s
case 0x25: res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status); break; // cvt.l.s简化为32位
case 0x0C: { // round.w.s
@@ -377,6 +395,24 @@ void helper_fpu_math(CPUState *env, uint32_t insn) {
case 0x05: res = fst0 & 0x7FFFFFFFFFFFFFFFULL; break; // abs.d
case 0x07: res = fst0 ^ 0x8000000000000000ULL; break; // neg.d
case 0x08: res = float64_to_int64(wt0, &env->fp_status); break; // round.l.d
case 0x09: { // trunc.l.d - 双精度截断为长整数
res = (uint64_t)float64_to_int64(wt0, &env->fp_status);
break;
}
case 0x0A: { // ceil.l.d - 双精度向上取整为长整数
int old_mode = get_float_rounding_mode(&env->fp_status);
set_float_rounding_mode(float_round_up, &env->fp_status);
res = (uint64_t)float64_to_int64(wt0, &env->fp_status);
set_float_rounding_mode(old_mode, &env->fp_status);
break;
}
case 0x0B: { // floor.l.d - 双精度向下取整为长整数
int old_mode = get_float_rounding_mode(&env->fp_status);
set_float_rounding_mode(float_round_down, &env->fp_status);
res = (uint64_t)float64_to_int64(wt0, &env->fp_status);
set_float_rounding_mode(old_mode, &env->fp_status);
break;
}
case 0x10: { // movf.d - 如果FCC为假则传送
uint32_t cc = (insn >> 18) & 0x7;
int fcc = (env->fcr31 >> (23 + cc)) & 1;

View File

@@ -360,7 +360,42 @@ static void disas_cop1(DisasContext *ctx, CPUState *env, uint32_t insn) {
tcg_temp_free_i64(t64);
}
break;
case 0x03: // MFHC1 - 读浮点寄存器高 32 位到主 CPU
fprintf(stderr, "[MFHC1] PC=%08x insn=%08x rs=%d rt=%d rd=%d\n", ctx->pc, insn, rs, rt, rd);
if (!is_zero_reg(rt)) {
TCGv t0 = tcg_temp_new();
TCGv_i32 t32 = tcg_temp_new_i32();
tcg_gen_extrh_i64_i32(t32, fpu_gpr[rd]); // 直接取高 32 位
tcg_gen_ext_i32_tl(t0, t32);
tcg_gen_ext32s_tl(t0, t0);
store_gpr(rt, t0);
tcg_temp_free(t0);
tcg_temp_free_i32(t32);
}
break;
case 0x07: // MTHC1 - 写主 CPU 值到浮点寄存器高 32 位
fprintf(stderr, "[MTHC1] PC=%08x insn=%08x rs=%d rt=%d rd=%d\n", ctx->pc, insn, rs, rt, rd);
{
TCGv t0 = load_gpr(rt);
TCGv_i64 t64 = tcg_temp_new_i64();
TCGv_i64 t_mask = tcg_temp_new_i64();
TCGv_i64 t_val = tcg_temp_new_i64();
tcg_gen_extu_tl_i64(t_val, t0); // 零扩展到 64 位
tcg_gen_shli_i64(t_val, t_val, 32); // 左移 32 位到高半部分
tcg_gen_movi_i64(t_mask, 0xFFFFFFFF); // 低 32 位 mask
tcg_gen_and_i64(t64, fpu_gpr[rd], t_mask); // 保留低 32 位
tcg_gen_or_i64(fpu_gpr[rd], t64, t_val); // 合并
tcg_temp_free(t0);
tcg_temp_free_i64(t64);
tcg_temp_free_i64(t_mask);
tcg_temp_free_i64(t_val);
}
break;
case 0x02: // CFC1 (读控制寄存器)
if (rd == 31 && !is_zero_reg(rt)) {
TCGv t0 = tcg_temp_new();
@@ -420,6 +455,7 @@ static void disas_cop1(DisasContext *ctx, CPUState *env, uint32_t insn) {
break;
default:
fprintf(stderr, "[COP1 DEFAULT] PC=%08x insn=%08x rs=%d rt=%d rd=%d\n", ctx->pc, insn, rs, rt, rd);
generate_exception_end(ctx, EXCP_RI);
break;
}
@@ -763,7 +799,7 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
break;
case 0x11: // COP1
// 校验 CP0 Status.CU1 位 (假设你的 hflags 中 MIPS_HFLAG_FPU 代表 CU1 状态)
fprintf(stderr, "[COP1] PC=%08x insn=%08x rs=%d rt=%d rd=%d\n", ctx->pc, insn, rs, rt, rd);
if (!(ctx->hflags & MIPS_HFLAG_FPU)) {
// 门禁未开,操作系统拦截,触发浮点懒加载陷阱
generate_exception_end(ctx, EXCP_CpU);
@@ -795,6 +831,7 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
break;
case 0x35: // LDC1 (Load Doubleword to Coprocessor 1)
{
fprintf(stderr, "[LDC1] PC=%08x insn=%08x rs=%d rt=%d imm=%d\n", ctx->pc, insn, rs, rt, imm);
TCGv t0 = load_gpr(rs);
TCGv addr = tcg_temp_local_new();
TCGv val_lo = tcg_temp_new();
@@ -831,6 +868,7 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
case 0x3D: // SDC1 (Store Doubleword from Coprocessor 1)
{
fprintf(stderr, "[SDC1] PC=%08x insn=%08x rs=%d rt=%d imm=%d\n", ctx->pc, insn, rs, rt, imm);
TCGv t0 = load_gpr(rs);
TCGv addr = tcg_temp_local_new();
TCGv val_lo = tcg_temp_new();
@@ -967,9 +1005,28 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
case 0x01: // REGIMM
{
TCGv t0 = load_gpr(rs);
if (rt == 0x00 || rt == 0x01 || rt == 0x10 || rt == 0x11) {
if (rt == 0x10 || rt == 0x11) {
TCGv t0 = load_gpr(rs);
/* Branch-Likely 变体rt=0x02(BLTZL), 0x03(BGEZL), 0x12(BLTZALL), 0x13(BGEZALL) */
if (rt == 0x02 || rt == 0x03 || rt == 0x12 || rt == 0x13) {
if (rt == 0x12 || rt == 0x13) { // Link
TCGv res = tcg_temp_new();
tcg_gen_movi_tl(res, ctx->pc + 8);
store_gpr(31, res);
tcg_temp_free(res);
}
TCGv res = tcg_temp_new();
if (rt == 0x02 || rt == 0x12) { // LT
tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0);
} else { // GE
tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0);
}
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
ctx->btarget = ctx->pc + 4 + (imm << 2);
ctx->hflags |= MIPS_HFLAG_BC;
tcg_temp_free(res);
}
else if (rt == 0x00 || rt == 0x01 || rt == 0x10 || rt == 0x11) {
if (rt == 0x10 || rt == 0x11) {
TCGv res = tcg_temp_new();
tcg_gen_movi_tl(res, ctx->pc + 8);
store_gpr(31, res);
@@ -977,15 +1034,15 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
}
TCGv res = tcg_temp_new();
if (rt == 0x00 || rt == 0x10) {
tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0);
tcg_gen_setcondi_tl(TCG_COND_LT, res, t0, 0);
} else {
tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0);
tcg_gen_setcondi_tl(TCG_COND_GE, res, t0, 0);
}
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
ctx->btarget = ctx->pc + 4 + (imm << 2);
ctx->hflags |= MIPS_HFLAG_BC;
tcg_temp_free(res);
}
else if (rt >= 0x08 && rt <= 0x0E && rt != 0x0D) {
@@ -1031,19 +1088,60 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
}
break;
case 0x14: // BEQL - Branch Equal Likely
case 0x15: // BNEL - Branch Not Equal Likely
{
/*
* Branch-Likely用 bcond/btarget 机制,和普通分支一样。
* 延迟槽正常执行,分支解析时根据 bcond 决定跳转还是 PC+8。
*/
TCGv t0 = load_gpr(rs);
TCGv t1 = load_gpr(rt);
TCGv res = tcg_temp_new();
tcg_gen_setcond_tl((op == 0x14) ? TCG_COND_EQ : TCG_COND_NE, res, t0, t1);
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
ctx->btarget = ctx->pc + 4 + (imm << 2);
ctx->hflags |= MIPS_HFLAG_BC;
tcg_temp_free(t0);
tcg_temp_free(t1);
tcg_temp_free(res);
}
break;
case 0x06: // BLEZ
case 0x07: // BGTZ
{
TCGv t0 = load_gpr(rs);
TCGv res = tcg_temp_new();
if (op == 0x06) tcg_gen_setcondi_tl(TCG_COND_LE, res, t0, 0);
else tcg_gen_setcondi_tl(TCG_COND_GT, res, t0, 0);
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
ctx->btarget = ctx->pc + 4 + (imm << 2);
ctx->hflags |= MIPS_HFLAG_BC;
tcg_temp_free(t0);
tcg_temp_free(res);
}
break;
case 0x16: // BLEZL - Branch Less Equal Zero Likely
case 0x17: // BGTZL - Branch Greater Than Zero Likely
{
TCGv t0 = load_gpr(rs);
TCGv res = tcg_temp_new();
if (op == 0x16) tcg_gen_setcondi_tl(TCG_COND_LE, res, t0, 0);
else tcg_gen_setcondi_tl(TCG_COND_GT, res, t0, 0);
tcg_gen_st_tl(res, cpu_env, offsetof(CPUState, bcond));
ctx->btarget = ctx->pc + 4 + (imm << 2);
ctx->hflags |= MIPS_HFLAG_BC;
tcg_temp_free(t0);
tcg_temp_free(res);
}
@@ -1254,8 +1352,8 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) {
if (!disas_insn(env, ctx)) {
tcg_gen_movi_tl(cpu_PC, ctx->pc);
tcg_gen_exit_tb(0);
return 0;
tcg_gen_exit_tb(0);
return 0;
}
if (ctx->hflags & MIPS_HFLAG_DSLOT) {
@@ -1271,29 +1369,29 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) {
tcg_gen_andi_i32(t_hflags, t_hflags, ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR));
tcg_gen_st_i32(t_hflags, cpu_env, offsetof(CPUState, hflags));
tcg_temp_free_i32(t_hflags);
tcg_gen_exit_tb(0); // Renode 兼容:退出基本块,让主循环执行刚才写入 PC 的目标
}
}
else if (ctx->hflags & MIPS_HFLAG_BC) {
int l1 = gen_new_label();
int l_end = gen_new_label();
int l_end = gen_new_label();
TCGv bv = tcg_temp_new();
tcg_gen_ld_tl(bv, cpu_env, offsetof(CPUState, bcond));
tcg_gen_brcondi_tl(TCG_COND_EQ, bv, 0, l1);
tcg_gen_ld_tl(bv, cpu_env, offsetof(CPUState, bcond));
tcg_gen_brcondi_tl(TCG_COND_EQ, bv, 0, l1);
TCGv t_dest = tcg_temp_new();
tcg_gen_ld_tl(t_dest, cpu_env, offsetof(CPUState, btarget));
tcg_gen_mov_tl(cpu_PC, t_dest);
tcg_temp_free(t_dest);
tcg_gen_br(l_end);
tcg_gen_br(l_end);
gen_set_label(l1);
tcg_gen_movi_tl(cpu_PC, dcbase->pc + 4);
tcg_gen_movi_tl(cpu_PC, dcbase->pc + 4);
gen_set_label(l_end);
tcg_temp_free(bv);
tcg_temp_free(bv);
TCGv_i32 t_hflags = tcg_temp_new_i32();
tcg_gen_ld_i32(t_hflags, cpu_env, offsetof(CPUState, hflags));
tcg_gen_andi_i32(t_hflags, t_hflags, ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR));
@@ -1302,7 +1400,7 @@ int gen_intermediate_code(CPUState *env, DisasContextBase *dcbase) {
tcg_gen_exit_tb(0); // Renode 兼容:退出基本块,让主循环执行刚才写入 PC 的目标
}
ctx->base.is_jmp = DISAS_TB_JUMP;
ctx->base.is_jmp = DISAS_TB_JUMP;
ctx->hflags &= ~(MIPS_HFLAG_DSLOT | MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR);
} else if (ctx->hflags & (MIPS_HFLAG_B | MIPS_HFLAG_BC | MIPS_HFLAG_BR)) {
ctx->hflags |= MIPS_HFLAG_DSLOT;

View File

@@ -60,6 +60,9 @@ void attach_free(void *free_callback)
void TCG_free(void *ptr)
{
if(ptr == NULL) {
return;
}
_TCG_free(ptr);
}

View File

@@ -15,10 +15,10 @@
"System.ServiceModel.Duplex": "4.8.1",
"System.ServiceModel.Federation": "4.8.1",
"System.ServiceModel.NetTcp": "4.8.1",
"AntShell.Reference": "1.0.9669.26120",
"AntShell.Reference": "1.0.9672.29300",
"BigGustave.Reference": "1.0.0.0",
"crypto.Reference": "1.9.0.0",
"CxxDemangler.Reference": "1.0.9669.26104",
"CxxDemangler.Reference": "1.0.9672.29287",
"ELFSharp.Reference": "0.1.1.0",
"FdtSharp.Reference": "0.1.0.0",
"Infrastructure.Reference": "1.0.0.0",
@@ -1782,10 +1782,10 @@
}
}
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"runtime": {
"AntShell.dll": {
"assemblyVersion": "1.0.9669.26120",
"assemblyVersion": "1.0.9672.29300",
"fileVersion": "0.0.0.0"
}
}
@@ -1806,10 +1806,10 @@
}
}
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"runtime": {
"CxxDemangler.dll": {
"assemblyVersion": "1.0.9669.26104",
"assemblyVersion": "1.0.9672.29287",
"fileVersion": "0.0.0.0"
}
}
@@ -2841,7 +2841,7 @@
"serviceable": false,
"sha512": ""
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"type": "reference",
"serviceable": false,
"sha512": ""
@@ -2856,7 +2856,7 @@
"serviceable": false,
"sha512": ""
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"type": "reference",
"serviceable": false,
"sha512": ""

View File

@@ -8,10 +8,10 @@
".NETCoreApp,Version=v8.0": {
"OptionsParser/1.0.0": {
"dependencies": {
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.Test.Sdk": "16.9.1",
"NUnit": "3.13.1",
"NUnit3TestAdapter": "3.17.0",
"OptionsParser": "1.0.0"
"NUnit3TestAdapter": "3.17.0"
},
"runtime": {
"OptionsParser.dll": {}

View File

@@ -8,10 +8,10 @@
".NETCoreApp,Version=v8.0": {
"OptionsParser/1.0.0": {
"dependencies": {
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.Test.Sdk": "16.9.1",
"NUnit": "3.13.1",
"NUnit3TestAdapter": "3.17.0",
"OptionsParser": "1.0.0"
"NUnit3TestAdapter": "3.17.0"
},
"runtime": {
"OptionsParser.dll": {}

View File

@@ -14,10 +14,10 @@
"System.ServiceModel.Duplex": "4.8.1",
"System.ServiceModel.Federation": "4.8.1",
"System.ServiceModel.NetTcp": "4.8.1",
"AntShell.Reference": "1.0.9669.26120",
"AntShell.Reference": "1.0.9672.29300",
"BigGustave.Reference": "1.0.0.0",
"crypto.Reference": "1.9.0.0",
"CxxDemangler.Reference": "1.0.9669.26104",
"CxxDemangler.Reference": "1.0.9672.29287",
"ELFSharp.Reference": "0.1.1.0",
"FdtSharp.Reference": "0.1.0.0",
"Infrastructure.Reference": "1.0.0.0",
@@ -1781,10 +1781,10 @@
}
}
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"runtime": {
"AntShell.dll": {
"assemblyVersion": "1.0.9669.26120",
"assemblyVersion": "1.0.9672.29300",
"fileVersion": "0.0.0.0"
}
}
@@ -1805,10 +1805,10 @@
}
}
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"runtime": {
"CxxDemangler.dll": {
"assemblyVersion": "1.0.9669.26104",
"assemblyVersion": "1.0.9672.29287",
"fileVersion": "0.0.0.0"
}
}
@@ -2840,7 +2840,7 @@
"serviceable": false,
"sha512": ""
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"type": "reference",
"serviceable": false,
"sha512": ""
@@ -2855,7 +2855,7 @@
"serviceable": false,
"sha512": ""
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"type": "reference",
"serviceable": false,
"sha512": ""

View File

@@ -8,10 +8,10 @@
".NETCoreApp,Version=v8.0": {
"OptionsParser/1.0.0": {
"dependencies": {
"Microsoft.CSharp": "4.7.0",
"Microsoft.NET.Test.Sdk": "16.9.1",
"NUnit": "3.13.1",
"NUnit3TestAdapter": "3.17.0",
"OptionsParser": "1.0.0"
"NUnit3TestAdapter": "3.17.0"
},
"runtime": {
"OptionsParser.dll": {}

View File

@@ -11,10 +11,10 @@
"AntShell": "1.0.0",
"Infrastructure": "1.0.0",
"StyleCop.Analyzers": "1.1.118",
"AntShell.Reference": "1.0.9669.26120",
"AntShell.Reference": "1.0.9672.29300",
"BigGustave.Reference": "1.0.0.0",
"crypto.Reference": "1.9.0.0",
"CxxDemangler.Reference": "1.0.9669.26104",
"CxxDemangler.Reference": "1.0.9672.29287",
"ELFSharp.Reference": "0.1.1.0",
"FdtSharp.Reference": "0.1.0.0",
"Infrastructure.Reference": "1.0.0.0",
@@ -1574,10 +1574,10 @@
}
}
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"runtime": {
"AntShell.dll": {
"assemblyVersion": "1.0.9669.26120",
"assemblyVersion": "1.0.9672.29300",
"fileVersion": "0.0.0.0"
}
}
@@ -1598,10 +1598,10 @@
}
}
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"runtime": {
"CxxDemangler.dll": {
"assemblyVersion": "1.0.9669.26104",
"assemblyVersion": "1.0.9672.29287",
"fileVersion": "0.0.0.0"
}
}
@@ -2507,7 +2507,7 @@
"serviceable": false,
"sha512": ""
},
"AntShell.Reference/1.0.9669.26120": {
"AntShell.Reference/1.0.9672.29300": {
"type": "reference",
"serviceable": false,
"sha512": ""
@@ -2522,7 +2522,7 @@
"serviceable": false,
"sha512": ""
},
"CxxDemangler.Reference/1.0.9669.26104": {
"CxxDemangler.Reference/1.0.9672.29287": {
"type": "reference",
"serviceable": false,
"sha512": ""