fpu
This commit is contained in:
Submodule lib/resources updated: 43e805d8e8...98eb8a3406
@@ -8,10 +8,10 @@
|
|||||||
".NETCoreApp,Version=v8.0": {
|
".NETCoreApp,Version=v8.0": {
|
||||||
"OptionsParser/1.0.0": {
|
"OptionsParser/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.NET.Test.Sdk": "16.9.1",
|
"Microsoft.NET.Test.Sdk": "16.9.1",
|
||||||
"NUnit": "3.13.1",
|
"NUnit": "3.13.1",
|
||||||
"NUnit3TestAdapter": "3.17.0"
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
|
"OptionsParser": "1.0.0"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"OptionsParser.dll": {}
|
"OptionsParser.dll": {}
|
||||||
|
|||||||
@@ -26,12 +26,12 @@
|
|||||||
"Xwt": "1.0.0",
|
"Xwt": "1.0.0",
|
||||||
"Xwt.Gtk3": "1.0.0",
|
"Xwt.Gtk3": "1.0.0",
|
||||||
"libtftp": "1.0.0",
|
"libtftp": "1.0.0",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"CookComputing.XmlRpcV2": "2.5.0.0",
|
"CookComputing.XmlRpcV2": "2.5.0.0",
|
||||||
"CoSimulationPlugin.Reference": "1.0.0.0",
|
"CoSimulationPlugin.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -1954,10 +1954,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1994,10 +1994,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3134,7 +3134,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3159,7 +3159,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ typedef struct CPUState {
|
|||||||
|
|
||||||
// FPU状态(CP1 - 浮点协处理器)
|
// FPU状态(CP1 - 浮点协处理器)
|
||||||
float_status fp_status;
|
float_status fp_status;
|
||||||
float64 fpr[32];
|
uint64_t fpu_gpr[32];
|
||||||
uint32_t fcr0;
|
uint32_t fcr0;
|
||||||
uint32_t fcr31;
|
uint32_t fcr31;
|
||||||
|
|
||||||
@@ -146,6 +146,7 @@ typedef struct CPUState {
|
|||||||
#define MIPS_HFLAG_BL 0x00020
|
#define MIPS_HFLAG_BL 0x00020
|
||||||
#define MIPS_HFLAG_BR 0x00040
|
#define MIPS_HFLAG_BR 0x00040
|
||||||
#define MIPS_HFLAG_DSLOT 0x00080 // 正式定义的延迟槽标志
|
#define MIPS_HFLAG_DSLOT 0x00080 // 正式定义的延迟槽标志
|
||||||
|
#define MIPS_HFLAG_FPU 0x00100 // 【修复】新增 FPU 可用门禁标志
|
||||||
|
|
||||||
/* =========================================
|
/* =========================================
|
||||||
6. 翻译上下文
|
6. 翻译上下文
|
||||||
|
|||||||
@@ -4,6 +4,7 @@
|
|||||||
* Date:2026_0209
|
* Date:2026_0209
|
||||||
*/
|
*/
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
|
#include "softfloat-2.h" // grep 找到的路径
|
||||||
|
|
||||||
// MIPS Helper函数实现
|
// MIPS Helper函数实现
|
||||||
|
|
||||||
@@ -12,36 +13,48 @@ void cpu_reset(CPUState *env)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
// 清零所有通用寄存器
|
// 先清零整个结构体(确保所有字段初始化,避免释放未初始化的指针)
|
||||||
|
memset(env, 0, sizeof(CPUState));
|
||||||
|
|
||||||
|
// --- FPU 状态初始化 ---
|
||||||
|
for (i = 0; i < 32; i++) {
|
||||||
|
env->fpu_gpr[i] = 0;
|
||||||
|
}
|
||||||
|
env->fcr31 = 0;
|
||||||
|
env->fcr0 = 0x00003300; // 1E300 的 FPU ID
|
||||||
|
|
||||||
|
// 通用寄存器
|
||||||
for (i = 0; i < 32; i++) {
|
for (i = 0; i < 32; i++) {
|
||||||
env->gpr[i] = 0;
|
env->gpr[i] = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
// 初始化PC到复位向量
|
// PC
|
||||||
env->pc = 0xBFC00000; // MIPS复位向量地址
|
env->pc = 0x80000000; // 直接指向程序入口,跳过 bootrom
|
||||||
|
|
||||||
// 初始化HI/LO
|
// HI/LO
|
||||||
env->HI = 0;
|
env->HI = 0;
|
||||||
env->LO = 0;
|
env->LO = 0;
|
||||||
|
|
||||||
// 初始化CP0寄存器
|
// CP0寄存器
|
||||||
env->CP0_Status = CP0_STATUS_BEV | CP0_STATUS_ERL; // Bootstrap向量启用,Error Level
|
env->CP0_Status = CP0_STATUS_ERL | CP0_STATUS_CU1;
|
||||||
env->CP0_Cause = 0;
|
env->CP0_Cause = 0;
|
||||||
env->CP0_EPC = 0;
|
env->CP0_EPC = 0;
|
||||||
env->CP0_PRId = 0x00006302; // 示例处理器ID(需要根据龙芯1E300实际值修改)
|
env->CP0_PRId = 0x00006302;
|
||||||
env->CP0_Config0 = 0x80000000; // 基本配置
|
env->CP0_Config0 = 0x80000000;
|
||||||
env->CP0_Config1 = 0;
|
env->CP0_Config1 = 0;
|
||||||
env->CP0_Random = 0x0000001f;
|
env->CP0_Random = 0x0000001f;
|
||||||
env->CP0_Wired = 0;
|
env->CP0_Wired = 0;
|
||||||
env->CP0_Count = 0;
|
env->CP0_Count = 0;
|
||||||
env->CP0_Compare = 0;
|
env->CP0_Compare = 0;
|
||||||
|
|
||||||
// 初始化内部状态
|
// 内部状态
|
||||||
env->hflags = MIPS_HFLAG_KM; // Kernel mode
|
env->hflags = MIPS_HFLAG_KM; // Kernel mode
|
||||||
env->error_code = 0;
|
env->error_code = 0;
|
||||||
|
|
||||||
// 清除中断
|
|
||||||
env->interrupt_request = 0;
|
env->interrupt_request = 0;
|
||||||
|
|
||||||
|
// 初始化浮点状态
|
||||||
|
set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
|
||||||
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 计算MMU索引
|
// 计算MMU索引
|
||||||
@@ -158,3 +171,305 @@ void cpu_exec_epilogue(CPUState *env)
|
|||||||
{
|
{
|
||||||
// 最小实现
|
// 最小实现
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* ========================================================================
|
||||||
|
* MIPS FPU (COP1) Helper Functions
|
||||||
|
* ======================================================================== */
|
||||||
|
|
||||||
|
// helper.c (保留原有的 cpu_reset, cpu_init 等函数,仅替换浮点部分)
|
||||||
|
|
||||||
|
// 1. 处理控制寄存器写入 (CTC1)
|
||||||
|
void helper_ctc1(CPUState *env, uint32_t val) {
|
||||||
|
uint32_t mask = 0x0183FFFF;
|
||||||
|
env->fcr31 = (env->fcr31 & ~mask) | (val & mask);
|
||||||
|
int rm = (env->fcr31 & 3);
|
||||||
|
switch (rm) {
|
||||||
|
case 0: set_float_rounding_mode(float_round_nearest_even, &env->fp_status); break;
|
||||||
|
case 1: set_float_rounding_mode(float_round_to_zero, &env->fp_status); break;
|
||||||
|
case 2: set_float_rounding_mode(float_round_up, &env->fp_status); break;
|
||||||
|
case 3: set_float_rounding_mode(float_round_down, &env->fp_status); break;
|
||||||
|
}
|
||||||
|
if ((env->fcr31 >> 12) & ((env->fcr31 >> 7) & 0x1f)) {
|
||||||
|
env->exception_index = 15;
|
||||||
|
do_interrupt(env);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 异常同步
|
||||||
|
static inline void update_fcr31_exceptions(CPUState *env) {
|
||||||
|
int flags = get_float_exception_flags(&env->fp_status);
|
||||||
|
if (flags) {
|
||||||
|
env->fcr31 |= (flags << 2);
|
||||||
|
env->fcr31 |= (flags << 12);
|
||||||
|
if ((env->fcr31 >> 12) & ((env->fcr31 >> 7) & 0x1f)) {
|
||||||
|
env->exception_index = 15;
|
||||||
|
do_interrupt(env);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
set_float_exception_flags(0, &env->fp_status);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3. 核心整合:接收一整条 32 位指令,在 C 层面解码并执行
|
||||||
|
void helper_fpu_math(CPUState *env, uint32_t insn) {
|
||||||
|
uint32_t rs = (insn >> 21) & 0x1F;
|
||||||
|
uint32_t funct = insn & 0x3F;
|
||||||
|
uint32_t fs = (insn >> 11) & 0x1F;
|
||||||
|
uint32_t ft = (insn >> 16) & 0x1F;
|
||||||
|
uint32_t fd = (insn >> 6) & 0x1F;
|
||||||
|
|
||||||
|
uint64_t fst0 = env->fpu_gpr[fs];
|
||||||
|
uint64_t fst1 = env->fpu_gpr[ft];
|
||||||
|
uint64_t res = 0;
|
||||||
|
|
||||||
|
// 处理乘加融合指令 (MADD/MSUB/NMADD/NMSUB)
|
||||||
|
// 这些指令在 SPECIAL2 中,funct=0x08-0x0F
|
||||||
|
if (funct >= 0x08 && funct <= 0x0F) {
|
||||||
|
uint64_t fd_val = env->fpu_gpr[fd];
|
||||||
|
int is_double = funct & 0x01;
|
||||||
|
int is_neg = (funct & 0x04) != 0;
|
||||||
|
int is_sub = (funct & 0x02) != 0;
|
||||||
|
|
||||||
|
if (!is_double) { // Single precision
|
||||||
|
float32 wfs = (float32)(uint32_t)fst0;
|
||||||
|
float32 wft = (float32)(uint32_t)fst1;
|
||||||
|
float32 wfd = (float32)(uint32_t)fd_val;
|
||||||
|
float32 mul = float32_mul(wfs, wft, &env->fp_status);
|
||||||
|
if (is_sub) {
|
||||||
|
res = float32_sub(wfd, mul, &env->fp_status);
|
||||||
|
} else {
|
||||||
|
res = float32_add(wfd, mul, &env->fp_status);
|
||||||
|
}
|
||||||
|
if (is_neg) {
|
||||||
|
res = (uint32_t)res ^ 0x80000000;
|
||||||
|
}
|
||||||
|
} else { // Double precision
|
||||||
|
float64 wfs = (float64)fst0;
|
||||||
|
float64 wft = (float64)fst1;
|
||||||
|
float64 wfd = (float64)fd_val;
|
||||||
|
float64 mul = float64_mul(wfs, wft, &env->fp_status);
|
||||||
|
if (is_sub) {
|
||||||
|
res = float64_sub(wfd, mul, &env->fp_status);
|
||||||
|
} else {
|
||||||
|
res = float64_add(wfd, mul, &env->fp_status);
|
||||||
|
}
|
||||||
|
if (is_neg) {
|
||||||
|
res = res ^ 0x8000000000000000ULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
update_fcr31_exceptions(env);
|
||||||
|
env->fpu_gpr[fd] = res;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (rs == 0x10) { // Single (单精度)
|
||||||
|
float32 wt0 = (float32)(uint32_t)fst0;
|
||||||
|
float32 wt1 = (float32)(uint32_t)fst1;
|
||||||
|
switch(funct) {
|
||||||
|
case 0x00: res = float32_add(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x01: res = float32_sub(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x02: res = float32_mul(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x03: res = float32_div(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x04: res = float32_sqrt(wt0, &env->fp_status); break; // sqrt.s
|
||||||
|
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 0x10: { // movf.s - 如果FCC为假则传送
|
||||||
|
uint32_t cc = (insn >> 18) & 0x7;
|
||||||
|
int fcc = (env->fcr31 >> (23 + cc)) & 1;
|
||||||
|
if (!fcc) res = (uint32_t)fst0;
|
||||||
|
else res = (uint32_t)fst1; // 保持目标原值
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x11: { // movt.s - 如果FCC为真则传送
|
||||||
|
uint32_t cc = (insn >> 18) & 0x7;
|
||||||
|
int fcc = (env->fcr31 >> (23 + cc)) & 1;
|
||||||
|
if (fcc) res = (uint32_t)fst0;
|
||||||
|
else res = (uint32_t)fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x12: { // movn.s - 如果通用寄存器非零则传送
|
||||||
|
uint32_t rt_idx = (insn >> 16) & 0x1F;
|
||||||
|
if (env->gpr[rt_idx] != 0) res = (uint32_t)fst0;
|
||||||
|
else res = (uint32_t)fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x13: { // movz.s - 如果通用寄存器为零则传送
|
||||||
|
uint32_t rt_idx = (insn >> 16) & 0x1F;
|
||||||
|
if (env->gpr[rt_idx] == 0) res = (uint32_t)fst0;
|
||||||
|
else res = (uint32_t)fst1;
|
||||||
|
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 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
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0D: { // trunc.w.s
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_to_zero, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0E: { // ceil.w.s
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_up, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0F: { // floor.w.s
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_down, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float32_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
if (funct >= 0x30) { // c.cond.s
|
||||||
|
int cond = funct & 0x0F;
|
||||||
|
int cmp_result = float32_compare(wt0, wt1, &env->fp_status);
|
||||||
|
// cmp_result: -1(小于), 0(等于), 1(大于), 2(无序NaN)
|
||||||
|
int cc = 0;
|
||||||
|
switch (cond) {
|
||||||
|
case 0x0: cc = 0; break; // F (总是假)
|
||||||
|
case 0x1: cc = (cmp_result == 2); break; // UN (无序)
|
||||||
|
case 0x2: cc = (cmp_result == 0); break; // EQ (相等)
|
||||||
|
case 0x3: cc = (cmp_result == 0 || cmp_result == 2); break; // UEQ
|
||||||
|
case 0x4: cc = (cmp_result == -1); break; // OLT (有序小于)
|
||||||
|
case 0x5: cc = (cmp_result == -1 || cmp_result == 2); break; // ULT
|
||||||
|
case 0x6: cc = (cmp_result == -1 || cmp_result == 0); break; // OLE
|
||||||
|
case 0x7: cc = (cmp_result != 1); break; // ULE
|
||||||
|
case 0x8: cc = 0; break; // SF (信号假,简化处理)
|
||||||
|
case 0x9: cc = (cmp_result == 2); break; // NGLE
|
||||||
|
case 0xA: cc = (cmp_result == 0); break; // SEQ
|
||||||
|
case 0xB: cc = (cmp_result == 0 || cmp_result == 2); break; // NGL
|
||||||
|
case 0xC: cc = (cmp_result == -1); break; // LT
|
||||||
|
case 0xD: cc = (cmp_result == -1 || cmp_result == 2); break; // NGE
|
||||||
|
case 0xE: cc = (cmp_result == -1 || cmp_result == 0); break; // LE
|
||||||
|
case 0xF: cc = (cmp_result != 1); break; // NGT
|
||||||
|
}
|
||||||
|
// 写入 fcr31 的 FCC0 (bit 23)
|
||||||
|
if (cc) {
|
||||||
|
env->fcr31 |= (1 << 23);
|
||||||
|
} else {
|
||||||
|
env->fcr31 &= ~(1 << 23);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else if (rs == 0x11) { // Double (双精度)
|
||||||
|
float64 wt0 = (float64)fst0;
|
||||||
|
float64 wt1 = (float64)fst1;
|
||||||
|
switch(funct) {
|
||||||
|
case 0x00: res = float64_add(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x01: res = float64_sub(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x02: res = float64_mul(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x03: res = float64_div(wt0, wt1, &env->fp_status); break;
|
||||||
|
case 0x04: res = float64_sqrt(wt0, &env->fp_status); break; // sqrt.d
|
||||||
|
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 0x10: { // movf.d - 如果FCC为假则传送
|
||||||
|
uint32_t cc = (insn >> 18) & 0x7;
|
||||||
|
int fcc = (env->fcr31 >> (23 + cc)) & 1;
|
||||||
|
if (!fcc) res = fst0;
|
||||||
|
else res = fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x11: { // movt.d - 如果FCC为真则传送
|
||||||
|
uint32_t cc = (insn >> 18) & 0x7;
|
||||||
|
int fcc = (env->fcr31 >> (23 + cc)) & 1;
|
||||||
|
if (fcc) res = fst0;
|
||||||
|
else res = fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x12: { // movn.d - 如果通用寄存器非零则传送
|
||||||
|
uint32_t rt_idx = (insn >> 16) & 0x1F;
|
||||||
|
if (env->gpr[rt_idx] != 0) res = fst0;
|
||||||
|
else res = fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x13: { // movz.d - 如果通用寄存器为零则传送
|
||||||
|
uint32_t rt_idx = (insn >> 16) & 0x1F;
|
||||||
|
if (env->gpr[rt_idx] == 0) res = fst0;
|
||||||
|
else res = fst1;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x20: res = float64_to_float32(wt0, &env->fp_status); break; // cvt.s.d
|
||||||
|
case 0x21: res = wt0; break; // cvt.d.d(双精度转双精度,直接赋值)
|
||||||
|
case 0x24: res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); break; // cvt.w.d
|
||||||
|
case 0x25: res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status); break; // cvt.l.d(简化为32位)
|
||||||
|
case 0x0C: { // round.w.d
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_nearest_even, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0D: { // trunc.w.d
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_to_zero, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0E: { // ceil.w.d
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_up, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case 0x0F: { // floor.w.d
|
||||||
|
int old_mode = get_float_rounding_mode(&env->fp_status);
|
||||||
|
set_float_rounding_mode(float_round_down, &env->fp_status);
|
||||||
|
res = (uint64_t)(uint32_t)float64_to_int32(wt0, &env->fp_status);
|
||||||
|
set_float_rounding_mode(old_mode, &env->fp_status);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
if (funct >= 0x30) { // c.cond.d
|
||||||
|
int cond = funct & 0x0F;
|
||||||
|
int cmp_result = float64_compare(wt0, wt1, &env->fp_status);
|
||||||
|
int cc = 0;
|
||||||
|
switch (cond) {
|
||||||
|
case 0x0: cc = 0; break;
|
||||||
|
case 0x1: cc = (cmp_result == 2); break;
|
||||||
|
case 0x2: cc = (cmp_result == 0); break;
|
||||||
|
case 0x3: cc = (cmp_result == 0 || cmp_result == 2); break;
|
||||||
|
case 0x4: cc = (cmp_result == -1); break;
|
||||||
|
case 0x5: cc = (cmp_result == -1 || cmp_result == 2); break;
|
||||||
|
case 0x6: cc = (cmp_result == -1 || cmp_result == 0); break;
|
||||||
|
case 0x7: cc = (cmp_result != 1); break;
|
||||||
|
case 0x8: cc = 0; break;
|
||||||
|
case 0x9: cc = (cmp_result == 2); break;
|
||||||
|
case 0xA: cc = (cmp_result == 0); break;
|
||||||
|
case 0xB: cc = (cmp_result == 0 || cmp_result == 2); break;
|
||||||
|
case 0xC: cc = (cmp_result == -1); break;
|
||||||
|
case 0xD: cc = (cmp_result == -1 || cmp_result == 2); break;
|
||||||
|
case 0xE: cc = (cmp_result == -1 || cmp_result == 0); break;
|
||||||
|
case 0xF: cc = (cmp_result != 1); break;
|
||||||
|
}
|
||||||
|
if (cc) {
|
||||||
|
env->fcr31 |= (1 << 23);
|
||||||
|
} else {
|
||||||
|
env->fcr31 &= ~(1 << 23);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// 更新异常状态并将结果写回目标寄存器
|
||||||
|
update_fcr31_exceptions(env);
|
||||||
|
env->fpu_gpr[fd] = res;
|
||||||
|
}
|
||||||
@@ -1,12 +1,27 @@
|
|||||||
/*
|
/*
|
||||||
* MIPS
|
* helper.h - MIPS helper function declarations
|
||||||
* Author:liuwb
|
*
|
||||||
* Date:2026_0209
|
* 简化方案:不使用 def-helper.h 的宏系统(GEN_HELPER 模式切换),
|
||||||
|
* 直接声明 helper 函数原型。translate.c 中手写 wrapper 函数。
|
||||||
|
*
|
||||||
|
* 用 DEF_HELPER_FLAGS_2 守卫确保只在 tlib 版 def-helper.h 的
|
||||||
|
* 宏环境中展开(exports.c 的注册模式),其他时候跳过。
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include "def-helper.h"
|
#ifdef DEF_HELPER_FLAGS_2
|
||||||
|
|
||||||
/* Exceptions */
|
/* exports.c (GEN_HELPER=2) 注册模式:生成 tcg_register_helper 调用 */
|
||||||
|
DEF_HELPER_2(ctc1, void, env, i32)
|
||||||
|
DEF_HELPER_2(fpu_math, void, env, i32)
|
||||||
DEF_HELPER_2(raise_exception, void, env, i32)
|
DEF_HELPER_2(raise_exception, void, env, i32)
|
||||||
|
DEF_HELPER_1(eret, void, env)
|
||||||
|
|
||||||
#include "def-helper.h"
|
#else
|
||||||
|
|
||||||
|
/* 普通模式(translate.c / helper.c):生成 C 函数原型 */
|
||||||
|
void helper_ctc1(CPUState *env, uint32_t val);
|
||||||
|
void helper_fpu_math(CPUState *env, uint32_t insn);
|
||||||
|
void helper_raise_exception(CPUState *env, uint32_t exception);
|
||||||
|
void helper_eret(CPUState *env);
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
* Date:2026_0209
|
* Date:2026_0209
|
||||||
*/
|
*/
|
||||||
#include "cpu.h"
|
#include "cpu.h"
|
||||||
#include "helper.h"
|
#include "exec-all.h"
|
||||||
|
|
||||||
// MIPS操作辅助函数实现
|
// MIPS操作辅助函数实现
|
||||||
|
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
#include "arch_callbacks.h"
|
#include "arch_callbacks.h"
|
||||||
#include "tb-helper.h"
|
#include "tb-helper.h"
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
#include "helper.h"
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdbool.h>
|
#include <stdbool.h>
|
||||||
@@ -23,6 +24,24 @@
|
|||||||
#define DISAS_STOP 4
|
#define DISAS_STOP 4
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
/* ========================================================================
|
||||||
|
* Helper 函数 inline 包装(TCG → C 调用桥接)
|
||||||
|
*
|
||||||
|
* 不使用 def-helper.h 的 GEN_HELPER 宏系统(会因 include 顺序和
|
||||||
|
* 双重 def-helper.h 冲突导致编译失败),直接手写简单包装。
|
||||||
|
* ======================================================================== */
|
||||||
|
static inline void gen_helper_ctc1(TCGv_ptr env, TCGv_i32 val)
|
||||||
|
{
|
||||||
|
tcg_gen_helperN(helper_ctc1, 0, 0, TCG_CALL_DUMMY_ARG, 2,
|
||||||
|
(TCGArg[]){GET_TCGV_PTR(env), GET_TCGV_I32(val)});
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void gen_helper_fpu_math(TCGv_ptr env, TCGv_i32 insn)
|
||||||
|
{
|
||||||
|
tcg_gen_helperN(helper_fpu_math, 0, 0, TCG_CALL_DUMMY_ARG, 2,
|
||||||
|
(TCGArg[]){GET_TCGV_PTR(env), GET_TCGV_I32(insn)});
|
||||||
|
}
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// MIPS 架构标准异常代号 (ExcCode)
|
// MIPS 架构标准异常代号 (ExcCode)
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
@@ -58,6 +77,8 @@ static TCGv cpu_gpr[32];
|
|||||||
static TCGv cpu_PC;
|
static TCGv cpu_PC;
|
||||||
static TCGv cpu_HI;
|
static TCGv cpu_HI;
|
||||||
static TCGv cpu_LO;
|
static TCGv cpu_LO;
|
||||||
|
static TCGv_i64 fpu_gpr[32]; // 64位浮点数据寄存器
|
||||||
|
static TCGv_i32 fcr31; // 32位控制状态寄存器
|
||||||
|
|
||||||
static const char * const mips_gpr_names[32] = {
|
static const char * const mips_gpr_names[32] = {
|
||||||
"zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
|
"zero", "at", "v0", "v1", "a0", "a1", "a2", "a3",
|
||||||
@@ -66,6 +87,13 @@ static const char * const mips_gpr_names[32] = {
|
|||||||
"t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
|
"t8", "t9", "k0", "k1", "gp", "sp", "s8", "ra"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static const char * const mips_fpr_names[32] = {
|
||||||
|
"f0", "f1", "f2", "f3", "f4", "f5", "f6", "f7",
|
||||||
|
"f8", "f9", "f10", "f11", "f12", "f13", "f14", "f15",
|
||||||
|
"f16", "f17", "f18", "f19", "f20", "f21", "f22", "f23",
|
||||||
|
"f24", "f25", "f26", "f27", "f28", "f29", "f30", "f31"
|
||||||
|
};
|
||||||
|
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
// 异常抛出引擎 (Exception Generator)
|
// 异常抛出引擎 (Exception Generator)
|
||||||
// ========================================================================
|
// ========================================================================
|
||||||
@@ -304,6 +332,99 @@ static void gen_muldiv(DisasContext *ctx, int rs, int rt, int op) {
|
|||||||
/* ========================================================================
|
/* ========================================================================
|
||||||
* 核心翻译器 (Instruction Decoding)
|
* 核心翻译器 (Instruction Decoding)
|
||||||
* ======================================================================== */
|
* ======================================================================== */
|
||||||
|
static void disas_cop1(DisasContext *ctx, CPUState *env, uint32_t insn) {
|
||||||
|
uint32_t rs = RS(insn);
|
||||||
|
uint32_t rt = RT(insn);
|
||||||
|
uint32_t rd = RD(insn);
|
||||||
|
|
||||||
|
switch (rs) {
|
||||||
|
case 0x00: // MFC1 (从浮点寄存器搬到主 CPU 通用寄存器)
|
||||||
|
if (!is_zero_reg(rt)) {
|
||||||
|
TCGv t0 = tcg_temp_new();
|
||||||
|
// 取出浮点寄存器的低 32 位
|
||||||
|
tcg_gen_extrl_i64_i32(t0, fpu_gpr[rd]);
|
||||||
|
tcg_gen_ext32s_tl(t0, t0); // 必须保持主 CPU 符号扩展一致性
|
||||||
|
store_gpr(rt, t0);
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x04: // MTC1 (从主 CPU 搬到浮点寄存器低 32 位)
|
||||||
|
{
|
||||||
|
TCGv t0 = load_gpr(rt);
|
||||||
|
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||||
|
tcg_gen_ext_tl_i64(t64, t0); // 零扩展或符号扩展
|
||||||
|
// 写入前要处理拼接模式 (FR=0) 或 64位模式 (FR=1) 的逻辑
|
||||||
|
tcg_gen_mov_i64(fpu_gpr[rd], t64);
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free_i64(t64);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x02: // CFC1 (读控制寄存器)
|
||||||
|
if (rd == 31 && !is_zero_reg(rt)) {
|
||||||
|
TCGv t0 = tcg_temp_new();
|
||||||
|
tcg_gen_ext_i32_tl(t0, fcr31); // fcr31 是 TCGv_i32,需扩展到目标寄存器宽度
|
||||||
|
tcg_gen_ext32s_tl(t0, t0);
|
||||||
|
store_gpr(rt, t0);
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x06: // CTC1 (写控制寄存器)
|
||||||
|
if (rd == 31) {
|
||||||
|
TCGv t0 = load_gpr(rt);
|
||||||
|
TCGv_i32 t32 = tcg_temp_new_i32();
|
||||||
|
tcg_gen_trunc_tl_i32(t32, t0);
|
||||||
|
|
||||||
|
gen_helper_ctc1(cpu_env, t32);
|
||||||
|
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free_i32(t32);
|
||||||
|
ctx->base.is_jmp = DISAS_TB_JUMP;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x08: // BC1 (浮点条件分支指令)
|
||||||
|
{
|
||||||
|
uint32_t tf = (insn >> 16) & 1; // 0=False (BC1F), 1=True (BC1T)
|
||||||
|
int32_t imm = IMM(insn); // 分支偏移量
|
||||||
|
|
||||||
|
TCGv t_cond = tcg_temp_new();
|
||||||
|
|
||||||
|
// MIPS 的浮点比较结果默认存在 fcr31 的第 23 位 (FCC0)
|
||||||
|
tcg_gen_ext_i32_tl(t_cond, fcr31);
|
||||||
|
tcg_gen_shri_tl(t_cond, t_cond, 23);
|
||||||
|
tcg_gen_andi_tl(t_cond, t_cond, 1); // 提取 FCC0 的值 (0 或 1)
|
||||||
|
|
||||||
|
if (tf == 0) {
|
||||||
|
// 如果是 BC1F 指令,条件为 0 时才跳转,所以把条件反转一下
|
||||||
|
tcg_gen_xori_tl(t_cond, t_cond, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 复用主 CPU 的分支逻辑:存入 bcond 寄存器,计算目标地址
|
||||||
|
tcg_gen_st_tl(t_cond, cpu_env, offsetof(CPUState, bcond));
|
||||||
|
ctx->btarget = ctx->pc + 4 + (imm << 2);
|
||||||
|
ctx->hflags |= MIPS_HFLAG_BC; // 标记延迟槽与分支状态
|
||||||
|
|
||||||
|
tcg_temp_free(t_cond);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 0x10: // Single (单精度浮点运算指令)
|
||||||
|
case 0x11: // Double (双精度浮点运算指令)
|
||||||
|
{
|
||||||
|
// 抛弃繁琐的 TCGv_i64 搬运,直接把 32 位指令扔给 C 语言后端解码
|
||||||
|
TCGv_i32 t_insn = tcg_const_i32(insn);
|
||||||
|
gen_helper_fpu_math(cpu_env, t_insn);
|
||||||
|
tcg_temp_free_i32(t_insn);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
generate_exception_end(ctx, EXCP_RI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static bool disas_insn(CPUState *env, DisasContext *ctx)
|
static bool disas_insn(CPUState *env, DisasContext *ctx)
|
||||||
{
|
{
|
||||||
uint32_t insn = ldl_code(ctx->pc);
|
uint32_t insn = ldl_code(ctx->pc);
|
||||||
@@ -544,15 +665,20 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
|
|||||||
TCGv t0 = load_gpr(rs);
|
TCGv t0 = load_gpr(rs);
|
||||||
TCGv t1 = load_gpr(rt);
|
TCGv t1 = load_gpr(rt);
|
||||||
TCGv res = tcg_temp_new();
|
TCGv res = tcg_temp_new();
|
||||||
|
|
||||||
tcg_gen_mul_tl(res, t0, t1);
|
tcg_gen_mul_tl(res, t0, t1);
|
||||||
tcg_gen_ext32s_tl(res, res); // 强制符号扩展
|
tcg_gen_ext32s_tl(res, res); // 强制符号扩展
|
||||||
store_gpr(rd, res);
|
store_gpr(rd, res);
|
||||||
|
|
||||||
tcg_temp_free(t0);
|
tcg_temp_free(t0);
|
||||||
tcg_temp_free(t1);
|
tcg_temp_free(t1);
|
||||||
tcg_temp_free(res);
|
tcg_temp_free(res);
|
||||||
}
|
}
|
||||||
|
} else if (funct >= 0x08 && funct <= 0x0F) { // MADD/MSUB/NMADD/NMSUB
|
||||||
|
// 浮点乘加融合指令,传给 helper 处理
|
||||||
|
TCGv_i32 t_insn = tcg_const_i32(insn);
|
||||||
|
gen_helper_fpu_math(cpu_env, t_insn);
|
||||||
|
tcg_temp_free_i32(t_insn);
|
||||||
} else if (funct == 0x3F) { // SDBBP
|
} else if (funct == 0x3F) { // SDBBP
|
||||||
generate_exception_end(ctx, EXCP_DEBUG);
|
generate_exception_end(ctx, EXCP_DEBUG);
|
||||||
return true;
|
return true;
|
||||||
@@ -637,8 +763,15 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case 0x11: // COP1
|
case 0x11: // COP1
|
||||||
generate_exception_end(ctx, EXCP_CpU);
|
// 校验 CP0 Status.CU1 位 (假设你的 hflags 中 MIPS_HFLAG_FPU 代表 CU1 状态)
|
||||||
return true;
|
if (!(ctx->hflags & MIPS_HFLAG_FPU)) {
|
||||||
|
// 门禁未开,操作系统拦截,触发浮点懒加载陷阱
|
||||||
|
generate_exception_end(ctx, EXCP_CpU);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
// 门禁已开,跳转到我们新建的浮点专用解码函数
|
||||||
|
disas_cop1(ctx, env, insn);
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x10: // COP0
|
case 0x10: // COP0
|
||||||
if (rs == 0x00) { // MFC0
|
if (rs == 0x00) { // MFC0
|
||||||
@@ -660,6 +793,119 @@ static bool disas_insn(CPUState *env, DisasContext *ctx)
|
|||||||
case 0x2F: // CACHE
|
case 0x2F: // CACHE
|
||||||
case 0x33: // PREF
|
case 0x33: // PREF
|
||||||
break;
|
break;
|
||||||
|
case 0x35: // LDC1 (Load Doubleword to Coprocessor 1)
|
||||||
|
{
|
||||||
|
TCGv t0 = load_gpr(rs);
|
||||||
|
TCGv addr = tcg_temp_local_new();
|
||||||
|
TCGv val_lo = tcg_temp_new();
|
||||||
|
TCGv val_hi = tcg_temp_new();
|
||||||
|
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||||
|
TCGv_i32 t32_lo = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t32_hi = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_addi_tl(addr, t0, SEXT16(imm));
|
||||||
|
|
||||||
|
// 加载低32位
|
||||||
|
tcg_gen_qemu_ld_tl(val_lo, addr, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
// 加载高32位(地址+4)
|
||||||
|
TCGv addr_plus4 = tcg_temp_new();
|
||||||
|
tcg_gen_addi_tl(addr_plus4, addr, 4);
|
||||||
|
tcg_gen_qemu_ld_tl(val_hi, addr_plus4, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
|
||||||
|
// 拼接成64位
|
||||||
|
tcg_gen_trunc_tl_i32(t32_lo, val_lo);
|
||||||
|
tcg_gen_trunc_tl_i32(t32_hi, val_hi);
|
||||||
|
tcg_gen_concat_i32_i64(t64, t32_lo, t32_hi);
|
||||||
|
tcg_gen_mov_i64(fpu_gpr[rt], t64);
|
||||||
|
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free(addr);
|
||||||
|
tcg_temp_free(val_lo);
|
||||||
|
tcg_temp_free(val_hi);
|
||||||
|
tcg_temp_free_i64(t64);
|
||||||
|
tcg_temp_free_i32(t32_lo);
|
||||||
|
tcg_temp_free_i32(t32_hi);
|
||||||
|
tcg_temp_free(addr_plus4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x3D: // SDC1 (Store Doubleword from Coprocessor 1)
|
||||||
|
{
|
||||||
|
TCGv t0 = load_gpr(rs);
|
||||||
|
TCGv addr = tcg_temp_local_new();
|
||||||
|
TCGv val_lo = tcg_temp_new();
|
||||||
|
TCGv val_hi = tcg_temp_new();
|
||||||
|
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||||
|
TCGv_i32 t32_lo = tcg_temp_new_i32();
|
||||||
|
TCGv_i32 t32_hi = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_addi_tl(addr, t0, SEXT16(imm));
|
||||||
|
|
||||||
|
// 拆分64位为两个32位
|
||||||
|
tcg_gen_mov_i64(t64, fpu_gpr[rt]);
|
||||||
|
tcg_gen_extrl_i64_i32(t32_lo, t64);
|
||||||
|
tcg_gen_shri_i64(t64, t64, 32);
|
||||||
|
tcg_gen_extrl_i64_i32(t32_hi, t64);
|
||||||
|
|
||||||
|
// 扩展到目标寄存器宽度
|
||||||
|
tcg_gen_ext_i32_tl(val_lo, t32_lo);
|
||||||
|
tcg_gen_ext_i32_tl(val_hi, t32_hi);
|
||||||
|
|
||||||
|
// 存储低32位
|
||||||
|
tcg_gen_qemu_st_tl(val_lo, addr, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
// 存储高32位(地址+4)
|
||||||
|
TCGv addr_plus4 = tcg_temp_new();
|
||||||
|
tcg_gen_addi_tl(addr_plus4, addr, 4);
|
||||||
|
tcg_gen_qemu_st_tl(val_hi, addr_plus4, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free(addr);
|
||||||
|
tcg_temp_free(val_lo);
|
||||||
|
tcg_temp_free(val_hi);
|
||||||
|
tcg_temp_free_i64(t64);
|
||||||
|
tcg_temp_free_i32(t32_lo);
|
||||||
|
tcg_temp_free_i32(t32_hi);
|
||||||
|
tcg_temp_free(addr_plus4);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x31: // LWC1 (Load Word to Coprocessor 1)
|
||||||
|
{
|
||||||
|
TCGv t0 = load_gpr(rs);
|
||||||
|
TCGv addr = tcg_temp_local_new();
|
||||||
|
TCGv val = tcg_temp_new();
|
||||||
|
TCGv_i64 t64 = tcg_temp_new_i64();
|
||||||
|
|
||||||
|
tcg_gen_addi_tl(addr, t0, SEXT16(imm));
|
||||||
|
tcg_gen_qemu_ld_tl(val, addr, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
tcg_gen_ext_tl_i64(t64, val);
|
||||||
|
tcg_gen_mov_i64(fpu_gpr[rt], t64);
|
||||||
|
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free(addr);
|
||||||
|
tcg_temp_free(val);
|
||||||
|
tcg_temp_free_i64(t64);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 0x39: // SWC1 (Store Word from Coprocessor 1)
|
||||||
|
{
|
||||||
|
TCGv t0 = load_gpr(rs);
|
||||||
|
TCGv addr = tcg_temp_local_new();
|
||||||
|
TCGv val = tcg_temp_new();
|
||||||
|
TCGv_i32 t32 = tcg_temp_new_i32();
|
||||||
|
|
||||||
|
tcg_gen_addi_tl(addr, t0, SEXT16(imm));
|
||||||
|
tcg_gen_extrl_i64_i32(t32, fpu_gpr[rt]);
|
||||||
|
tcg_gen_ext_i32_tl(val, t32);
|
||||||
|
tcg_gen_qemu_st_tl(val, addr, ctx->mem_idx, MO_TE | MO_UL);
|
||||||
|
|
||||||
|
tcg_temp_free(t0);
|
||||||
|
tcg_temp_free(addr);
|
||||||
|
tcg_temp_free(val);
|
||||||
|
tcg_temp_free_i32(t32);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
case 0x08: // ADDI
|
case 0x08: // ADDI
|
||||||
case 0x09: // ADDIU
|
case 0x09: // ADDIU
|
||||||
@@ -962,6 +1208,14 @@ void translate_init(void) {
|
|||||||
cpu_PC = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, pc), "pc");
|
cpu_PC = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, pc), "pc");
|
||||||
cpu_HI = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, HI), "HI");
|
cpu_HI = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, HI), "HI");
|
||||||
cpu_LO = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, LO), "LO");
|
cpu_LO = tcg_global_mem_new(TCG_AREG0, offsetof(CPUState, LO), "LO");
|
||||||
|
|
||||||
|
// 1. 绑定 32 个 64位的浮点数据寄存器
|
||||||
|
for (int i = 0; i < 32; i++) {
|
||||||
|
fpu_gpr[i] = tcg_global_mem_new_i64(TCG_AREG0, offsetof(CPUState, fpu_gpr[i]), mips_fpr_names[i]);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 2. 绑定 32位的浮点控制状态寄存器
|
||||||
|
fcr31 = tcg_global_mem_new_i32(TCG_AREG0, offsetof(CPUState, fcr31), "fcr31");
|
||||||
}
|
}
|
||||||
|
|
||||||
void gen_sync_pc(DisasContext *dc) {
|
void gen_sync_pc(DisasContext *dc) {
|
||||||
@@ -1093,7 +1347,14 @@ void restore_state_to_opc(CPUState *env, TranslationBlock *tb, target_ulong *dat
|
|||||||
env->pc = data[0];
|
env->pc = data[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
void setup_disas_context(DisasContextBase *dcbase, CPUState *env) {
|
void setup_disas_context(DisasContextBase *dcbase, CPUState *env) {
|
||||||
((DisasContext *)dcbase)->mem_idx = cpu_mmu_index(env);
|
DisasContext *ctx = (DisasContext *)dcbase;
|
||||||
((DisasContext *)dcbase)->hflags = env->hflags;
|
ctx->mem_idx = cpu_mmu_index(env);
|
||||||
|
ctx->hflags = env->hflags;
|
||||||
|
/* 同步 CP0 Status.CU1 → MIPS_HFLAG_FPU 门禁 */
|
||||||
|
if (env->CP0_Status & CP0_STATUS_CU1) {
|
||||||
|
ctx->hflags |= MIPS_HFLAG_FPU;
|
||||||
|
} else {
|
||||||
|
ctx->hflags &= ~MIPS_HFLAG_FPU;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -34,6 +34,7 @@ static tcg_t stcg;
|
|||||||
|
|
||||||
void gen_helpers(void)
|
void gen_helpers(void)
|
||||||
{
|
{
|
||||||
|
#undef GEN_HELPER // ← 新增:清除 tb-helper.h 中的旧定义
|
||||||
#define GEN_HELPER 2
|
#define GEN_HELPER 2
|
||||||
#include "helper.h"
|
#include "helper.h"
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -15,10 +15,10 @@
|
|||||||
"System.ServiceModel.Duplex": "4.8.1",
|
"System.ServiceModel.Duplex": "4.8.1",
|
||||||
"System.ServiceModel.Federation": "4.8.1",
|
"System.ServiceModel.Federation": "4.8.1",
|
||||||
"System.ServiceModel.NetTcp": "4.8.1",
|
"System.ServiceModel.NetTcp": "4.8.1",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -1782,10 +1782,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1806,10 +1806,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2841,7 +2841,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -2856,7 +2856,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
@@ -8,10 +8,10 @@
|
|||||||
".NETCoreApp,Version=v8.0": {
|
".NETCoreApp,Version=v8.0": {
|
||||||
"OptionsParser/1.0.0": {
|
"OptionsParser/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.NET.Test.Sdk": "16.9.1",
|
"Microsoft.NET.Test.Sdk": "16.9.1",
|
||||||
"NUnit": "3.13.1",
|
"NUnit": "3.13.1",
|
||||||
"NUnit3TestAdapter": "3.17.0"
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
|
"OptionsParser": "1.0.0"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"OptionsParser.dll": {}
|
"OptionsParser.dll": {}
|
||||||
|
|||||||
Binary file not shown.
@@ -8,10 +8,10 @@
|
|||||||
".NETCoreApp,Version=v8.0": {
|
".NETCoreApp,Version=v8.0": {
|
||||||
"OptionsParser/1.0.0": {
|
"OptionsParser/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.NET.Test.Sdk": "16.9.1",
|
"Microsoft.NET.Test.Sdk": "16.9.1",
|
||||||
"NUnit": "3.13.1",
|
"NUnit": "3.13.1",
|
||||||
"NUnit3TestAdapter": "3.17.0"
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
|
"OptionsParser": "1.0.0"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"OptionsParser.dll": {}
|
"OptionsParser.dll": {}
|
||||||
|
|||||||
@@ -14,10 +14,10 @@
|
|||||||
"System.ServiceModel.Duplex": "4.8.1",
|
"System.ServiceModel.Duplex": "4.8.1",
|
||||||
"System.ServiceModel.Federation": "4.8.1",
|
"System.ServiceModel.Federation": "4.8.1",
|
||||||
"System.ServiceModel.NetTcp": "4.8.1",
|
"System.ServiceModel.NetTcp": "4.8.1",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -1781,10 +1781,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1805,10 +1805,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2840,7 +2840,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -2855,7 +2855,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
Binary file not shown.
@@ -8,10 +8,10 @@
|
|||||||
".NETCoreApp,Version=v8.0": {
|
".NETCoreApp,Version=v8.0": {
|
||||||
"OptionsParser/1.0.0": {
|
"OptionsParser/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.NET.Test.Sdk": "16.9.1",
|
"Microsoft.NET.Test.Sdk": "16.9.1",
|
||||||
"NUnit": "3.13.1",
|
"NUnit": "3.13.1",
|
||||||
"NUnit3TestAdapter": "3.17.0"
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
|
"OptionsParser": "1.0.0"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"OptionsParser.dll": {}
|
"OptionsParser.dll": {}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@
|
|||||||
"AntShell": "1.0.0",
|
"AntShell": "1.0.0",
|
||||||
"Infrastructure": "1.0.0",
|
"Infrastructure": "1.0.0",
|
||||||
"StyleCop.Analyzers": "1.1.118",
|
"StyleCop.Analyzers": "1.1.118",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -1574,10 +1574,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1598,10 +1598,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2507,7 +2507,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -2522,7 +2522,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
Binary file not shown.
Binary file not shown.
@@ -8,10 +8,10 @@
|
|||||||
".NETCoreApp,Version=v8.0": {
|
".NETCoreApp,Version=v8.0": {
|
||||||
"OptionsParser/1.0.0": {
|
"OptionsParser/1.0.0": {
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"Microsoft.CSharp": "4.7.0",
|
|
||||||
"Microsoft.NET.Test.Sdk": "16.9.1",
|
"Microsoft.NET.Test.Sdk": "16.9.1",
|
||||||
"NUnit": "3.13.1",
|
"NUnit": "3.13.1",
|
||||||
"NUnit3TestAdapter": "3.17.0"
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
|
"OptionsParser": "1.0.0"
|
||||||
},
|
},
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"OptionsParser.dll": {}
|
"OptionsParser.dll": {}
|
||||||
|
|||||||
@@ -26,12 +26,12 @@
|
|||||||
"Xwt": "1.0.0",
|
"Xwt": "1.0.0",
|
||||||
"Xwt.Gtk3": "1.0.0",
|
"Xwt.Gtk3": "1.0.0",
|
||||||
"libtftp": "1.0.0",
|
"libtftp": "1.0.0",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"CookComputing.XmlRpcV2": "2.5.0.0",
|
"CookComputing.XmlRpcV2": "2.5.0.0",
|
||||||
"CoSimulationPlugin.Reference": "1.0.0.0",
|
"CoSimulationPlugin.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -1954,10 +1954,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1994,10 +1994,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3134,7 +3134,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3159,7 +3159,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
@@ -16,11 +16,11 @@
|
|||||||
"NUnit3TestAdapter": "3.17.0",
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
"Renode": "1.0.0",
|
"Renode": "1.0.0",
|
||||||
"UnitTests": "1.0.0",
|
"UnitTests": "1.0.0",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"CoSimulationPlugin.Reference": "1.0.0.0",
|
"CoSimulationPlugin.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -28,7 +28,7 @@
|
|||||||
"Migrant.Reference": "0.14.0.0",
|
"Migrant.Reference": "0.14.0.0",
|
||||||
"OptionsParser.Reference": "0.1.0.0",
|
"OptionsParser.Reference": "0.1.0.0",
|
||||||
"PacketDotNet.Reference": "0.13.0.0",
|
"PacketDotNet.Reference": "0.13.0.0",
|
||||||
"Renode.Reference": "1.16.0.31961",
|
"Renode.Reference": "1.16.0.26170",
|
||||||
"SampleCommandPlugin.Reference": "1.0.0.0",
|
"SampleCommandPlugin.Reference": "1.0.0.0",
|
||||||
"Sprache": "2.1.0.0",
|
"Sprache": "2.1.0.0",
|
||||||
"SystemCPlugin.Reference": "1.0.0.0",
|
"SystemCPlugin.Reference": "1.0.0.0",
|
||||||
@@ -2035,10 +2035,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2067,10 +2067,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2131,10 +2131,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Renode.Reference/1.16.0.31961": {
|
"Renode.Reference/1.16.0.26170": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"Renode.dll": {
|
"Renode.dll": {
|
||||||
"assemblyVersion": "1.16.0.31961",
|
"assemblyVersion": "1.16.0.26170",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3255,7 +3255,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3275,7 +3275,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3315,7 +3315,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"Renode.Reference/1.16.0.31961": {
|
"Renode.Reference/1.16.0.26170": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
@@ -18,11 +18,11 @@
|
|||||||
"NUnit3TestAdapter": "3.17.0",
|
"NUnit3TestAdapter": "3.17.0",
|
||||||
"Renode": "1.0.0",
|
"Renode": "1.0.0",
|
||||||
"StyleCop.Analyzers": "1.1.118",
|
"StyleCop.Analyzers": "1.1.118",
|
||||||
"AntShell.Reference": "1.0.9606.31907",
|
"AntShell.Reference": "1.0.9669.26120",
|
||||||
"BigGustave.Reference": "1.0.0.0",
|
"BigGustave.Reference": "1.0.0.0",
|
||||||
"CoSimulationPlugin.Reference": "1.0.0.0",
|
"CoSimulationPlugin.Reference": "1.0.0.0",
|
||||||
"crypto.Reference": "1.9.0.0",
|
"crypto.Reference": "1.9.0.0",
|
||||||
"CxxDemangler.Reference": "1.0.9606.31897",
|
"CxxDemangler.Reference": "1.0.9669.26104",
|
||||||
"ELFSharp.Reference": "0.1.1.0",
|
"ELFSharp.Reference": "0.1.1.0",
|
||||||
"FdtSharp.Reference": "0.1.0.0",
|
"FdtSharp.Reference": "0.1.0.0",
|
||||||
"Infrastructure.Reference": "1.0.0.0",
|
"Infrastructure.Reference": "1.0.0.0",
|
||||||
@@ -31,7 +31,7 @@
|
|||||||
"Migrant.Reference": "0.14.0.0",
|
"Migrant.Reference": "0.14.0.0",
|
||||||
"OptionsParser.Reference": "0.1.0.0",
|
"OptionsParser.Reference": "0.1.0.0",
|
||||||
"PacketDotNet.Reference": "0.13.0.0",
|
"PacketDotNet.Reference": "0.13.0.0",
|
||||||
"Renode.Reference": "1.16.0.31961",
|
"Renode.Reference": "1.16.0.26170",
|
||||||
"SampleCommandPlugin.Reference": "1.0.0.0",
|
"SampleCommandPlugin.Reference": "1.0.0.0",
|
||||||
"SystemCPlugin.Reference": "1.0.0.0",
|
"SystemCPlugin.Reference": "1.0.0.0",
|
||||||
"TermSharp.Reference": "0.0.0.0",
|
"TermSharp.Reference": "0.0.0.0",
|
||||||
@@ -2018,10 +2018,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"AntShell.dll": {
|
"AntShell.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31907",
|
"assemblyVersion": "1.0.9669.26120",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2050,10 +2050,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"CxxDemangler.dll": {
|
"CxxDemangler.dll": {
|
||||||
"assemblyVersion": "1.0.9606.31897",
|
"assemblyVersion": "1.0.9669.26104",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -2122,10 +2122,10 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"Renode.Reference/1.16.0.31961": {
|
"Renode.Reference/1.16.0.26170": {
|
||||||
"runtime": {
|
"runtime": {
|
||||||
"Renode.dll": {
|
"Renode.dll": {
|
||||||
"assemblyVersion": "1.16.0.31961",
|
"assemblyVersion": "1.16.0.26170",
|
||||||
"fileVersion": "0.0.0.0"
|
"fileVersion": "0.0.0.0"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3232,7 +3232,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"AntShell.Reference/1.0.9606.31907": {
|
"AntShell.Reference/1.0.9669.26120": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3252,7 +3252,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"CxxDemangler.Reference/1.0.9606.31897": {
|
"CxxDemangler.Reference/1.0.9669.26104": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
@@ -3297,7 +3297,7 @@
|
|||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
},
|
},
|
||||||
"Renode.Reference/1.16.0.31961": {
|
"Renode.Reference/1.16.0.26170": {
|
||||||
"type": "reference",
|
"type": "reference",
|
||||||
"serviceable": false,
|
"serviceable": false,
|
||||||
"sha512": ""
|
"sha512": ""
|
||||||
|
|||||||
Binary file not shown.
Reference in New Issue
Block a user