@@ -314,17 +314,35 @@ The immediate argument to `lui` is an integer in the interval [0x0, 0xfffff].
314314Its compressed form, ` c.lui ` , accepts only those in the subintervals [ 0x1, 0x1f] and [ 0xfffe0, 0xfffff] .
315315
316316Load Address
317- -----------------
317+ ------------
318318
319- The following example shows the ` la ` pseudo instruction which
320- is used to load symbol addresses:
319+ The following example shows the ` la ` pseudo instruction which is used to load
320+ symbol addresses using the correct sequence based on whether the code is being
321+ assembled as PIC:
321322
322323``` assembly
323324 la a0, msg + 1
324325```
325326
326- Which generates the following assembler output and relocations
327- for non-PIC as seen by ` objdump ` :
327+ For non-PIC this is an alias for the ` lla ` pseudo instruction documented below.
328+
329+ For PIC this is an alias for the ` lga ` pseudo instruction documented below.
330+
331+ The ` la ` pseudo instruction is the preferred way for getting the address of
332+ variables in assembly unless explicit control over PC-relative or GOT-indirect
333+ addressing is required.
334+
335+ Load Local Address
336+ ------------------
337+
338+ The following example shows the ` lla ` pseudo instruction which is used to load
339+ local symbol addresses:
340+
341+ ``` assembly
342+ lla a0, msg + 1
343+ ```
344+
345+ This generates the following instructions and relocations as seen by ` objdump ` :
328346
329347``` assembly
3303480000000000000000 <.text>:
@@ -334,8 +352,18 @@ for non-PIC as seen by `objdump`:
334352 4: R_RISCV_PCREL_LO12_I .L0
335353```
336354
337- And generates the following assembler output and relocations
338- for PIC as seen by ` objdump ` :
355+ Load Global Address
356+ ------------------
357+
358+ The following example shows the ` lga ` pseudo instruction which is used to load
359+ global symbol addresses:
360+
361+ ``` assembly
362+ lga a0, msg + 1
363+ ```
364+
365+ This generates the following instructions and relocations as seen by ` objdump `
366+ (for RV64; RV32 will use ` lw ` instead of ` ld ` ):
339367
340368``` assembly
3413690000000000000000 <.text>:
@@ -541,7 +569,10 @@ fail_msg:
541569
542570Pseudoinstruction | Base Instruction(s) | Meaning | Comment
543571:----------------------------|:--------------------------------------------------------------|:----------|:--------|
544- la rd, symbol | auipc rd, symbol[ 31:12] ; addi rd, rd, symbol[ 11:0] | Load address
572+ la rd, symbol | auipc rd, symbol[ 31:12] ; addi rd, rd, symbol[ 11:0] | Load address | Without -fPIC
573+ la rd, symbol | auipc rd, symbol@GOT[ 31:12] ; l{w\| d} rd, symbol@GOT[ 11:0] \( rd\) | Load address | With -fPIC
574+ lla rd, symbol | auipc rd, symbol[ 31:12] ; addi rd, rd, symbol[ 11:0] | Load local address
575+ lga rd, symbol | auipc rd, symbol@GOT[ 31:12] ; l{w\| d} rd, symbol@GOT[ 11:0] \( rd\) | Load global address
545576l{b\| h\| w\| d} rd, symbol | auipc rd, symbol[ 31:12] ; l{b\| h\| w\| d} rd, symbol[ 11:0] \( rd\) | Load global
546577s{b\| h\| w\| d} rd, symbol, rt | auipc rt, symbol[ 31:12] ; s{b\| h\| w\| d} rd, symbol[ 11:0] \( rt\) | Store global
547578fl{w\| d} rd, symbol, rt | auipc rt, symbol[ 31:12] ; fl{w\| d} rd, symbol[ 11:0] \( rt\) | Floating-point load global
0 commit comments