2012-06-12 2 views
2

Я использовал эту маленькую функцию в 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) являются:

  1. Он определяет «+ Q» вместо «= Q»
  2. позиции% h0 и% b0 обменивается
  3. Он не имеет: «0» (VAL) положения в конце его функции

насколько я могу судить, обе реализации, кажется, правильно работать, но встроенный ассемблер немного черного искусства для меня, так что может кто-то знающие объяснить:

  1. Какое значение из трех различий вышеперечисленное?
  2. Является ли одна из двух реализаций лучше или быстрее, чем другая, или оба они будут выполнять эквивалентно?

ответ

0

Он определяет "+ Q" вместо "= Q"

Он не имеет: "0" (VAL) положение в конце его функции

+ модификатора обозначает как входной, так и выходной операнд, поэтому нет необходимости добавлять список входных данных, проверьте CGG manual.

Позиции% h0 и% b0 обмениваются

Я предполагаю, что это не имеет значения, так как xchg инструкция делает обмен контентом между двумя операндами.

Является ли одна из двух реализаций лучше или быстрее, чем другая, или оба они будут выполнять эквивалентно?

Чтобы узнать лучшую реализацию, я бы компилировать как и проверить с objdump как компилятор завернутые эти функции, так как основная функция будет та же одна команда.

Надеюсь, что эта помощь!

Смежные вопросы