4.21 リテラルプールに対するコンパイラサポート

リテラルプールとは、コードセクション内の定数データの領域のことです。

4 バイトの定数を生成できる単一の命令はないため、コンパイラはリテラルプールからそれらの定数をロードするコードを生成します。
以下の例では、コンパイラは整数定数 0xdeadbeef をリテラルプール(*** でマーク)からロードするコードを生成します。
int f(void) {
  return 0xdeadbeef;
}


** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 12 bytes (alignment 4)
    Address: 0x00000000

    $a
    .text
    f
      0x00000000: e59f0000  ....LDR    r0,[pc,#0] ; [0x8] = 0xdeadbeef
      0x00000004: e12fff1e  ../.BX     lr
    $d
      0x00000008: deadbeef  ....DCD  3735928559            ***
リテラルプールを使用する代わりに、MOVW/MOVT の命令ペアでレジスタに定数を生成することができます。
** Section #1 '.text' (SHT_PROGBITS) [SHF_ALLOC + SHF_EXECINSTR]
    Size   : 12 bytes (alignment 4)
    Address: 0x00000000

    $a
    .text
    f
      0x00000000: e30b0eef  ....MOV    r0,#0xbeef
      0x00000004: e34d0ead  ..M.MOVT   r0,#0xdead
      0x00000008: e12fff1e  ../.BX     lr
ほとんどの場合、リテラルプールを生成することによって、パフォーマンスとコードサイズが向上します。ただし、ある特定の状況では、リテラルプールなしでコードを生成するほうが望ましい場合もあります。
以下のコンパイラオプションは、リテラルプールを制御します。
  • --integer_literal_pools
  • --string_literal_pools
  • --branch_tables
  • --float_literal_pools
関連する参考文書
8.108 --integer_literal_pools, --no_integer_literal_pools
8.178 --string_literal_pools、--no_string_literal_pools
8.18 --branch_tables、--no_branch_tables
8.82 --float_literal_pools、--no_float_literal_pools
非機密扱いPDF file icon PDF 版ARM DUI0472LJ
Copyright © 2010-2015 ARM.All rights reserved.