Я использовал эту маленькую функцию в GCC/x86, чтобы сделать быстрый обмен байт int16_t'S:значения г ++ рядного сборочных ограничений (равно против плюс, и т.д.)
static inline int16_t MySwapInt16t(int16_t val)
{
__asm__ ("xchgb %b0, %h0" : "=Q" (val) : "0" (val));
return val;
}
... сегодня при просмотре код кто-то еще на линии, я увидел, что он имел подобную функцию, которая выглядит следующим образом:
static inline int16_t HisSwapInt16t(int16_t val)
{
__asm__ ("xchgb %h0, %b0" : "+Q" (val));
return val;
}
Различие между моей функцией и его функцией (AFAICT) являются:
- Он определяет «+ Q» вместо «= Q»
- позиции% h0 и% b0 обменивается
- Он не имеет: «0» (VAL) положения в конце его функции
насколько я могу судить, обе реализации, кажется, правильно работать, но встроенный ассемблер немного черного искусства для меня, так что может кто-то знающие объяснить:
- Какое значение из трех различий вышеперечисленное?
- Является ли одна из двух реализаций лучше или быстрее, чем другая, или оба они будут выполнять эквивалентно?