9.48.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.