This is a collection of Intel®’ IA32® Software Developer's Manuals (URL of the day) and AMD' AMD64 Architecture Programmer's Manual together with the related specifications, application notes, white papers, and change logs. The collection aims to keep all available revisions. It was originally created by Michal Necasek, see OS/2 Museum.

If you have a public document, related to the IA32® specifications and missing from the collection, please mail it to me. The content of this URL and all sub-ULRs is available for convenient bulk download by rsync x86docs password "" (empty).

SUBPT -- A64

SUBPT

Subtract checked pointer

This instruction subtracts an optionally-shifted register value from a base address register value, and writes the result to the destination register. The optionally-shifted register value is treated as the offset.

If the operation would have generated a result where the most significant 8 bits of the result register differ from the most significant 8 bits of the base register, then the result is modified such that it is likely to be non-canonical when used as an address.

Integer
(FEAT_CPA)

313029282726252423222120191817161514131211109876543210
11011010000Rm001imm3RnRd
sfopS

Encoding

SUBPT <Xd|SP>, <Xn|SP>, <Xm>{, LSL #<amount>}

Decode for this encoding

if !IsFeatureImplemented(FEAT_CPA) then EndOfDecode(Decode_UNDEF); end; let d : integer{} = UInt(Rd); let n : integer{} = UInt(Rn); let m : integer{} = UInt(Rm); let shift : integer = UInt(imm3);

Assembler Symbols

<Xd|SP>

Is the 64-bit name of the general-purpose destination register or stack pointer, encoded in the "Rd" field.

<Xn|SP>

Is the 64-bit name of the first general-purpose source register or stack pointer, encoded in the "Rn" field.

<Xm>

Is the 64-bit name of the second general-purpose source register, encoded in the "Rm" field.

<amount>

Is the left shift amount, in the range 0 to 7, defaulting to 0, encoded in the "imm3" field.

Operation

var result : bits(64); let base : bits(64) = if n == 31 then SP{64}() else X{64}(n); let offset : bits(64) = LSL(X{64}(m), shift); result = base - offset; result = PointerAddCheck(result, base); if d == 31 then SP{64}() = result; else X{64}(d) = result; end;


2026-03_rel 2026-03-26 20:48:11

Copyright © 2010-2026 Arm Limited or its affiliates. All rights reserved. This document is Non-Confidential.