[解決済み] Go が私のアセンブリをリンクしてくれません: 外部関数が未定義です
質問
主に学習用にSIMDを書こうとしています。Go がアセンブリをリンクできることは知っていますが、正しく動作させることができません。
私が作れる最も最小限の例です(要素ごとのベクトル乗算)。
vec_amd64.s
(注意: 実際のファイルでは、空白行が
RET
の下に空白行があります。)
// func mul(v1, v2 Vec4) Vec4
TEXT .mul(SB),4,$0-48
MOVUPS v1+0(FP), X0
MOVUPS v2+16(FP), X1
MULPS X1, X0
// also tried ret+32 since I've seen some places do that
MOVUPS X0, toReturn+32(FP)
RET
vec.go
package simd
type Vec4 [4]float32
func (v1 Vec4) Mul(v2 Vec4) Vec4 {
return Vec4{v1[0] * v2[0], v1[1] * v2[1], v1[2] * v2[2], v1[3] * v2[3]}
}
func mul(v1, v2 Vec4) Vec4
simd_test.go
package simd
import (
"testing"
)
func TestMul(t *testing.T) {
v1 := Vec4{1, 2, 3, 4}
v2 := Vec4{5, 6, 7, 8}
res := v1.Mul(v2)
res2 := mul(v1, v2)
// Placeholder until I get it to compile
if res != res2 {
t.Fatalf("Expected %v; got %v", res, res2)
}
}
を実行しようとすると
go test
というエラーが出ます。
# testmain
simd.TestMul: call to external function simd.mul
simd.TestMul: undefined: simd.mul
は
go env
コマンドは、私の
GOHOSTARCH
であることを報告します。
amd64
で、Go のバージョンは 1.3 になっていました。アーキテクチャが原因でないことを確認するため、アセンブリを使用する別のパッケージを見つけ、アセンブリ ファイルをすべて削除しました。
_amd64.s
を除くすべてのアセンブリ ファイルを削除し、そのテストは正常に実行されました。
私はまた、それが奇妙なことを引き起こしている場合に備えて、エクスポートされた識別子に変更しようとしましたが、失敗しました。私は、以下のようなパッケージのテンプレートにかなり忠実に従ったと思います。
math/big
のようなパッケージのテンプレートにかなり忠実に従ったと思うので、私が見逃しているのが何か単純で明白なものであることを望みます。
私は、Go が少なくとも を試しています。 を使用していることがわかります。.s ファイルに構文エラーを導入すると、ビルドツールはそれについて文句を言います。
編集してください。
明確にするために
go build
はきれいにコンパイルされますが
go test
はエラーが表示されます。
解決方法は?
ドットの使い方が間違っています。
TEXT .mul(SB),4,$0-48
書く
TEXT ·mul(SB),4,$0-48
で、すべてうまくいきます。
関連
-
[解決済み] デバッグせずにIllegal Instructionエラーの原因となったアセンブリ命令を見つけることができる
-
[解決済み] Collatz予想の検証を行うC++のコードは、なぜ手書きのアセンブリよりも高速に動作するのでしょうか?
-
[解決済み】init()関数はいつ実行されるのですか?
-
[解決済み】関数宣言の構文:関数名の前に括弧でくくられたもの
-
[解決済み】GCCを使用して読みやすいアセンブリを作成しますか?
-
[解決済み] Gnuアセンブラ(GAS)のCFIディレクティブは何のためにあるのですか?
-
[解決済み] FS"/"GS "レジスタは何のためにあるのですか?
-
[解決済み] なぜインテルはプロセッサーに内蔵RISCコアを隠すのか?
-
[解決済み] x86_64 registers rax/eax/ax/al overwriting full register contents [duplicate] レジスタの内容をすべて上書きする。
-
[解決済み] アセンブリ言語ではスタックはどのように機能するのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] Gnuアセンブラ(GAS)のCFIディレクティブは何のためにあるのですか?
-
[解決済み] コールスタックはどのように機能するのか?
-
[解決済み] なぜx86は醜いのか?なぜ他と比較して劣っていると言われるのか?[クローズド]
-
[解決済み] 最近のシステムでは、スタックの成長方向はどうなっているのでしょうか?
-
[解決済み] アセンブリコードで "int 0x80 "とはどういう意味ですか?
-
[解決済み] gdbで指定されたアドレスのアセンブリ命令をブレークするには?
-
[解決済み] 学習会【終了
-
[解決済み] x86_64 registers rax/eax/ax/al overwriting full register contents [duplicate] レジスタの内容をすべて上書きする。
-
[解決済み] ARMにおけるSP(スタック)とLRとは?
-
[解決済み] x86のIN命令とOUT命令は何に使われるのですか?