diff options
| author | Yang Liu <liuyang22@iscas.ac.cn> | 2025-04-04 00:11:32 +0800 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-04-03 18:11:32 +0200 |
| commit | 8cd3ba8c9e4840541370905b1306ad57e946e288 (patch) | |
| tree | b18eef6492bc5249638ef2fa28cc054dbb4c229b /src | |
| parent | 8cba915bca8d48a7ac4d9571004975320f71a7ff (diff) | |
| download | box64-8cd3ba8c9e4840541370905b1306ad57e946e288.tar.gz box64-8cd3ba8c9e4840541370905b1306ad57e946e288.zip | |
[INTERP] Fixed a nan propagation issue on RISC-V (#2498)
Diffstat (limited to 'src')
| -rw-r--r-- | src/emu/x64runavx0f.c | 20 |
1 files changed, 16 insertions, 4 deletions
diff --git a/src/emu/x64runavx0f.c b/src/emu/x64runavx0f.c index dbc24f81..81be8027 100644 --- a/src/emu/x64runavx0f.c +++ b/src/emu/x64runavx0f.c @@ -385,17 +385,29 @@ uintptr_t RunAVX_0F(x64emu_t *emu, vex_t vex, uintptr_t addr, int *step) GETVX; GETGY; for(int i=0; i<4; ++i) { - nanmask[i] = isnan(VX->f[i]) || isnan(EX->f[i]); + if (isnan(VX->f[i]) || isnan(EX->f[i])) { + if (isnan(VX->f[i])) + GX->f[i] = VX->f[i]; + else + GX->f[i] = EX->f[i]; + continue; + } GX->f[i] = VX->f[i] + EX->f[i]; - if(!nanmask[i] && isnan(GX->f[i])) GX->f[i] = -NAN; + if(isnan(GX->f[i])) GX->f[i] = -NAN; } if(vex.l) { GETEY; GETVY; for(int i=0; i<4; ++i) { - nanmask[i] = isnan(VY->f[i]) || isnan(EY->f[i]); + if (isnan(VY->f[i]) || isnan(EY->f[i])) { + if (isnan(VY->f[i])) + GY->f[i] = VY->f[i]; + else + GY->f[i] = EY->f[i]; + continue; + } GY->f[i] = VY->f[i] + EY->f[i]; - if(!nanmask[i] && isnan(GY->f[i])) GY->f[i] = -NAN; + if(isnan(GY->f[i])) GY->f[i] = -NAN; } } else GY->u128 = 0; |