Golang монтажный инструмент _mm_add_epi32 - PullRequest
1 голос
/ 04 августа 2020

Я пытаюсь реализовать _mm_add_epi32 в golang сборке, опционально с помощью escape . Но я мало знаю о сборке и даже не знаю, как ее запустить. Вы можете намекнуть на код? Спасибо всем.

Вот эквивалентная более медленная golang версия:

func add(x, y []uint32) []uint32 {
    if len(x) != len(y) {
        return nil
    }

    result := make([]uint32, len(x))
    for i := 0; i < len(x); i++ {
        result[i] = x[i] + y[i]
    }
    return result
}

Я знаю, что структура paddq xmm, xmm - это то, что нам нужно, но не знаю, как преобразовать срез из []byte в 256-битный регистр YMM.

1 Ответ

2 голосов
/ 04 августа 2020

Вот пример такой функции сложения:

    // 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 (но не равен). Обратите внимание, что имена регистров различаются, и суффикс размера является обязательным.

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

...