Функция 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
(технически переполнение приводит к поведению undefined, но пусть принимает по модулю арифметику).
Итак, как эффективно реализовать функцию сравнения для целых чисел? Вот моя первая попытка:
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 инструкций? Есть ли более простой способ, который более эффективен?