Эффективная функция сравнения целых чисел

Функция compare— это функция, которая принимает два аргумента aи bи возвращает целое число, описывающее их значения. заказ. Если aменьше, чем b, результатом будет некоторое отрицательное целое число. Если aбольше, чем b, результатом будет некоторое положительное целое число. В противном случае aи bравны, и результат равен нулю.

Эта функция часто используется для параметризации алгоритмов сортировки и поиска из стандартных библиотек.

Реализовать функцию compareдля символов довольно просто; вы просто вычитаете аргументы:

int compare_char(char a, char b)
{
    return a - b;
}

Это работает, потому что обычно считается, что разница между двумя символами соответствует целому числу. (Обратите внимание, что это предположение не выполняется для систем, где sizeof(char) == sizeof(int).)

Этот трюк не работает для сравнения целых чисел, потому что разница между двумя целыми числами обычно не соответствует в целое число. Например, INT_MAX - (-1) = INT_MINпредполагает, что INT_MAXменьше, чем -1(технически переполнение приводит к неопределенному поведению, но предположим, по модулю арифметики).

Итак, как мы можем эффективно реализовать функцию сравнения для целых чисел? Вот моя первая попытка:

int compare_int(int a, int b)
{
    int temp;
    int result;
    __asm__ __volatile__ (
        "cmp %3, %2 \n\t"
        "mov $0, %1 \n\t"

        "mov $1, %0 \n\t"
        "cmovg %0, %1 \n\t"

        "mov $-1, %0 \n\t"
        "cmovl %0, %1 \n\t"
    : "=r"(temp), "=r"(result)
    : "r"(a), "r"(b)
    : "cc");
    return result;
}

Можно ли это сделать менее чем за 6 инструкций? Есть ли менее простой и более эффективный способ?

61
задан Jonathan Leffler 13 September 2019 в 00:51
поделиться