1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300
|
@c Copyright (C) 1991-2020 Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@ifset GENERIC
@page
@node OpenRISC-Dependent
@chapter OPENRISC Dependent Features
@end ifset
@ifclear GENERIC
@node Machine Dependencies
@chapter OPENRISC Dependent Features
@end ifclear
@cindex OPENRISC support
@menu
* OpenRISC-Syntax:: Syntax
* OpenRISC-Float:: Floating Point
* OpenRISC-Directives:: OpenRISC Machine Directives
* OpenRISC-Opcodes:: Opcodes
@end menu
@cindex OPENRISC syntax
@cindex syntax, OPENRISC
@node OpenRISC-Syntax
@section OpenRISC Syntax
The assembler syntax follows the OpenRISC 1000 Architecture Manual.
@menu
* OpenRISC-Chars:: Special Characters
* OpenRISC-Regs:: Register Names
* OpenRISC-Relocs:: Relocations
@end menu
@node OpenRISC-Chars
@subsection Special Characters
@cindex line comment character, OpenRISC
@cindex OpenRISC line comment character
A @samp{#} character appearing anywhere on a line indicates the start
of a comment that extends to the end of that line.
@cindex line separator, OpenRISC
@cindex statement separator, OpenRISC
@cindex OpenRISC line separator
@samp{;} can be used instead of a newline to separate statements.
@node OpenRISC-Regs
@subsection Register Names
@cindex OpenRISC registers
@cindex register names, OpenRISC
The OpenRISC register file contains 32 general pupose registers.
@itemize @bullet
@item
The 32 general purpose registers are referred to as @samp{r@var{n}}.
@item
The stack pointer register @samp{r1} can be referenced using the alias
@samp{sp}.
@item
The frame pointer register @samp{r2} can be referenced using the alias
@samp{fp}.
@item
The link register @samp{r9} can be referenced using the alias @samp{lr}.
@end itemize
Floating point operations use the same general purpose registers. The
instructions @code{lf.itof.s} (single precision) and @code{lf.itof.d} (double
precision) can be used to convert integer values to floating point.
Likewise, instructions @code{lf.ftoi.s} (single precision) and
@code{lf.ftoi.d} (double precision) can be used to convert floating point to
integer.
OpenRISC also contains privileged special purpose registers (SPRs). The
SPRs are accessed using the @code{l.mfspr} and @code{l.mtspr} instructions.
@node OpenRISC-Relocs
@subsection Relocations
@cindex OpenRISC relocations
@cindex relocations, OpenRISC
ELF relocations are available as defined in the OpenRISC architecture
specification.
@code{R_OR1K_HI_16_IN_INSN} is obtained using @samp{hi} and
@code{R_OR1K_LO_16_IN_INSN} and @code{R_OR1K_SLO16} are obtained using
@samp{lo}. For signed offsets @code{R_OR1K_AHI16} is obtained from
@samp{ha}. For example:
@example
l.movhi r5, hi(symbol)
l.ori r5, r5, lo(symbol)
l.movhi r5, ha(symbol)
l.addi r5, r5, lo(symbol)
@end example
These ``high'' mnemonics extract bits 31:16 of their operand,
and the ``low'' mnemonics extract bits 15:0 of their operand.
The PC relative relocation @code{R_OR1K_GOTPC_HI16} can be obtained by
enclosing an operand inside of @samp{gotpchi}. Likewise, the
@code{R_OR1K_GOTPC_LO16} relocation can be obtained using @samp{gotpclo}.
These are mostly used when assembling PIC code. For example, the
standard PIC sequence on OpenRISC to get the base of the global offset
table, PC relative, into a register, can be performed as:
@example
l.jal 0x8
l.movhi r17, gotpchi(_GLOBAL_OFFSET_TABLE_-4)
l.ori r17, r17, gotpclo(_GLOBAL_OFFSET_TABLE_+0)
l.add r17, r17, r9
@end example
Several relocations exist to allow the link editor to perform GOT data
references. The @code{R_OR1K_GOT16} relocation can obtained by enclosing an
operand inside of @samp{got}. For example, assuming the GOT base is in
register @code{r17}.
@example
l.lwz r19, got(a)(r17)
l.lwz r21, 0(r19)
@end example
Also, several relocations exist for local GOT references. The
@code{R_OR1K_GOTOFF_AHI16} relocation can obtained by enclosing an operand
inside of @samp{gotoffha}. Likewise, @code{R_OR1K_GOTOFF_LO16} and
@code{R_OR1K_GOTOFF_SLO16} can be obtained by enclosing an operand inside of
@samp{gotofflo}. For example, assuming the GOT base is in register
@code{rl7}:
@example
l.movhi r19, gotoffha(symbol)
l.add r19, r19, r17
l.lwz r19, gotofflo(symbol)(r19)
@end example
The above PC relative relocations use a @code{l.jal} (jump) instruction
and reading of the link register to load the PC. OpenRISC also supports
page offset PC relative locations without a jump instruction using the
@code{l.adrp} instruction. By default the @code{l.adrp} instruction will
create an @code{R_OR1K_PCREL_PG21} relocation.
Likewise, @code{BFD_RELOC_OR1K_LO13} and @code{BFD_RELOC_OR1K_SLO13} can
be obtained by enclosing an operand inside of @samp{po}. For example:
@example
l.adrp r3, symbol
l.ori r4, r3, po(symbol)
l.lbz r5, po(symbol)(r3)
l.sb po(symbol)(r3), r6
@end example
Likewise the page offset relocations can be used with GOT references. The
relocation @code{R_OR1K_GOT_PG21} can be obtained by enclosing an
@code{l.adrp} immediate operand inside of @samp{got}. Likewise,
@code{R_OR1K_GOT_LO13} can be obtained by enclosing an operand inside of
@samp{gotpo}. For example to load the value of a GOT symbol into register
@samp{r5} we can do:
@example
l.adrp r17, got(_GLOBAL_OFFSET_TABLE_)
l.lwz r5, gotpo(symbol)(r17)
@end example
There are many relocations that can be requested for access to
thread local storage variables. All of the OpenRISC TLS mnemonics
are supported:
@itemize @bullet
@item
@code{R_OR1K_TLS_GD_HI16} is requested using @samp{tlsgdhi}.
@item
@code{R_OR1K_TLS_GD_LO16} is requested using @samp{tlsgdlo}.
@item
@code{R_OR1K_TLS_GD_PG21} is requested using @samp{tldgd}.
@item
@code{R_OR1K_TLS_GD_LO13} is requested using @samp{tlsgdpo}.
@item
@code{R_OR1K_TLS_LDM_HI16} is requested using @samp{tlsldmhi}.
@item
@code{R_OR1K_TLS_LDM_LO16} is requested using @samp{tlsldmlo}.
@item
@code{R_OR1K_TLS_LDM_PG21} is requested using @samp{tldldm}.
@item
@code{R_OR1K_TLS_LDM_LO13} is requested using @samp{tlsldmpo}.
@item
@code{R_OR1K_TLS_LDO_HI16} is requested using @samp{dtpoffhi}.
@item
@code{R_OR1K_TLS_LDO_LO16} is requested using @samp{dtpofflo}.
@item
@code{R_OR1K_TLS_IE_HI16} is requested using @samp{gottpoffhi}.
@item
@code{R_OR1K_TLS_IE_AHI16} is requested using @samp{gottpoffha}.
@item
@code{R_OR1K_TLS_IE_LO16} is requested using @samp{gottpofflo}.
@item
@code{R_OR1K_TLS_IE_PG21} is requested using @samp{gottp}.
@item
@code{R_OR1K_TLS_IE_LO13} is requested using @samp{gottppo}.
@item
@code{R_OR1K_TLS_LE_HI16} is requested using @samp{tpoffhi}.
@item
@code{R_OR1K_TLS_LE_AHI16} is requested using @samp{tpoffha}.
@item
@code{R_OR1K_TLS_LE_LO16} is requested using @samp{tpofflo}.
@item
@code{R_OR1K_TLS_LE_SLO16} also is requested using @samp{tpofflo}
depending on the instruction format.
@end itemize
Here are some example TLS model sequences.
First, General Dynamic:
@example
l.movhi r17, tlsgdhi(symbol)
l.ori r17, r17, tlsgdlo(symbol)
l.add r17, r17, r16
l.or r3, r17, r17
l.jal plt(__tls_get_addr)
l.nop
@end example
Initial Exec:
@example
l.movhi r17, gottpoffhi(symbol)
l.add r17, r17, r16
l.lwz r17, gottpofflo(symbol)(r17)
l.add r17, r17, r10
l.lbs r17, 0(r17)
@end example
And finally, Local Exec:
@example
l.movhi r17, tpoffha(symbol)
l.add r17, r17, r10
l.addi r17, r17, tpofflo(symbol)
l.lbs r17, 0(r17)
@end example
@node OpenRISC-Float
@section Floating Point
@cindex floating point, OPENRISC (@sc{ieee})
@cindex OPENRISC floating point (@sc{ieee})
OpenRISC uses @sc{ieee} floating-point numbers.
@node OpenRISC-Directives
@section OpenRISC Machine Directives
@cindex OPENRISC machine directives
@cindex machine directives, OPENRISC
The OpenRISC version of @code{@value{AS}} supports the following additional
machine directives:
@table @code
@cindex @code{align} directive, OpenRISC
@item .align
This must be followed by the desired alignment in bytes.
@cindex @code{word} directive, OpenRISC
@item .word
On the OpenRISC, the @code{.word} directive produces a 32 bit value.
@cindex @code{nodelay} directive, OpenRISC
@item .nodelay
On the OpenRISC, the @code{.nodelay} directive sets a flag in elf binaries
indicating that the binary is generated catering for no delay slots.
@cindex @code{proc} directive, OpenRISC
@item .proc
This directive is ignored. Any text following it on the same
line is also ignored.
@cindex @code{endproc} directive, OpenRISC
@item .endproc
This directive is ignored. Any text following it on the same
line is also ignored.
@end table
@node OpenRISC-Opcodes
@section Opcodes
@cindex OpenRISC opcode summary
@cindex opcode summary, OpenRISC
@cindex mnemonics, OpenRISC
@cindex instruction summary, LM32
For detailed information on the OpenRISC machine instruction set, see
@url{http://www.openrisc.io/architecture/}.
@code{@value{AS}} implements all the standard OpenRISC opcodes.
|