#### 9.47.2.3 Symbolic Operand Modifiers

The assembler supports several modifiers when using symbol addresses in TILE-Gx instruction operands. The general syntax is the following:

    modifier(symbol)

The following modifiers are supported:

`hw0`

  This modifier is used to load bits 0-15 of the symbol’s address.

`hw1`

  This modifier is used to load bits 16-31 of the symbol’s address.

`hw2`

  This modifier is used to load bits 32-47 of the symbol’s address.

`hw3`

  This modifier is used to load bits 48-63 of the symbol’s address.

`hw0_last`

  This modifier yields the same value as `hw0`, but it also checks that the value does not overflow.

`hw1_last`

  This modifier yields the same value as `hw1`, but it also checks that the value does not overflow.

`hw2_last`

  This modifier yields the same value as `hw2`, but it also checks that the value does not overflow.

  A 48-bit symbolic value is constructed by using the following idiom:

      moveli r0, hw2_last(sym)
      shl16insli r0, r0, hw1(sym)
      shl16insli r0, r0, hw0(sym)

`hw0_got`

  This modifier is used to load bits 0-15 of the symbol’s offset in the GOT entry corresponding to the symbol.

`hw0_last_got`

  This modifier yields the same value as `hw0_got`, but it also checks that the value does not overflow.

`hw1_last_got`

  This modifier is used to load bits 16-31 of the symbol’s offset in the GOT entry corresponding to the symbol, and it also checks that the value does not overflow.

`plt`

  This modifier is used for function symbols. It causes a procedure linkage table, an array of code stubs, to be created at the time the shared object is created or linked against, together with a global offset table entry. The value is a pc-relative offset to the corresponding stub code in the procedure linkage table. This arrangement causes the run-time symbol resolver to be called to look up and set the value of the symbol the first time the function is called (at latest; depending environment variables). It is only safe to leave the symbol unresolved this way if all references are function calls.

`hw0_plt`

  This modifier is used to load bits 0-15 of the pc-relative address of a plt entry.

`hw1_plt`

  This modifier is used to load bits 16-31 of the pc-relative address of a plt entry.

`hw1_last_plt`

  This modifier yields the same value as `hw1_plt`, but it also checks that the value does not overflow.

`hw2_last_plt`

  This modifier is used to load bits 32-47 of the pc-relative address of a plt entry, and it also checks that the value does not overflow.

`hw0_tls_gd`

  This modifier is used to load bits 0-15 of the offset of the GOT entry of the symbol’s TLS descriptor, to be used for general-dynamic TLS accesses.

`hw0_last_tls_gd`

  This modifier yields the same value as `hw0_tls_gd`, but it also checks that the value does not overflow.

`hw1_last_tls_gd`

  This modifier is used to load bits 16-31 of the offset of the GOT entry of the symbol’s TLS descriptor, to be used for general-dynamic TLS accesses. It also checks that the value does not overflow.

`hw0_tls_ie`

  This modifier is used to load bits 0-15 of the offset of the GOT entry containing the offset of the symbol’s address from the TCB, to be used for initial-exec TLS accesses.

`hw0_last_tls_ie`

  This modifier yields the same value as `hw0_tls_ie`, but it also checks that the value does not overflow.

`hw1_last_tls_ie`

  This modifier is used to load bits 16-31 of the offset of the GOT entry containing the offset of the symbol’s address from the TCB, to be used for initial-exec TLS accesses. It also checks that the value does not overflow.

`hw0_tls_le`

  This modifier is used to load bits 0-15 of the offset of the symbol’s address from the TCB, to be used for local-exec TLS accesses.

`hw0_last_tls_le`

  This modifier yields the same value as `hw0_tls_le`, but it also checks that the value does not overflow.

`hw1_last_tls_le`

  This modifier is used to load bits 16-31 of the offset of the symbol’s address from the TCB, to be used for local-exec TLS accesses. It also checks that the value does not overflow.

`tls_gd_call`

  This modifier is used to tag an instruction as the “call” part of a calling sequence for a TLS GD reference of its operand.

`tls_gd_add`

  This modifier is used to tag an instruction as the “add” part of a calling sequence for a TLS GD reference of its operand.

`tls_ie_load`

  This modifier is used to tag an instruction as the “load” part of a calling sequence for a TLS IE reference of its operand.