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-2024 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 purpose 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.
|