9.1.4 リターン値の設定、参照に関する規則

リターン値に対する一般的な規則と、リターン値の設定場所について述べます。

(1)

リターン値の型変換

リターン値は、その関数の返す型に変換します。

long f();
long f()
{
    float x;
    return x; // 関数原型にしたがってリターン値はlong型に変換されます。
}

(2)

リターン値の設定場所

関数のリターン値の型によっては、リターン値をレジスタに設定する場合とメモリに設定する場合があります。リターン値の型と設定場所の関係は表 9.3を参照してください。

表 9.3

リターン値の型と設定場所

No.

リターン値の型

リターン値の設定場所

1

singed char, (unsigned)char, (singed)short, unsigned short, (singed)int, unsigned int, (signed)long, unsigned long, float, double*2, long double*2, ポインタ, bool, _Bool, リファレンス, データメンバへのポインタ

R1

但し、signed char, (signed)shortは符号拡張、

(unsigned)char, unsigned shortはゼロ拡張を行った結果を設定

2

double*3, long double*3, (signed)long long, unsigned long long

R1, R2

下位4バイトをR1に、上位4バイトをR2に設定

3

16バイト以内かつ4の倍数であるサイズの構造体、共用体、クラス型

メモリイメージの先頭から4バイトずつR1,R2,R3,R4の順に設定

4

3.以外の構造体、共用体、クラス型

リターン値設定領域(メモリ)*1

注 1.

関数のリターン値をメモリに設定する場合、リターン値はリターン値アドレスの指す領域に設定します。呼び出す側では、引数領域のほかにリターン値設定領域を確保し、そのアドレスをR15に設定してから関数を呼び出します。

注 2.

dbl_size=8を指定しなかった場合です。

注 3.

dbl_size=8を指定した場合です。