Оператор == не всегда переводится в ceq. Тип может перегрузить его с помощью оператора == (). Например, System.Decimal делает это, перегружая все операторы, поскольку их реализация нетривиальна, а джиттер не имеет специальных знаний о типе (компилятор делает).
Вы найдете его с Reflector как метод Decimal.op_Equality (). Что приводит вас к FCallCompare, методу, который приписывается MethodImplOptions.InternalCall. Эти методы особенные, у джиттера есть секретное знание о них. Вы можете найти их реализацию через файл исходного кода clr / src / vm / ecall.cpp в Rotor. Он содержит таблицу всех внутренних функций вызова, джиттер ищет запись в таблице по имени метода. Затем компилирует адрес соответствующей функции C ++, как указано в таблице, в инструкцию вызова. Помните, что имя функции было изменено с момента выпуска Rotor, найдите FCallAdd, это следующая запись в таблице. Что приводит вас к COMDecimal :: Compare. Что приведет вас к файлу исходного кода comdecimal.cpp.
Jitters x86 и x64 знают, как преобразовать код операции ceq в машинный код напрямую, без использования вспомогательной функции, он генерирует встроенные машинные инструкции. Фактически сгенерированный код зависит от типа сравниваемых значений. И цель, джиттер x64 использует инструкции SSE, x86 использует инструкции FPU для сравнения значений с плавающей запятой. Другие дрожания будут реализовывать их по-другому, но, конечно же.
Вспомогательная функция, такая как Object.InternalEquals (), также является внутренним методом, как и FCallCompare. Вы бы использовали ту же стратегию, чтобы найти реализацию.