mirror of
https://github.com/FEX-Emu/FEX.git
synced 2026-10-06 14:00:16 +02:00
Fixes FindTrailingZeros IR interpreter
Was generating undefined behaviour when input was zero Found via unit tests when testing TZCNT with zero input
This commit is contained in:
1 parent
157f66bfc0
commit
f034cef9fc
1 file changed
+32
-4
@@ -944,10 +944,38 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) {
|
||||
case IR::OP_FINDTRAILINGZEROS: {
|
||||
auto Op = IROp->C<IR::IROp_FindTrailingZeros>();
|
||||
switch (OpSize) {
|
||||
case 1: GD = __builtin_ctz(*GetSrc<uint8_t*>(Op->Header.Args[0])); break;
|
||||
case 2: GD = __builtin_ctz(*GetSrc<uint16_t*>(Op->Header.Args[0])); break;
|
||||
case 4: GD = __builtin_ctz(*GetSrc<uint32_t*>(Op->Header.Args[0])); break;
|
||||
case 8: GD = __builtin_ctz(*GetSrc<uint64_t*>(Op->Header.Args[0])); break;
|
||||
case 1: {
|
||||
auto Src = *GetSrc<uint8_t*>(Op->Header.Args[0]);
|
||||
if (Src)
|
||||
GD = __builtin_ctz(Src);
|
||||
else
|
||||
GD = sizeof(Src) * 8;
|
||||
break;
|
||||
}
|
||||
case 2: {
|
||||
auto Src = *GetSrc<uint16_t*>(Op->Header.Args[0]);
|
||||
if (Src)
|
||||
GD = __builtin_ctz(Src);
|
||||
else
|
||||
GD = sizeof(Src) * 8;
|
||||
break;
|
||||
}
|
||||
case 4: {
|
||||
auto Src = *GetSrc<uint32_t*>(Op->Header.Args[0]);
|
||||
if (Src)
|
||||
GD = __builtin_ctz(Src);
|
||||
else
|
||||
GD = sizeof(Src) * 8;
|
||||
break;
|
||||
}
|
||||
case 8: {
|
||||
auto Src = *GetSrc<uint64_t*>(Op->Header.Args[0]);
|
||||
if (Src)
|
||||
GD = __builtin_ctzll(Src);
|
||||
else
|
||||
GD = sizeof(Src) * 8;
|
||||
break;
|
||||
}
|
||||
default: LogMan::Msg::A("Unknown size: %d", OpSize); break;
|
||||
}
|
||||
break;
|
||||
|
||||
Reference in new issue
Block a user