diff --git a/Source/Interface/Core/Interpreter/InterpreterCore.cpp b/Source/Interface/Core/Interpreter/InterpreterCore.cpp index fdf9cea1c..b2e13cbb5 100644 --- a/Source/Interface/Core/Interpreter/InterpreterCore.cpp +++ b/Source/Interface/Core/Interpreter/InterpreterCore.cpp @@ -944,10 +944,38 @@ void InterpreterCore::ExecuteCode(FEXCore::Core::InternalThreadState *Thread) { case IR::OP_FINDTRAILINGZEROS: { auto Op = IROp->C(); switch (OpSize) { - case 1: GD = __builtin_ctz(*GetSrc(Op->Header.Args[0])); break; - case 2: GD = __builtin_ctz(*GetSrc(Op->Header.Args[0])); break; - case 4: GD = __builtin_ctz(*GetSrc(Op->Header.Args[0])); break; - case 8: GD = __builtin_ctz(*GetSrc(Op->Header.Args[0])); break; + case 1: { + auto Src = *GetSrc(Op->Header.Args[0]); + if (Src) + GD = __builtin_ctz(Src); + else + GD = sizeof(Src) * 8; + break; + } + case 2: { + auto Src = *GetSrc(Op->Header.Args[0]); + if (Src) + GD = __builtin_ctz(Src); + else + GD = sizeof(Src) * 8; + break; + } + case 4: { + auto Src = *GetSrc(Op->Header.Args[0]); + if (Src) + GD = __builtin_ctz(Src); + else + GD = sizeof(Src) * 8; + break; + } + case 8: { + auto Src = *GetSrc(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;