[インデックス 17829] ファイルの概要
このコミットは、Go言語のmath
パッケージからfltasm_amd64.s
というアセンブリファイルを削除するものです。このファイルは、浮動小数点制御レジスタ(FPU Control WordおよびMXCSRレジスタ)を操作するためのルーチンを含んでいました。
コミット
commit 089bc25ae2be117310ae7e19d79d40e1ed69fc6e
Author: Russ Cox <rsc@golang.org>
Date: Tue Oct 22 10:37:33 2013 -0400
math: remove unnecessary source file
The routines in this file are dregs from a very early copy of the math API.
There are no Go prototypes and no non-amd64 implementations.
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/15750046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/089bc25ae2be117310ae7e19d79d40e1ed69fc6e
元コミット内容
math: remove unnecessary source file
The routines in this file are dregs from a very early copy of the math API.
There are no Go prototypes and no non-amd64 implementations.
変更の背景
このコミットの背景には、Go言語のmath
パッケージにおけるコードベースの整理と、不要なレガシーコードの削除があります。コミットメッセージによると、削除されたfltasm_amd64.s
ファイルに含まれるルーチンは、「非常に初期のmath
APIの残骸(dregs)」であり、以下の2つの主要な理由から不要と判断されました。
- Goプロトタイプが存在しない: これらのアセンブリルーチンに対応するGo言語の関数宣言(プロトタイプ)が存在しなかったため、Goコードから直接呼び出されることがありませんでした。これは、これらのルーチンがGoの標準ライブラリの一部として意図的に使用されていなかったことを示唆しています。
- 非AMD64実装が存在しない: このファイルは
fltasm_amd64.s
という名前が示す通り、AMD64アーキテクチャ専用のアセンブリコードでした。他のアーキテクチャ(ARM, x86など)向けの実装が存在しなかったため、クロスプラットフォーム対応のGo言語においては、その有用性が限定的でした。
これらの理由から、このファイルはGoのmath
パッケージにとって冗長であり、メンテナンスの負担となる不要なコードと見なされ、削除が決定されました。これは、Go言語の設計哲学である「シンプルさ」と「効率性」に沿った変更と言えます。
前提知識の解説
このコミットを理解するためには、以下の技術的な概念について知っておく必要があります。
1. 浮動小数点演算とFPU (Floating-Point Unit)
浮動小数点演算は、実数をコンピュータで表現し計算するための方法です。CPUには、これらの演算を高速に処理するための専用のハードウェアである浮動小数点演算ユニット(FPU)が搭載されています。IntelおよびAMDのx86-64アーキテクチャでは、FPUはCPUコアに統合されており、SSE(Streaming SIMD Extensions)やAVX(Advanced Vector Extensions)などの命令セットを通じて浮動小数点演算が実行されます。
2. FPU制御レジスタ (FPU Control Word / MXCSR)
FPUの動作は、特定の制御レジスタによって設定されます。
- FPU Control Word (FCW): x87 FPU(レガシーな浮動小数点コプロセッサ)の動作を制御する16ビットレジスタです。丸めモード、精度制御、例外マスクなどが設定されます。
- MXCSR (Media eXtension Control and Status Register): SSE/SSE2以降のSIMD浮動小数点演算の動作を制御する32ビットレジスタです。こちらも丸めモード、例外マスク、デノーマル数(denormal numbers)の処理方法などが設定されます。現代のGo言語の浮動小数点演算は主にSSE/AVXを使用するため、MXCSRがより重要です。
これらのレジスタを操作することで、浮動小数点演算の振る舞い(例:丸め誤差の処理、特定の例外の有効/無効化)を細かく制御できます。
3. アセンブリ言語 (.s
ファイル)
Go言語のソースコードには、.go
ファイルだけでなく、アセンブリ言語で書かれた.s
ファイルが含まれることがあります。これは、特定のアーキテクチャに特化した最適化、ハードウェアレジスタへの直接アクセス、またはGo言語では直接表現できない低レベルな操作を行うために使用されます。GoのアセンブリはPlan 9アセンブラの文法に基づいており、一般的なIntel構文とは異なります。
4. Go言語のビルドプロセスとクロスコンパイル
Go言語は、異なるCPUアーキテクチャやオペレーティングシステム向けにバイナリを生成するクロスコンパイルを強力にサポートしています。そのため、特定のアーキテクチャに依存するアセンブリコードは、そのアーキテクチャ向けにのみビルドされ、他のアーキテクチャでは無視されるか、Goで書かれた代替実装が使用されます。
5. NOSPLIT
とSB
、FP
Goのアセンブリにおけるキーワードです。
NOSPLIT
: 関数がスタックを分割しないことを示します。これは、非常に短い関数や、スタックの成長を厳密に制御する必要がある場合に用いられます。SB
(Static Base): グローバルシンボルや外部シンボルを参照するための擬似レジスタです。FP
(Frame Pointer): 関数の引数やローカル変数を参照するための擬似レジスタです。
技術的詳細
削除されたfltasm_amd64.s
ファイルには、以下の4つのアセンブリルーチンが含まれていました。これらはすべてAMD64アーキテクチャに特化しており、浮動小数点制御レジスタ(MXCSR)を操作するものでした。
-
TEXT ·SetFPControl(SB), NOSPLIT, $8
:- このルーチンは、浮動小数点制御ワードを設定します。
MOVL p+0(FP), DI
: 引数p
(Goの関数呼び出し規約ではスタック上のFP
からのオフセットでアクセス)をDI
レジスタにロードします。このp
が新しい制御ワードの値です。XORL $(0x3F<<7), DI
とANDL $0xFFC0, DI
: これは、入力値DI
から特定のビットマスクをクリアし、別のビットマスクを適用することで、MXCSRレジスタの特定のフィールド(おそらく例外マスクや丸めモード)を準備しています。WAIT
: FPU命令が完了するのを待ちます。STMXCSR 0(SP)
: 現在のMXCSRレジスタの値をスタックポインタSP
が指すメモリ位置に保存します。MOVL 0(SP), AX
,ANDL $~0x3F, AX
,ORL DI, AX
,MOVL AX, 0(SP)
: 保存したMXCSR値の一部をクリアし、新しい制御ワードの一部をOR演算で結合し、それを再びスタックに保存します。LDMXCSR 0(SP)
: スタックに保存された新しい値をMXCSRレジスタにロードします。これにより、FPUの制御設定が変更されます。RET
: 関数から戻ります。
-
TEXT ·GetFPControl(SB), NOSPLIT, $0
:- このルーチンは、現在の浮動小数点制御ワードを取得します。
WAIT
: FPU命令が完了するのを待ちます。STMXCSR 0(SP)
: 現在のMXCSRレジスタの値をスタックに保存します。MOVWLZX 0(SP), AX
: スタックからMXCSR値をAX
レジスタにロードし、ゼロ拡張します。ANDL $0xFFC0, AX
とXORL $(0x3F<<7), AX
: MXCSR値から特定のビットフィールドを抽出し、XOR演算で変換しています。これは、おそらく特定のビットを反転させることで、GoのAPIが期待する形式に変換していると考えられます。MOVL AX, ret+0(FP)
: 変換された値を戻り値としてスタックに保存します。RET
: 関数から戻ります。
-
TEXT ·SetFPStatus(SB), $0
:- このルーチンは、浮動小数点ステータスワードを設定します。
MOVL p+0(FP), DI
: 引数p
をDI
レジスタにロードします。ANDL $0x3F, DI
: 入力値DI
から特定のビットマスクを抽出します。これは、MXCSRレジスタのステータス部分(例外フラグなど)に対応すると考えられます。WAIT
,STMXCSR 0(SP)
,MOVL 0(SP), AX
,ANDL $~0x3F, AX
,ORL DI, AX
,MOVL AX, 0(SP)
,LDMXCSR 0(SP)
:SetFPControl
と同様に、MXCSRレジスタのステータス部分を更新します。
-
TEXT ·GetFPStatus(SB), $0
:- このルーチンは、現在の浮動小数点ステータスワードを取得します。
WAIT
,STMXCSR 0(SP)
: MXCSRレジスタの値をスタックに保存します。MOVL 0(SP), AX
: スタックからMXCSR値をAX
レジスタにロードします。ANDL $0x3F, AX
: MXCSR値から特定のビットマスクを抽出します。これは、ステータスフラグのみを抽出していると考えられます。MOVL AX, ret+0(FP)
: 抽出された値を戻り値としてスタックに保存します。RET
: 関数から戻ります。
これらのルーチンは、Go言語の初期段階で、C言語のライブラリや他のシステムから移植された際に、浮動小数点環境を細かく制御するために一時的に導入されたものと考えられます。しかし、Go言語の進化とともに、これらの低レベルなFPU制御はGoの標準ライブラリの外部で管理されるか、より高レベルな抽象化によって不要になったため、削除されました。特に、Goのランタイムやコンパイラが浮動小数点演算の環境を適切に設定するようになり、アプリケーションレベルでこれらのレジスタを直接操作する必要がなくなったことが背景にあるでしょう。
コアとなるコードの変更箇所
このコミットによる変更は、単一のファイル削除です。
--- a/src/pkg/math/fltasm_amd64.s
+++ /dev/null
@@ -1,69 +0,0 @@
-// Derived from Inferno's libkern/getfcr-amd64.s
-// http://code.google.com/p/inferno-os/source/browse/libkern/getfcr-amd64.s
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.
-// Portions Copyright 2009 The Go Authors. All rights reserved.
-//
-// Permission is hereby granted, free of charge, to any person obtaining a copy
-// of this software and associated documentation files (the "Software"), to deal
-// in the Software without restriction, including without limitation the rights
-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
-// copies of the Software, and to permit persons to whom the Software is
-// furnished to do so, subject to the following conditions:\n-//\n-// The above copyright notice and this permission notice shall be included in\n-// all copies or substantial portions of the Software.\n-//\n-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n-// THE SOFTWARE.\n-\n-#include "../../cmd/ld/textflag.h"\n-\n-TEXT ·SetFPControl(SB), NOSPLIT, $8\n-\t// Set new\n-\tMOVL p+0(FP), DI\n-\tXORL $(0x3F<<7), DI\n-\tANDL $0xFFC0, DI\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $~0x3F, AX\n-\tORL DI, AX\n-\tMOVL AX, 0(SP)\n-\tLDMXCSR 0(SP)\n-\tRET\n-\n-TEXT ·GetFPControl(SB), NOSPLIT, $0\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVWLZX 0(SP), AX\n-\tANDL $0xFFC0, AX\n-\tXORL $(0x3F<<7), AX\n-\tMOVL AX, ret+0(FP)\n-\tRET\n-\n-TEXT ·SetFPStatus(SB), $0\n-\tMOVL p+0(FP), DI\n-\tANDL $0x3F, DI\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $~0x3F, AX\n-\tORL DI, AX\n-\tMOVL AX, 0(SP)\n-\tLDMXCSR 0(SP)\n-\tRET\n-\n-TEXT ·GetFPStatus(SB), $0\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $0x3F, AX\n-\tMOVL AX, ret+0(FP)\n-\tRET
コアとなるコードの解説
このコミットは、src/pkg/math/fltasm_amd64.s
ファイルを完全に削除しています。このファイルは、前述の通り、AMD64アーキテクチャ向けの浮動小数点制御レジスタ操作を行うアセンブリルーチンを含んでいました。
ファイルの削除は、Go言語のmath
パッケージからこれらの低レベルなFPU制御機能が不要になったことを意味します。これは、Goランタイムが浮動小数点環境を適切に管理するようになったか、またはこれらの機能がGoの標準ライブラリの範囲外で処理されるようになったためと考えられます。
この変更により、Goのmath
パッケージはよりクリーンになり、不要なアーキテクチャ固有のアセンブリコードが取り除かれました。これにより、コードベースの保守性が向上し、Go言語のクロスプラットフォームな性質がさらに強化されます。
関連リンク
- Go言語の
math
パッケージ: https://pkg.go.dev/math - Go言語のアセンブリ: https://go.dev/doc/asm
- Intel 64 and IA-32 Architectures Software Developer's Manuals (FPU/SSE/MXCSRに関する詳細情報): https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
参考にした情報源リンク
- コミットメッセージ自体
- Go言語の公式ドキュメント
- Intelのソフトウェア開発者マニュアル (FPU/SSE/MXCSRに関する一般的な知識)
- Inferno OSのソースコード (削除されたファイルのコメントに記載されている派生元)
- Go言語のコードレビューシステム (Gerrit) のCLリンク: https://golang.org/cl/15750046 (これはコミットメッセージに記載されています)
- 一般的な浮動小数点演算とCPUアーキテクチャに関する知識
[インデックス 17829] ファイルの概要
このコミットは、Go言語のmath
パッケージからfltasm_amd64.s
というアセンブリファイルを削除するものです。このファイルは、浮動小数点制御レジスタ(FPU Control WordおよびMXCSRレジスタ)を操作するためのルーチンを含んでいました。
コミット
commit 089bc25ae2be117310ae7e19d79d40e1ed69fc6e
Author: Russ Cox <rsc@golang.org>
Date: Tue Oct 22 10:37:33 2013 -0400
math: remove unnecessary source file
The routines in this file are dregs from a very early copy of the math API.
There are no Go prototypes and no non-amd64 implementations.
R=golang-dev, minux.ma
CC=golang-dev
https://golang.org/cl/15750046
GitHub上でのコミットページへのリンク
https://github.com/golang/go/commit/089bc25ae2be117310ae7e19d79d40e1ed69fc6e
元コミット内容
math: remove unnecessary source file
The routines in this file are dregs from a very early copy of the math API.
There are no Go prototypes and no non-amd64 implementations.
変更の背景
このコミットの背景には、Go言語のmath
パッケージにおけるコードベースの整理と、不要なレガシーコードの削除があります。コミットメッセージによると、削除されたfltasm_amd64.s
ファイルに含まれるルーチンは、「非常に初期のmath
APIの残骸(dregs)」であり、以下の2つの主要な理由から不要と判断されました。
- Goプロトタイプが存在しない: これらのアセンブリルーチンに対応するGo言語の関数宣言(プロトタイプ)が存在しなかったため、Goコードから直接呼び出されることがありませんでした。これは、これらのルーチンがGoの標準ライブラリの一部として意図的に使用されていなかったことを示唆しています。
- 非AMD64実装が存在しない: このファイルは
fltasm_amd64.s
という名前が示す通り、AMD64アーキテクチャ専用のアセンブリコードでした。他のアーキテクチャ(ARM, x86など)向けの実装が存在しなかったため、クロスプラットフォーム対応のGo言語においては、その有用性が限定的でした。
これらの理由から、このファイルはGoのmath
パッケージにとって冗長であり、メンテナンスの負担となる不要なコードと見なされ、削除が決定されました。これは、Go言語の設計哲学である「シンプルさ」と「効率性」に沿った変更と言えます。
前提知識の解説
このコミットを理解するためには、以下の技術的な概念について知っておく必要があります。
1. 浮動小数点演算とFPU (Floating-Point Unit)
浮動小数点演算は、実数をコンピュータで表現し計算するための方法です。CPUには、これらの演算を高速に処理するための専用のハードウェアである浮動小数点演算ユニット(FPU)が搭載されています。IntelおよびAMDのx86-64アーキテクチャでは、FPUはCPUコアに統合されており、SSE(Streaming SIMD Extensions)やAVX(Advanced Vector Extensions)などの命令セットを通じて浮動小数点演算が実行されます。
2. FPU制御レジスタ (FPU Control Word / MXCSR)
FPUの動作は、特定の制御レジスタによって設定されます。
- FPU Control Word (FCW): x87 FPU(レガシーな浮動小数点コプロセッサ)の動作を制御する16ビットレジスタです。丸めモード、精度制御、例外マスクなどが設定されます。
- MXCSR (Media eXtension Control and Status Register): SSE/SSE2以降のSIMD浮動小数点演算の動作を制御する32ビットレジスタです。こちらも丸めモード、例外マスク、デノーマル数(denormal numbers)の処理方法などが設定されます。現代のGo言語の浮動小数点演算は主にSSE/AVXを使用するため、MXCSRがより重要です。
これらのレジスタを操作することで、浮動小数点演算の振る舞い(例:丸め誤差の処理、特定の例外の有効/無効化)を細かく制御できます。
3. アセンブリ言語 (.s
ファイル)
Go言語のソースコードには、.go
ファイルだけでなく、アセンブリ言語で書かれた.s
ファイルが含まれることがあります。これは、特定のアーキテクチャに特化した最適化、ハードウェアレジスタへの直接アクセス、またはGo言語では直接表現できない低レベルな操作を行うために使用されます。GoのアセンブリはPlan 9アセンブラの文法に基づいており、一般的なIntel構文とは異なります。
4. Go言語のビルドプロセスとクロスコンパイル
Go言語は、異なるCPUアーキテクチャやオペレーティングシステム向けにバイナリを生成するクロスコンパイルを強力にサポートしています。そのため、特定のアーキテクチャに依存するアセンブリコードは、そのアーキテクチャ向けにのみビルドされ、他のアーキテクチャでは無視されるか、Goで書かれた代替実装が使用されます。
5. NOSPLIT
とSB
、FP
Goのアセンブリにおけるキーワードです。
NOSPLIT
: 関数がスタックを分割しないことを示します。これは、非常に短い関数や、スタックの成長を厳密に制御する必要がある場合に用いられます。SB
(Static Base): グローバルシンボルや外部シンボルを参照するための擬似レジスタです。FP
(Frame Pointer): 関数の引数やローカル変数を参照するための擬似レジスタです。
技術的詳細
削除されたfltasm_amd64.s
ファイルには、以下の4つのアセンブリルーチンが含まれていました。これらはすべてAMD64アーキテクチャに特化しており、浮動小数点制御レジスタ(MXCSR)を操作するものでした。
-
TEXT ·SetFPControl(SB), NOSPLIT, $8
:- このルーチンは、浮動小数点制御ワードを設定します。
MOVL p+0(FP), DI
: 引数p
(Goの関数呼び出し規約ではスタック上のFP
からのオフセットでアクセス)をDI
レジスタにロードします。このp
が新しい制御ワードの値です。XORL $(0x3F<<7), DI
とANDL $0xFFC0, DI
: これは、入力値DI
から特定のビットマスクをクリアし、別のビットマスクを適用することで、MXCSRレジスタの特定のフィールド(おそらく例外マスクや丸めモード)を準備しています。WAIT
: FPU命令が完了するのを待ちます。STMXCSR 0(SP)
: 現在のMXCSRレジスタの値をスタックポインタSP
が指すメモリ位置に保存します。MOVL 0(SP), AX
,ANDL $~0x3F, AX
,ORL DI, AX
,MOVL AX, 0(SP)
: 保存したMXCSR値の一部をクリアし、新しい制御ワードの一部をOR演算で結合し、それを再びスタックに保存します。LDMXCSR 0(SP)
: スタックに保存された新しい値をMXCSRレジスタにロードします。これにより、FPUの制御設定が変更されます。RET
: 関数から戻ります。
-
TEXT ·GetFPControl(SB), NOSPLIT, $0
:- このルーチンは、現在の浮動小数点制御ワードを取得します。
WAIT
: FPU命令が完了するのを待ちます。STMXCSR 0(SP)
: 現在のMXCSRレジスタの値をスタックに保存します。MOVWLZX 0(SP), AX
: スタックからMXCSR値をAX
レジスタにロードし、ゼロ拡張します。ANDL $0xFFC0, AX
とXORL $(0x3F<<7), AX
: MXCSR値から特定のビットフィールドを抽出し、XOR演算で変換しています。これは、おそらく特定のビットを反転させることで、GoのAPIが期待する形式に変換していると考えられます。MOVL AX, ret+0(FP)
: 変換された値を戻り値としてスタックに保存します。RET
: 関数から戻ります。
-
TEXT ·SetFPStatus(SB), $0
:- このルーチンは、浮動小数点ステータスワードを設定します。
MOVL p+0(FP), DI
: 引数p
をDI
レジスタにロードします。ANDL $0x3F, DI
: 入力値DI
から特定のビットマスクを抽出します。これは、MXCSRレジスタのステータス部分(例外フラグなど)に対応すると考えられます。WAIT
,STMXCSR 0(SP)
,MOVL 0(SP), AX
,ANDL $~0x3F, AX
,ORL DI, AX
,MOVL AX, 0(SP)
,LDMXCSR 0(SP)
:SetFPControl
と同様に、MXCSRレジスタのステータス部分を更新します。
-
TEXT ·GetFPStatus(SB), $0
:- このルーチンは、現在の浮動小数点ステータスワードを取得します。
WAIT
,STMXCSR 0(SP)
: MXCSRレジスタの値をスタックに保存します。MOVL 0(SP), AX
: スタックからMXCSR値をAX
レジスタにロードします。ANDL $0x3F, AX
: MXCSR値から特定のビットマスクを抽出します。これは、ステータスフラグのみを抽出していると考えられます。MOVL AX, ret+0(FP)
: 抽出された値を戻り値としてスタックに保存します。RET
: 関数から戻ります。
これらのルーチンは、Go言語の初期段階で、C言語のライブラリや他のシステムから移植された際に、浮動小数点環境を細かく制御するために一時的に導入されたものと考えられます。しかし、Go言語の進化とともに、これらの低レベルなFPU制御はGoの標準ライブラリの外部で管理されるか、より高レベルな抽象化によって不要になったため、削除されました。特に、Goのランタイムやコンパイラが浮動小数点演算の環境を適切に設定するようになり、アプリケーションレベルでこれらのレジスタを直接操作する必要がなくなったことが背景にあるでしょう。
コアとなるコードの変更箇所
このコミットによる変更は、単一のファイル削除です。
--- a/src/pkg/math/fltasm_amd64.s
+++ /dev/null
@@ -1,69 +0,0 @@
-// Derived from Inferno's libkern/getfcr-amd64.s
-// http://code.google.com/p/inferno-os/source/browse/libkern/getfcr-amd64.s
-//
-// Copyright © 1994-1999 Lucent Technologies Inc. All rights reserved.
-// Revisions Copyright © 2000-2007 Vita Nuova Holdings Limited (www.vitanuova.com). All rights reserved.\n-// Portions Copyright 2009 The Go Authors. All rights reserved.\n-//\n-// Permission is hereby granted, free of charge, to any person obtaining a copy\n-// of this software and associated documentation files (the "Software"), to deal\n-// in the Software without restriction, including without limitation the rights\n-// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n-// copies of the Software, and to permit persons to whom the Software is\n-// furnished to do so, subject to the following conditions:\n-//\n-// The above copyright notice and this permission notice shall be included in\n-// all copies or substantial portions of the Software.\n-//\n-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n-// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n-// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n-// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n-// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n-// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n-// THE SOFTWARE.\n-\n-#include "../../cmd/ld/textflag.h"\n-\n-TEXT ·SetFPControl(SB), NOSPLIT, $8\n-\t// Set new\n-\tMOVL p+0(FP), DI\n-\tXORL $(0x3F<<7), DI\n-\tANDL $0xFFC0, DI\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $~0x3F, AX\n-\tORL DI, AX\n-\tMOVL AX, 0(SP)\n-\tLDMXCSR 0(SP)\n-\tRET\n-\n-TEXT ·GetFPControl(SB), NOSPLIT, $0\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVWLZX 0(SP), AX\n-\tANDL $0xFFC0, AX\n-\tXORL $(0x3F<<7), AX\n-\tMOVL AX, ret+0(FP)\n-\tRET\n-\n-TEXT ·SetFPStatus(SB), $0\n-\tMOVL p+0(FP), DI\n-\tANDL $0x3F, DI\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $~0x3F, AX\n-\tORL DI, AX\n-\tMOVL AX, 0(SP)\n-\tLDMXCSR 0(SP)\n-\tRET\n-\n-TEXT ·GetFPStatus(SB), $0\n-\tWAIT\n-\tSTMXCSR 0(SP)\n-\tMOVL 0(SP), AX\n-\tANDL $0x3F, AX\n-\tMOVL AX, ret+0(FP)\n-\tRET
コアとなるコードの解説
このコミットは、src/pkg/math/fltasm_amd64.s
ファイルを完全に削除しています。このファイルは、前述の通り、AMD64アーキテクチャ向けの浮動小数点制御レジスタ操作を行うアセンブリルーチンを含んでいました。
ファイルの削除は、Go言語のmath
パッケージからこれらの低レベルなFPU制御機能が不要になったことを意味します。これは、Goランタイムが浮動小数点環境を適切に管理するようになったか、またはこれらの機能がGoの標準ライブラリの範囲外で処理されるようになったためと考えられます。
この変更により、Goのmath
パッケージはよりクリーンになり、不要なアーキテクチャ固有のアセンブリコードが取り除かれました。これにより、コードベースの保守性が向上し、Go言語のクロスプラットフォームな性質がさらに強化されます。
関連リンク
- Go言語の
math
パッケージ: https://pkg.go.dev/math - Go言語のアセンブリ: https://go.dev/doc/asm
- Intel 64 and IA-32 Architectures Software Developer's Manuals (FPU/SSE/MXCSRに関する詳細情報): https://www.intel.com/content/www/us/en/developer/articles/technical/intel-sdm.html
参考にした情報源リンク
- コミットメッセージ自体
- Go言語の公式ドキュメント
- Intelのソフトウェア開発者マニュアル (FPU/SSE/MXCSRに関する一般的な知識)
- Inferno OSのソースコード (削除されたファイルのコメントに記載されている派生元)
- Go言語のコードレビューシステム (Gerrit) のCLリンク: https://golang.org/cl/15750046 (これはコミットメッセージに記載されています)
- 一般的な浮動小数点演算とCPUアーキテクチャに関する知識