LDREX と STREX

排他的レジスタロード/ストア命令です。

Show/hide構文

LDREX{cond} Rt, [Rn {, #offset}]
STREX{cond} Rd, Rt, [Rn {, #offset}]
LDREXB{cond} Rt, [Rn]
STREXB{cond} Rd, Rt, [Rn]
LDREXH{cond} Rt, [Rn]
STREXH{cond} Rd, Rt, [Rn]
LDREXD{cond} Rt, Rt2, [Rn]
STREXD{cond} Rd, Rt, Rt2, [Rn]

各項目には以下の意味があります。

cond

任意の条件コードを指定します。

Rd

復帰ステータスのデスティネーションレジスタを指定します。

Rt

ロードまたはストアするレジスタを指定します。

Rt2

ダブルワードのロードとストアに使用する 2 番目のレジスタを指定します。

Rn

メモリアドレスのベースとなるレジスタを指定します。

offset

Rn の値に適用される任意のオフセットを指定します。offset は T32 命令でのみ使用可能です。offset を省略した場合、オフセットは 0 として処理されます。

Show/hideLDREX

LDREX は、メモリからデータをロードします。

  • 物理アドレスに共有 TLB 属性が設定されている場合、LDREX は、その物理アドレスに現在のプロセッサの排他的アクセスを示すタグを付け、他の物理アドレスに対するこのプロセッサの排他的アクセスタグをクリアします。

  • 共有 TLB 属性が設定されていない場合、LDREX は、実行中のプロセッサがまだアクセスしていないタグ付きの物理アドレスがあることを示すタグを付けます。

Show/hideSTREX

STREX は、メモリへの条件付きストアを実行します。条件を以下に示します。

  • 物理アドレスに共有 TLB 属性が設定されておらず、実行中のプロセッサによってまだアクセスされていないタグ付きの物理アドレスが存在する場合は、この命令によるストアが実行され、タグがクリアされて、Rd に 0 が戻ります。

  • 物理アドレスに共有 TLB 属性が設定されておらず、実行中のプロセッサによってアクセスされていないタグ付きの物理アドレスが存在しない場合は、ストアは発生せず、Rd に 1 が戻ります。

  • 物理アドレスに共有 TLB 属性が設定されており、その物理アドレスに実行中のプロセッサによる排他的アクセスのタグが付けられている場合は、ストアが発生してタグがクリアされ、Rd に 0 が戻ります。

  • 物理アドレスに共有 TLB 属性が設定されており、その物理アドレスに実行中のプロセッサによる排他的アクセスのタグが付けられていない場合は、ストアは発生せず、Rd に 1 が戻ります。

Show/hide制約条件

RdRtRt2Rn のいずれにも PC は指定できません。

STREX では、RdRtRt2、または Rn と同じレジスタは指定できません。

A32 命令には、以下の制約条件が適用されます。

  • SP は使用できますが、RdRtRt2 のいずれかでの SP の使用は非推奨です。

  • LDREXD および STREXD では、Rt に偶数番号のレジスタ(LR 以外)を指定する必要があります。

  • Rt2R(t+1) であることが必要です。

  • オフセットは使用できません。

T32 命令には、以下の制約条件が適用されます。

  • SP は Rn に使用できますが、RdRt、または Rt2 のいずれにも指定できません。

  • LDREXD では、RtRt2 に同じレジスタは指定できません。

  • offset には、0 ~ 1020 の範囲内にある 4 の倍数を指定できます。

Show/hide使用法

LDREX 命令と STREX 命令を使用して、マルチプロセッサの共有メモリシステムでプロセス間通信を実装できます。

パフォーマンス上の理由から、対応する LDREX 命令と STREX 命令の間に記述する命令の数は最小限に抑えて下さい。

Note

STREX 命令で使用されるアドレスは、直前に実行された LDREX 命令で使用されたアドレスと同一である必要があります。

Show/hide可用性

これらの 32 ビット命令はすべて、A32 および T32 で使用できます。

これらの命令の 16 ビットバージョンはありません。

Show/hide

    MOV r1, #0x1                ; ロック取得値をロードする
try
    LDREX r0, [LockAddr]        ; ロック値をロードする
    CMP r0, #0                  ; ロックフリーかどうか
    STREXEQ r0, r1, [LockAddr]  ; ロックの取得を試みる
    CMPEQ r0, #0                ; 成功したかどうか
    BNE try                     ; 失敗した場合は再試行する
    ....                        ; 成功した場合はロック取得済み

Show/hide関連項目

Copyright © 2014 ARM. All rights reserved.ARM DUI 0802AJ
Non-ConfidentialID061814