JavaScript is required to for searching.
ナビゲーションリンクをスキップ
印刷ビューの終了
Oracle Solaris Studio 12.3: C ユーザーガイド     Oracle Solaris Studio 12.3 Information Library (日本語)
search filter icon
search icon

ドキュメントの情報

はじめに

1.  C コンパイラの紹介

2.  C コンパイラ実装に固有の情報

3.  C コードの並列化

4.  lint ソースコード検査プログラム

5.  型に基づく別名解析

6.  ISO C への移行

7.  64 ビット環境に対応するアプリケーションへの変換

8.  cscope: 対話的な C プログラムの検査

A.  機能別コンパイラオプション

B.  C コンパイラオプションリファレンス

C.  ISO/IEC C 99 の処理系定義の動作

D.  C99 の機能

E.  ISO/IEC C90 の処理系定義の動作

F.  ISO C データ表現

F.1 記憶装置の割り当て

F.2 データ表現

F.2.1 整数表現

F.2.2 浮動小数点表現

F.2.3 極値表現

F.2.4 重要な数の 16 進数表現

F.2.5 ポインタ表現

F.2.6 配列の格納

F.2.7 極値の算術演算

F.3 引数を渡す仕組み

F.3.1 32 ビット SPARC

F.3.2 64 ビット SPARC

F.3.3 x86/x64

G.  パフォーマンスチューニング

H.  Oracle Solaris Studio C: K&R C と ISO C の違い

索引

F.3 引数を渡す仕組み

本節では ISO C における引数の渡し方について説明します。

F.3.1 32 ビット SPARC

関数は integer 型の結果をレジスタ %o0 に返します。float 型の結果はレジスタ %f0 に、double 型の結果はレジスタ %f0%f1 に返します。

long long 型 整数は上位ワードは %oN 下位ワードは %o(N+1) というようにレジスタに渡されます。 レジスタ内の結果は同様の順序で %o0%o1 に返されます。

double および long double を除くすべての引数は 4 バイトの値として渡されます。double は 8 バイトの値として渡されます。先頭 6 個の 4 バイト値 (double を 8 と数える) は %o0 から %o5 までのレジスタに渡されます。残りはスタック経由で渡されます。構造体の場合は、構造体のコピーが作成され、ポインタがそのコピーに渡されます。long double は構造体と同様に渡されます。

前述のレジスタは、呼び出し側から見えます。

F.3.2 64 ビット SPARC

すべての整数の引数は、8 バイト値として引き渡されます。

浮動小数点引数は可能なかぎり、浮動小数点レジスタに渡されます。

F.3.3 x86/x64

Intel 386 psABI および AMD64 psABI を遵守しています。

関数は次のレジスタで結果を返します。

表 F-21 型を返すために x86 関数が使用するレジスタ (-m32)

返される型
レジスタ
int
%eax
long long
%edx%eax
floatdoublelong double
%st(0)
float _Complex
%eax (実数部) と %edx (虚数部)
double _Complexlong double _Complex
対応する浮動小数点型の 2 つの要素を含む構造体と同じ

詳細は、http://www.x86-64.org/documentation/abi.pdfで AMD64 psABI についての説明を参照してください。

structunionlong longdoublelong double を除くすべての引数は 4 バイト値として渡されます。long long は 8 バイト値として渡されます、double は 8 バイト値として渡されます、また long double は 12 バイト値として渡されます。

structunion はスタックにコピーされます。サイズは 4 の倍数バイトに丸められます。structunion を返す関数は、その structunion を格納する場所を指す隠された最初の引数に渡されます。

関数から戻ったあと、呼び出された関数によってポップされる structunion の余分な引数を除き、スタックから引数をポップするのは呼び出し側の責任です。