[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

16.6.5 特定の機種用の制約

asm の引数には、可能な限り、汎用の制約文字を使ったほうが良い。 その方が読む人に意味が伝わりやすくなるからだ。 汎用の制約文字では駄目な場合は、色々なアーキテクチャで同じような 意味を持つ制約文字を使うようにする。最も共通して良く使われるのは、 ‘m’ と ‘r’ である。それぞれ、メモリと汎用レジスタを表す。 see section 単純制約 それに、‘I’ が、最も一般的な即値定数の形式を表す文字として使われる。

マシンアーキテクチャ毎に、‘config/machine.h’ というファイルで、 固有の制約を追加定義している。これらの制約は、asm 文だけでなく、 コンパイラ自身の命令の生成に使われる。 このため、制約のうちいくつかは、asm 文に使うにはあまり意味の ないものがある。 制約は以下のマクロ群によって定義される。

REG_CLASS_FROM_LETTER

レジスタクラスの制約(普通は小文字だけである)。

CONST_OK_FOR_LETTER_P

即値定数の制約。ワード長、あるいはそれより短い精度の、非浮動小数点定数 向けである。通常、大文字である。

CONST_DOUBLE_OK_FOR_LETTER_P

即値定数の制約。全ての浮動小数点定数とワード長を越える精度の定数 向けである。通常、大文字である。

EXTRA_CONSTRAINT

レジスタまたはメモリの特別な場合。 このマクロは必須ではなく、少数のマシンでのみ定義されている。

本コンパイラのソースの、読者のマシン向けのマクロ定義を調べるのが、 正しい制約を使っているかどうかを確認するのに一番良い方法である。 とはいうものの、以下に幾つかの特定の機種で使える機種依存の制約を 要約しておく。

ARM family—‘arm.h
f

浮動小数点レジスタ

F

浮動小数点定数 0.0, 0.5, 1.0, 2.0, 3.0, 4.0, 5.0, 10.0 のどれか一つ

G

符号反転したときに制約 ‘F’ を満たす浮動小数点定数

z

FPR-GPR 間移動用の ‘FPMEM’ スタックメモリ

I

データ処理命令の即値オペランドとして有効な整数。 すなわち、0 から 255 の間の整数を 2 の倍数分回転したものである。

J

-4095 〜 4095 の範囲の整数

K

ビット反転(1の補数)したときに制約 ‘I’ を満たす整数

L

符号反転(2の補数)したときに制約 ‘I’ を満たす整数

M

0 〜 32 の範囲の整数

Q

正確なアドレスが一個のレジスタにある場合のメモリ参照 (asm 文の場合には、‘m’ の方が良い)。

R

定数領域に置かれるデータ

S

現在ファイルのテキストセグメント中のシンボル

AMD 29000 family—‘a29k.h
l

ローカルレジスタ 0

b

バイトポインタ(‘BP’)レジスタ

q

Q’ レジスタ

h

特殊目的のレジスタ

A

第一アキュムレータレジスタ

a

他のアキュムレータレジスタ

f

浮動小数点レジスタ

I

0 より大きく、0x100 より小さい定数

J

0 より大きく、0x1000 より小さい定数

K

上位 24 ビットがオン(1)の定数

L

上位 8 ビットがオン(1) の 16 ビット定数

M

上位 16 ビットがオン(1) の 32 ビット定数

N

8ビットに収まる 32ビットの負の定数。

O

定数 0x80000000か、あるいは、29050 の場合は、下位16ビットが 0 である 任意の32ビット定数。

P

8ビットに収まる 16ビットの負の定数。

G
H

浮動小数点定数(asm 文では、代わりに機種独立の ‘E’ か ‘F’ を使うこと。)

IBM RS6000—‘rs6000.h
b

アドレスベースレジスタ

f

浮動小数点レジスタ

h

MQ’, ‘CTR’, ‘LINK’ レジスタ

q

MQ’ レジスタ

c

CTR’ レジスタ

l

LINK’ レジスタ

x

CR’ レジスタ(条件レジスタ)の 0 番

y

CR’ レジスタ(条件レジスタ)

z

FPR-GPR 間転送用の ‘FPMEM’ スタックメモリ

I

符号付きの 16 ビット定数

J

下位16ビットが 0 の定数

K

上位の 16 ビットが 0 の定数

L

マスク用オペランドとして適切な定数

M

31 より大きい定数

N

2 の正確な冪乗

O

ゼロ

P

符号反転したものが符号付き 16 ビット定数になる定数

G

一ワードにつき一回の命令でレジスタにロード可能な浮動小数点定数。

Q

あるレジスタからのオフセットであるメモリオペランド (asm 文の場合は、‘m’ の方が良い)。

R

AIX の TOC エントリ

S

64ビットのマスク・オペランドとして適した定数。

U

System V Release 4 の小データ領域の参照

Intel 386—‘i386.h
q

a’、bcd レジスタ

A

a’、d レジスタ(64ビット int 向け)

f

浮動小数点レジスタ

t

第一(スタックの一番上の)浮動小数点レジスタ

u

第二浮動小数点レジスタ

a

a’ レジスタ

b

b’ レジスタ

c

c’ レジスタ

d

d’ レジスタ

D

di’ レジスタ

S

si’ レジスタ

I

0〜31 の定数(32ビットのシフト用)

J

0〜63 の定数(64ビットのシフト用)

K

0xff

L

0xffff

M

0、1、2、3(lea 命令のシフト数である)

N

0 から 255 の範囲の定数(out 命令用)

G

80387 標準の浮動小数点定数

Intel 960—‘i960.h
f

浮動小数点レジスタ(fp0 から fp3)

l

ローカルレジスタ(r0 から r15)

b

グローバルレジスタ(g0 から g15)

d

任意のローカルまたはグローバルレジスタ

I

0 から 31 の整数

J

0

K

-31 から 0 の整数

G

浮動小数点の 0

H

浮動小数点の 1

MIPS—‘mips.h
d

汎用整数レジスタ

f

浮動小数点レジスタ(もしあれば)

h

Hi’ レジスタ

l

Lo’ レジスタ

x

Hi’ または ‘Lo’ レジスタ

y

汎用整数レジスタ

z

浮動小数点ステータスレジスタ

I

符号付き 16 ビット定数(算術演算命令向け)

J

ゼロ

K

ゼロ拡張された 16 ビット定数(論理命令向け)

L

下位16ビットがゼロの定数(lui でロード可能)

M

32ビット定数のうち、ロードするのに 2 命令必要なもの(‘I’ でも ‘K’ でも ‘L’ でもない定数)

N

負の16ビット定数

O

二の冪乗

P

正の 16 ビット定数

G

浮動小数点のゼロ

Q

一個以上の命令でロード可能なメモリ参照 (asm 文の場合は、‘m’ の方が良い)。

R

一個の命令でロード可能なメモリ参照 (asm 文の場合は、‘m’ の方が良い)。

S

外部 OSF/rose PIC 形式でのメモリ参照 (asm 文の場合は、‘m’ の方が良い)。

Motorola 680x0—‘m68k.h
a

アドレスレジスタ

d

データレジスタ

f

利用可能なら、68881 の浮動小数点レジスタ

x

利用可能なら、Sun の FPA の浮動小数点レジスタ。

y

利用可能なら、Sun の FPA の浮動小数点レジスタの最初の 16 個。

I

1 〜 8 までの整数

J

16 ビットの符号付きの数

K

絶対値が 0x80 より大きい符号付き整数。

L

-8 〜 -1 の整数

M

絶対値が 0x100 より大きい符号付き整数。

G

68881 の定数ではない浮動小数点定数。

H

Sun の FPA で使用可能な浮動小数点定数。

SPARC—‘sparc.h
f

32 ビットまたは 64 ビットの値を保持できる浮動小数点レジスタ。

e

64 ビットまたは 128 ビットの値を保持できる浮動小数点レジスタ。

I

13ビットの符号付き定数

J

ゼロ

K

下位12ビットが 0 の 32ビット定数(sethi 命令でロード可能な 定数)

G

浮動小数点数のゼロ。

H

13 ビットの符号付き定数で、32 ビットまたは 64 ビットに符号拡張される。

Q

1命令でロード可能なメモリ参照(‘m’ の方が、asm 文には もっと適している。)

S

定数、またはメモリアドレス

T

8バイト境界に整合されたメモリアドレス

U

偶数レジスタ


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.