Понимание базовой встроенной сборки NEON

Учитывая этот вопрос: как писать встроенные коды сборки о LOOP в Xcode LLVM?

На что отвечает следующий встроенный ассемблерный код:

void brighten_neon(unsigned char* src, unsigned char* dst, int numPixels, int intensity) {
asm volatile (
              "\t mov r4, #0\n"
              "\t vdup.8 d1, %3\n"
              "Lloop2:\n"
              "\t cmp r4, %2\n"
              "\t bge Lend2\n"
              "\t vld1.8 d0, [%0]!\n"
              "\t vqadd.s8 d0, d0, d1\n"
              "\t vst1.8 d0, [%1]!\n"
              "\t add r4, r4, #8\n"
              "\t b Lloop2\n"
              "Lend2:\n"
              : "=r"(src), "=r"(dst), "=r"(numPixels), "=r"(intensity)
              : "0"(src), "1"(dst), "2"(numPixels), "3"(intensity)
              : "cc", "r4", "d1", "d0");
}

Мне было интересно, что означают три последние строки в коде сборки? Кажется, что параметры определены здесь с именами регистров и т. д., которые используются встроенными. Может ли кто-нибудь уточнить это? Кто-нибудь знает какие-нибудь хорошие ресурсы, объясняющие это?


person user1511956    schedule 25.11.2012    source источник


Ответы (1)


Я мало что знаю о ассемблере ARM, но в синтаксисе встроенного ассемблера GCC три раздела — это выходные регистры, входные регистры и затертые регистры соответственно. Регистры нумеруются в порядке их появления, и в этом случае регистры ввода относятся к тем же переменным, что и регистры вывода, в том же порядке. =r зависит от архитектуры, но, вероятно, означает что-то вроде «любого регистра общего назначения».

Таким образом, вы можете ожидать, что компилятор выберет четыре удобных регистра для размещения четырех переменных (скорее всего, те, в которые их помещает соглашение о вызовах ARM?), И при необходимости сохранит cc, r4, d1, d0. Вы можете ссылаться на четыре регистра, используя %0, %1, %2, %3 в вашей сборке. В свою очередь, компилятор может ожидать, что когда вы закончите, вы не очистите никакие другие регистры, а новые значения переменных будут находиться в новых регистрах (которые оказались такими же, как старые регистры в этом кейс).

См. также GCC-Inline-Assembly-HOWTO. он немного устарел, но вы должны получить из него общее представление.

person shachaf    schedule 25.11.2012
comment
r действительно является «регистром общего назначения и специфичным для архитектуры, см. здесь список поддерживаемых типов hardwarebug.org/2010/07/06/arm-inline-asm-secrets, хотя, насколько я могу судить, = является стандартным синтаксисом и означает "выходной регистр - person koda; 19.07.2013