@c Copyright (C) 2015-2024 Free Software Foundation, Inc.
@c This is part of the GAS manual.
@c For copying conditions, see the file as.texinfo.
@c man end
@ifset GENERIC
@page
@node PRU-Dependent
@chapter PRU Dependent Features
@end ifset

@cindex PRU support
@menu
* PRU Options::              Options
* PRU Syntax::               Syntax
* PRU Relocations::          Relocations
* PRU Directives::           PRU Machine Directives
* PRU Opcodes::              Opcodes
@end menu

@node PRU Options
@section Options
@cindex PRU options
@cindex options for PRU

@c man begin OPTIONS
@table @gcctabopt

@cindex @code{mlink-relax} command-line option, PRU
@item -mlink-relax
Assume that LD would optimize LDI32 instructions by checking the upper
16 bits of the @var{expression}. If they are all zeros, then LD would
shorten the LDI32 instruction to a single LDI. In such case @code{@value{AS}}
will output DIFF relocations for diff expressions.

@cindex @code{mno-link-relax} command-line option, PRU
@item -mno-link-relax
Assume that LD would not optimize LDI32 instructions. As a consequence,
DIFF relocations will not be emitted.

@cindex @code{mno-warn-regname-label} command-line option, PRU
@item -mno-warn-regname-label
Do not warn if a label name matches a register name. Usually assembler
programmers will want this warning to be emitted. C compilers may want
to turn this off.

@end table
@c man end

@node PRU Syntax
@section Syntax
@menu
* PRU Chars::                Special Characters
@end menu


@node PRU Chars
@subsection Special Characters

@cindex line comment character, PRU
@cindex PRU line comment character
@samp{#} and @samp{;} are the line comment characters.


@node PRU Relocations
@section PRU Machine Relocations

@cindex machine relocations, PRU
@cindex PRU machine relocations

@table @code

@cindex @code{pmem} directive, PRU
@item %pmem(@var{expression})
Convert @var{expression} from byte-address to a
word-address.  In other words, shift right by two.

@item %label(@var{expression})
Mark the given operand as a label. This is useful if you need to jump to
a label that matches a register name.

@smallexample
@group
r1:
    jmp r1		; Will jump to register R1
    jmp %label(r1)	; Will jump to label r1
@end group
@end smallexample

@end table


@node PRU Directives
@section PRU Machine Directives

@cindex machine directives, PRU
@cindex PRU machine directives

@table @code

@cindex @code{align} directive, PRU
@item .align @var{expression} [, @var{expression}]
This is the generic @code{.align} directive, however
this aligns to a power of two.

@cindex @code{word} directive, PRU
@item .word @var{expression}
Create an aligned constant 4 bytes in size.

@cindex @code{dword} directive, PRU
@item .dword @var{expression}
Create an aligned constant 8 bytes in size.

@cindex @code{2byte} directive, PRU
@item .2byte @var{expression}
Create an unaligned constant 2 bytes in size.

@cindex @code{4byte} directive, PRU
@item .4byte @var{expression}
Create an unaligned constant 4 bytes in size.

@cindex @code{8byte} directive, PRU
@item .8byte @var{expression}
Create an unaligned constant 8 bytes in size.

@cindex @code{16byte} directive, PRU
@item .16byte @var{expression}
Create an unaligned constant 16 bytes in size.

@cindex @code{set no_warn_regname_label} directive, PRU
@item .set no_warn_regname_label
Do not output warnings when a label name matches a register name. Equivalent
to passing the @code{-mno-warn-regname-label} command-line option.

@end table

@node PRU Opcodes
@section Opcodes

@cindex PRU opcodes
@cindex opcodes for PRU
@code{@value{AS}} implements all the standard PRU core V3 opcodes in the
original pasm assembler.  Older cores are not supported by @code{@value{AS}}.

GAS also implements the LDI32 pseudo instruction for loading a 32-bit
immediate value into a register.

@smallexample
       ldi32   sp, __stack_top
       ldi32   r14, 0x12345678
@end smallexample
