What are the semantics of ADRP and ADRL instructions in ARM assembly? : <p><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802a/ADRP.html" rel="noreferrer">ADRP</a></p>

<blockquote>
  <p>Address of 4KB page at a PC-relative offset.</p>
</blockquote>

<p><a href="http://infocenter.arm.com/help/index.jsp?topic=/com.arm.doc.dui0802b/CIHDDDEI.html" rel="noreferrer">ADRL</a></p>

<blockquote>
  <p>Load a PC-relative address into a register. It is similar to the ADR
  instruction. ADRL can load a wider range of addresses than ADR because
  it generates two data processing instructions.</p>
</blockquote>

<p>Specifically,</p>

<blockquote>
  <p>ADRL assembles to two instructions, an ADRP followed by ADD. If the
  assembler cannot construct the address in two instructions, it
  generates a relocation. The linker then generates the correct offsets.
  ADRL produces position-independent code, because the address is
  calculated relative to PC.</p>
</blockquote>

<p>What do <code>ADRP</code> and <code>ADRL</code> instructions do? More importantly, how does and <code>ADRP</code> followed by an <code>ADD</code> construct a PC-relative address?</p>
