Вот пример такой функции сложения:
// func add(x, y [8]int32) [8]int32
// q = x + y
TEXT ·add(SB),0,$0
VMOVDQU x+0(FP), Y0
VPADDD Y+32(FP), Y0, Y0
VMOVDQU Y0, q+64(FP)
VZEROUPPER
RET
Перед чтением этого кода ознакомьтесь с этим документом . К сожалению, сборка в стиле Go (также известная как сборка в стиле Plan 9) плохо документирована.
Массивы передаются в стек по значению. Возвращаемое значение передается как дополнительный крайний правый аргумент, считываемый вызывающей стороной. Используйте (FP)
, как описано в документе, который я связал с аргументами функции доступа.
Кроме того, это довольно просто. Синтаксис аналогичен синтаксису AT&T (но не равен). Обратите внимание, что имена регистров различаются, и суффикс размера является обязательным.
Как видите, писать ассемблерную функцию для одной операции довольно бессмысленно. Вероятно, будет намного лучше взять нужный алгоритм и полностью написать его на ассемблере.