Intel 64 and IA-32 Architectures Software Developers Manual Volume 2A, Instruction Set Reference, A-M

Vol. 2 3-95
INSTRUCTION SET REFERENCE, A-M
THEN #GP(0); FI;
IF OperandSize
= 32
THEN
Push(CS); (* Padded with 16 high-order bits *)
Push(EIP);
CS DEST(CodeSegmentSelector);
(* Segment descriptor information also loaded *)
CS(RPL) CPL;
EIP tempEIP;
ELSE
IF OperandSize
= 16
THEN
Push(CS);
Push(IP);
CS DEST(CodeSegmentSelector);
(* Segment descriptor information also loaded *)
CS(RPL) CPL;
EIP tempEIP;
ELSE (* OperandSize
= 64 *)
Push(CS); (* Padded with 48 high-order bits *)
Push(RIP);
CS DEST(CodeSegmentSelector);
(* Segment descriptor information also loaded *)
CS(RPL) CPL;
RIP tempEIP;
FI;
FI;
END;
NONCONFORMING-CODE-SEGMENT:
IF L-Bit
= 1 and D-BIT = 1 and IA32_EFER.LMA = 1
THEN GP(new code segment selector); FI;
IF (RPL > CPL) or (DPL
CPL)
THEN #GP(new code segment selector); FI;
IF segment not present
THEN #NP(new code segment selector); FI;
IF stack not large enough for return address
THEN #SS(0); FI;
tempEIP DEST(Offset);
IF OperandSize
= 16
THEN tempEIP tempEIP AND 0000FFFFH; FI; (* Clear upper 16 bits *)
IF (EFER.LMA = 0 or target mode = Compatibility mode) and (tempEIP outside new code
segment limit)
THEN #GP(0); FI;