Copyright (C) Intel Corporation. All Rights Reserved.
# Notices and Disclaimers
Intel technologies may require enabled hardware, software or service activation.
No product or component can be absolutely secure.
Your costs and results may vary.
All product plans and roadmaps are subject to change without notice.
The products described may contain design defects or errors known as errata which may cause the product to deviate from published specifications. Current characterized errata are available on request.
Intel disclaims all express and implied warranties, including without limitation, the implied warranties of merchantability, fitness for a particular purpose, and non-infringement, as well as any warranty arising from course of performance, course of dealing, or usage in trade.
Code names are used by Intel to identify products, technologies, or services that are in development and not publicly available. These are not “commercial” names and not intended to function as trademarks.
No license (express or implied, by estoppel or otherwise) to any intellectual property rights is granted by this document, with the sole exception that a) you may publish an unmodified copy and b) code, identified as Sample Code in this document is licensed subject to the Zero-Clause BSD open source license (0BSD), [https://opensource.org/licenses/0BSD](https://opensource.org/licenses/0BSD). You may create software implementations based on this document and in compliance with the foregoing that are intended to execute on the Intel product(s) referenced in this document. No rights are granted to create modifications or derivatives of this document.
You may not use or facilitate the use of this document in connection with any infringement or other legal analysis concerning Intel products described herein. You agree to grant Intel a non-exclusive, royalty-free license to any patent claim thereafter drafted which includes subject matter disclosed herein.
If you give Intel any comments or suggestions related to this document or the information contained in it, Intel can use them in any way and disclose them to anyone, without payment or other obligations to you. You represent and warrant that you own, or have sufficient rights from the owner of, any such comments or suggestions, and the intellectual property rights in them, to grant the above permission.
© Intel Corporation. Intel, the Intel logo, and other Intel marks are trademarks of Intel Corporation or its subsidiaries. Other names and brands may be claimed as the property of others.
The code in this file is not 'Sample Code'.
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Sign_Extend(Mem_Fetch?(ip, 8), operand_size);
LockPrefix
#UD
Next_IP := ip + 1;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ opcode[2:0], (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
imm8
result
opcode[2:0]
src
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Sign_Extend(Mem_Fetch?(ip, 8), operand_size);
LockPrefix
#UD
Next_IP := ip + 1;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ opcode[2:0], (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
imm8
result
opcode[2:0]
src
let result := src;
MOVDQ2Q
MOVNTDQ
MOVNTDQA
MOVNTI
MOVNTPD
MOVNTPS
MOVNTQ
MOVQ2DQ
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Sign_Extend(Mem_Fetch?(ip, 8), operand_size);
LockPrefix
#UD
Next_IP := ip + 1;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
imm8
result
ModRM:r/m
src
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Sign_Extend(Mem_Fetch?(ip, 8), operand_size);
LockPrefix
#UD
Next_IP := ip + 1;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, 8), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + 1);
LockPrefix
#UD
Next_IP := next_ip0 + 1;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
imm8
result
ModRM:r/m
src
Std::Integer::Add
Std::Integer::Le
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Sign_Extend(Mem_Fetch?(ip, operand_size), operand_size);
LockPrefix
#UD
Next_IP := ip + (operand_size / 8);
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ opcode[2:0], result);
rv
immv
result
opcode[2:0]
src
Std::Integer::Add
Std::Integer::Le
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Sign_Extend(Mem_Fetch?(ip, operand_size), operand_size);
LockPrefix
#UD
Next_IP := ip + (operand_size / 8);
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ opcode[2:0], result);
rv
immv
result
opcode[2:0]
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Add
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Sign_Extend(Mem_Fetch?(ip, Min(operand_size, 32)), operand_size);
LockPrefix
#UD
Next_IP := ip + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv
immz
result
ModRM:r/m
src
Std::Integer::Add
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Append
Std::Bits::Sign_Extend
Mem_Fetch
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Sign_Extend(Mem_Fetch?(ip, Min(operand_size, 32)), operand_size);
LockPrefix
#UD
Next_IP := ip + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Integer::Le
Std::Integer::Min
Std::Integer::Positive_Divide
Std::Bits::Add_int
Std::Bits::Sign_Extend
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Mem_Fetch
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Sign_Extend(Mem_Fetch?(next_ip0, Min(operand_size, 32)), operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0 + (Min(operand_size, 32) / 8));
LockPrefix
#UD
Next_IP := next_ip0 + (Min(operand_size, 32) / 8);
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
immz
result
ModRM:r/m
src
Std::Boolean::Not
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Instr_MOV
AL_write
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
AL := result;
AL
mv
result
src
ModRM:r/m
Std::Boolean::Not
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Instr_MOV
AL_write
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
AL := result;
AL
mv
result
src
ModRM:r/m
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_RAX
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_RAX(result);
AX/EAX/RAX
mv
result
src
ModRM:r/m
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_RAX
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_RAX(result);
AX/EAX/RAX
mv
result
src
ModRM:r/m
Std::Boolean::Not
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Write
Report_Invalid_Opcode
Instr_MOV
AL
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let src := AL;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
AL
result
ModRM:r/m
src
Std::Boolean::Not
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Write
Report_Invalid_Opcode
Instr_MOV
AL
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let src := AL;
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
AL
result
ModRM:r/m
src
Std::Boolean::Not
Std::Integer::Le
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Write
Report_Invalid_Opcode
Instr_MOV
RAX
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let src := RAX[0 +: operand_size];
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
AX/EAX/RAX
result
ModRM:r/m
src
Std::Boolean::Not
Std::Integer::Le
Direct_Memory_Offset
Handle_RIP_Relative_Address
Logical_Mem_Write
Report_Invalid_Opcode
Instr_MOV
RAX
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let (segment, ea_offset, next_ip0) := Direct_Memory_Offset?(address_size, context, ip);
let is_rip_relative := False;
let src := RAX[0 +: operand_size];
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
if not (not context.rex2_prefix_present) then Report_Invalid_Opcode!(); endif;
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
AX/EAX/RAX
result
ModRM:r/m
src
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
rv
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
rv
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv
mv
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv
mv
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
r8
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
r8
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
mv
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r8
mv
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Read_Segment
Report_Invalid_Opcode
Write_GPR
Instr_MOV_from_SEG
Next_IP
let src := Read_Segment(context.rex_r3 ++ reg);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV_from_SEG(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv
Sreg
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Read_Segment
Report_Invalid_Opcode
Write_GPR
Instr_MOV_from_SEG
Next_IP
let src := Read_Segment(context.rex_r3 ++ reg);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV_from_SEG(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv
Sreg
result
ModRM:r/m
src
ModRM:reg
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_Segment
Report_Invalid_Opcode
Instr_MOV_from_SEG
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 16;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_Segment(context.rex_r3 ++ reg);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV_from_SEG(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
Sreg
result
ModRM:r/m
src
ModRM:reg
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_Segment
Report_Invalid_Opcode
Instr_MOV_from_SEG
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 16;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_Segment(context.rex_r3 ++ reg);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV_from_SEG(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv
Sreg
result
ModRM:r/m
src
ModRM:reg
let result := Zero_Extend(src, operand_size);
Std::Bits::Zero_Extend
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Read_GPR8
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Read_GPR8
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR8
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
r82
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
rv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Write
Read_GPR
Report_Invalid_Opcode
Instr_MOV
False
Normal_Alignment
Memory_Type_Unknown
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let src := Read_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, operand_size);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Logical_Mem_Write?(segment, effective_address, result);
mv1
rv2
result
ModRM:r/m
src
ModRM:reg
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Read_GPR8
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Read_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
r82
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Read_GPR8
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
Next_IP
let operand_size := 8;
let src := Read_GPR8(context.rex_b4 ++ context.rex_b3 ++ rm, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present));
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
r82
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Boolean::Strict_Or
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR8
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 8;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR8(context.rex_r4 ++ context.rex_r3 ++ reg, (context.rex_prefix_present or context.rex2_prefix_present or context.vex_prefix_present or context.evex_prefix_present), result);
r81
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, operand_size);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
rv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_GPR
Instr_MOV
Next_IP
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, operand_size);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
rv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
In_64Bit_Mode
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
Mode64
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_GPR
Instr_MOV
False
Memory_Read
Normal_Alignment
Next_IP
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV(operand_size, src);
Write_GPR(context.rex_r4 ++ context.rex_r3 ++ reg, result);
rv1
mv2
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_Segment
Instr_MOV_to_SEG
Next_IP
let operand_size := 16;
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 16);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV_to_SEG(operand_size, src);
Write_Segment?(context.rex_r3 ++ reg, result);
Sreg
r16
result
ModRM:reg
src
ModRM:r/m
Std::Integer::Add
Std::Bits::Append
Read_GPR
Report_Invalid_Opcode
Write_Segment
Instr_MOV_to_SEG
Next_IP
let operand_size := 16;
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 16);
LockPrefix
#UD
Next_IP := ip;
let result := Instr_MOV_to_SEG(operand_size, src);
Write_Segment?(context.rex_r3 ++ reg, result);
Sreg
r16
result
ModRM:reg
src
ModRM:r/m
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_Segment
Instr_MOV_to_SEG
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 16;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV_to_SEG(operand_size, src);
Write_Segment?(context.rex_r3 ++ reg, result);
Sreg
mv
result
ModRM:reg
src
ModRM:r/m
Std::Bits::Append
Effective_Address
Handle_RIP_Relative_Address
Logical_Mem_Read
Report_Invalid_Opcode
Write_Segment
Instr_MOV_to_SEG
False
Memory_Read
Normal_Alignment
Next_IP
let operand_size := 16;
let disp8n := 1;
let (ea_offset, segment, next_ip0, is_rip_relative) := Effective_Address?(address_size, context, mod, rm, disp8n, ip);
let effective_address := Handle_RIP_Relative_Address(address_size, is_rip_relative, ea_offset, next_ip0);
LockPrefix
#UD
let src := Logical_Mem_Read?(segment, effective_address, operand_size);
Next_IP := next_ip0;
let result := Instr_MOV_to_SEG(operand_size, src);
Write_Segment?(context.rex_r3 ++ reg, result);
Sreg
mv
result
ModRM:reg
src
ModRM:r/m
let result := src[0 +: 16];
Std::Integer::Le
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Eq
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
In_64Bit_Mode
Read_CR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_GPR
Instr_MOV_from_CR
CPL
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_CR_ACCESS
let result_size := 32;
let cr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_CR?(context.rex_r4 ++ context.rex_r3 ++ reg);
LockPrefix
#UD
Mode64
#UD
CPL_Not0
#GP
VMX_EVAL(cr_index == 3 and VM_Exec_Controls1().CR3_Store_Exiting == 0b1)
VMEXIT(VMX_EXIT_CR_ACCESS)
VMX_EVAL(cr_index == 8 and VM_Exec_Controls1().CR8_Store_Exiting == 0b1)
VMEXIT(VMX_EXIT_CR_ACCESS)
Next_IP := ip;
let result := Instr_MOV_from_CR(result_size, src, cr_index);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
r32
CR0-8
result
ModRM:r/m
src
ModRM:reg
cr_index
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Eq
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
Read_CR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_GPR
Instr_MOV_from_CR
CPL
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_CR_ACCESS
let result_size := 64;
let cr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_CR?(context.rex_r4 ++ context.rex_r3 ++ reg);
LockPrefix
#UD
CPL_Not0
#GP
VMX_EVAL(cr_index == 3 and VM_Exec_Controls1().CR3_Store_Exiting == 0b1)
VMEXIT(VMX_EXIT_CR_ACCESS)
VMX_EVAL(cr_index == 8 and VM_Exec_Controls1().CR8_Store_Exiting == 0b1)
VMEXIT(VMX_EXIT_CR_ACCESS)
Next_IP := ip;
let result := Instr_MOV_from_CR(result_size, src, cr_index);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
r64
CR0-8
result
ModRM:r/m
src
ModRM:reg
cr_index
Serialize_Instructions();
var result := src[0 +: result_size];
if VMX_Operation_Mode == VMX_Non_Root then
if cr_index == 0 then
let cr0_guest_host_mask := CR0_Guest_Host_Mask[Current_VMCS_Pointer];
let cr0_read_shadow := CR0_Read_Shadow[Current_VMCS_Pointer];
result := (cr0_read_shadow[0 +: result_size] and cr0_guest_host_mask[0 +: result_size])
or (result[0 +: result_size] and not cr0_guest_host_mask[0 +: result_size]);
elsif cr_index == 4 then
let cr4_guest_host_mask := CR4_Guest_Host_Mask[Current_VMCS_Pointer];
let cr4_read_shadow := CR4_Read_Shadow[Current_VMCS_Pointer];
result := (cr4_read_shadow[0 +: result_size] and cr4_guest_host_mask[0 +: result_size])
or (result[0 +: result_size] and not cr4_guest_host_mask[0 +: result_size]);
elsif cr_index == 8 then
if VMX_Operation_Mode == VMX_Non_Root then
if VM_Exec_Controls1().Use_TPR_Shadow == 0b1 then
Unimplemented_Feature("APIC VTPR");
// MOV from CR8. The instruction loads bits 3:0 of its destination operand
// with bits 7:4 of VTPR (see Section 32.1.1).
// Bits 63:4 of the destination operand are cleared.
// result := Zero(60) ++ VTPR[7:4];
endif;
endif;
endif;
endif;
Std::Integer::Eq
Std::Integer::Le
Std::Bits::And
Std::Bits::Eq
Std::Bits::Not
Std::Bits::Or
Serialize_Instructions
Unimplemented_Feature
VM_Exec_Controls1
CR0_Guest_Host_Mask
CR0_Read_Shadow
CR4_Guest_Host_Mask
CR4_Read_Shadow
True
False
Current_VMCS_Pointer
VMX_Operation_Mode
VMX_Non_Root
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Gt
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
Current_Mode
In_64Bit_Mode
Read_DR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_GPR
Instr_MOV_from_DR
Real_Address_Mode
CPL
Virtual_8086_Mode
CR4
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_DR_ACCESS
let result_size := 32;
let dr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_DR?(context.rex_r4 ++ context.rex_r3 ++ reg);
LockPrefix
#UD
Mode64
#UD
ModeV86
#GP
EVAL(dr_index > 7)
#UD
EVAL(CR4.DE == 0b1 and dr_index in {4, 5})
#UD
VMX_EXEC_1(MOV_DR_Exiting == 0b1)
VMEXIT(VMX_EXIT_DR_ACCESS)
EVAL(CPL != 0 and Current_Mode() != Real_Address_Mode)
#GP
Next_IP := ip;
let result := Instr_MOV_from_DR?(result_size, src, dr_index);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
r32
DR0-7
result
ModRM:r/m
src
ModRM:reg
dr_index
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Gt
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
Current_Mode
Read_DR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_GPR
Instr_MOV_from_DR
Real_Address_Mode
CPL
Virtual_8086_Mode
CR4
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_DR_ACCESS
let result_size := 64;
let dr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_DR?(context.rex_r4 ++ context.rex_r3 ++ reg);
LockPrefix
#UD
ModeV86
#GP
EVAL(dr_index > 7)
#UD
EVAL(CR4.DE == 0b1 and dr_index in {4, 5})
#UD
VMX_EXEC_1(MOV_DR_Exiting == 0b1)
VMEXIT(VMX_EXIT_DR_ACCESS)
EVAL(CPL != 0 and Current_Mode() != Real_Address_Mode)
#GP
Next_IP := ip;
let result := Instr_MOV_from_DR?(result_size, src, dr_index);
Write_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, result);
r64
DR0-7
result
ModRM:r/m
src
ModRM:reg
dr_index
if DR7.GD == 0b1 then
DR6.BD := 0b1;
(_, DR6.B) := Get_Instruction_Breakpoint_Match();
DR6.B := DR6.B or Debug_Breakpoints_Matched;
Clear_Debug_Traps();
DR7.GD := 0b0;
Report_Debug_Exception!();
endif;
let result := src[0 +: result_size];
Std::Integer::Le
Std::Bits::Eq
Std::Bits::Or
Clear_Debug_Traps
Get_Instruction_Breakpoint_Match
Report_Debug_Exception
Debug_Breakpoints_Matched
DR6
DR7
Std::Integer::Add
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Zero
In_64Bit_Mode
Read_GPR
Report_General_Protection_Exception
Report_Invalid_Opcode
Write_CR
Instr_MOV_to_CR
CPL
Next_IP
let src_size := 32;
let cr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 32);
LockPrefix
#UD
Mode64
#UD
CPL_Not0
#GP
Next_IP := ip;
let result := Instr_MOV_to_CR?(src_size, src, cr_index);
Write_CR?(context.rex_r4 ++ context.rex_r3 ++ reg, result);
CR0-8
r32
result
ModRM:reg
src
ModRM:r/m
cr_index
Std::Integer::Add
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Zero
Read_GPR
Report_General_Protection_Exception
Report_Invalid_Opcode
Write_CR
Instr_MOV_to_CR
CPL
Next_IP
let src_size := 64;
let cr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 64);
LockPrefix
#UD
CPL_Not0
#GP
Next_IP := ip;
let result := Instr_MOV_to_CR?(src_size, src, cr_index);
Write_CR?(context.rex_r4 ++ context.rex_r3 ++ reg, result);
CR0-8
r64
result
ModRM:reg
src
ModRM:r/m
cr_index
var result := Zero_Extend(src, 64);
case cr_index of
when 0 =>
Serialize_Instructions();
var new_cr0 : CR0_Type := result;
if VMX_Operation_Mode != Outside_VMX_Operation then
if VMX_Operation_Mode == VMX_Non_Root then
let cr0_guest_host_mask := CR0_Guest_Host_Mask[Current_VMCS_Pointer];
let cr0_read_shadow := CR0_Read_Shadow[Current_VMCS_Pointer];
if not Is_Zero(cr0_guest_host_mask and (new_cr0 xor cr0_read_shadow)) then
VM_Exit!(VMX_EXIT_CR_ACCESS);
endif;
new_cr0 := (CR0 and cr0_guest_host_mask) or (new_cr0 and not cr0_guest_host_mask);
endif;
VMX::Check_CR0_Fixed_Bits?(new_cr0);
endif;
if not Is_Zero(new_cr0[63:32]) then
Report_General_Protection_Exception!(Zero(32));
endif;
// General Protection fault is reported if an attempt is made to
// write invalid bit combinations in CR0
if new_cr0.PG == 0b1 and new_cr0.PE == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
if new_cr0.CD == 0b0 and new_cr0.NW == 0b1 then
Report_General_Protection_Exception!(Zero(32));
endif;
if CR4.CET == 0b1 and CR0.WP == 0b1 and new_cr0.WP == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
if In_64Bit_Mode() and new_cr0.PG == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
if Current_Mode() == IA32e_Mode and not In_64Bit_Mode() and CR4.PCIDE == 0b1 and new_cr0.PG == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
// IA-32e mode is enabled and an attempt is made to enable paging prior to enabling
// physical-address extensions (PAE)
if IA32_EFER.LME == 0b1 and CR4.PAE == 0b0 and CR0.PG == 0b0 and new_cr0.PG == 0b1 then
Report_General_Protection_Exception!(Zero(32));
endif;
// If the current CS has the L-bit set on an attempt to activate IA-32e mode
if CS.descriptor.L == 0b1 and IA32_EFER.LME == 0b1 and CR0.PG == 0b0 and new_cr0.PG == 0b1 then
Report_General_Protection_Exception!(Zero(32));
endif;
// The TR contains a 16-bit TSS on an attempt to activate IA-32e mode
if IA32_EFER.LME == 0b1 and CR0.PG == 0b0 and new_cr0.PG == 0b1 and Is_16Bit_Task(TR) then
Report_General_Protection_Exception!(Zero(32));
endif;
if CR4.CET == 0b1 and CR0.WP == 0b1 and new_cr0.WP == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
// todo: reset monitor if paging mode changes
// todo: reload PDPTR cache under certain conditions
// CR0.ET remains set after any load of CR0
// attempts to clear this bit have no impact
new_cr0.ET := 0b1;
IA32_EFER.LMA := Bit(new_cr0.PG == 0b1 and IA32_EFER.LME == 0b1 and CR4.PAE == 0b1);
// attempts to set reserved bits in CR0 are ignored
new_cr0.RESERVED := Zero(53);
result := new_cr0;
when 1 =>
Serialize_Instructions();
when 2 =>
Serialize_Instructions();
when 3 =>
Serialize_Instructions();
if VMX_Operation_Mode == VMX_Non_Root then
VMX::Check_CR3_Target?(result);
endif;
// todo: load of CR3 affect PDPTR cache
if CR4.PCIDE == 0b1 then
// If CR4.PCIDE := 1, Bit 63 of the source operand to MOV to CR3
// determines whether the instruction invalidates entries in the TLBs
// and the paging-structure caches. The instruction does not modify
// bit 63 of CR3, which is reserved and always 0
result[63] := 0b0;
endif;
if not Is_CR3_Value_Valid(result) then
Report_General_Protection_Exception!(Zero(32));
endif;
when 4 =>
Serialize_Instructions();
var new_cr4 : CR4_Type := result;
if VMX_Operation_Mode != Outside_VMX_Operation then
if VMX_Operation_Mode == VMX_Non_Root then
let cr4_guest_host_mask := CR4_Guest_Host_Mask[Current_VMCS_Pointer];
let cr4_read_shadow := CR4_Read_Shadow[Current_VMCS_Pointer];
if not Is_Zero(cr4_guest_host_mask and (new_cr4 xor cr4_read_shadow)) then
VM_Exit!(VMX_EXIT_CR_ACCESS);
endif;
new_cr4 := (CR4 and cr4_guest_host_mask) or (new_cr4 and not cr4_guest_host_mask);
endif;
VMX::Check_CR4_Fixed_Bits?(new_cr4);
endif;
if not Is_Zero(new_cr4.RESERVED) then
Report_General_Protection_Exception!(Zero(32));
endif;
if not CPUID_PAE and new_cr4.PAE == 0b1 then
Report_General_Protection_Exception!(Zero(32));
endif;
if IA32_EFER.LMA == 0b1 then
if CR4.PAE == 0b1 and new_cr4.PAE == 0b0 then
Report_General_Protection_Exception!(Zero(32));
endif;
if CR4.LA57 != new_cr4.LA57 then
Report_General_Protection_Exception!(Zero(32));
endif;
if CR4.PCIDE == 0b0 and new_cr4.PCIDE == 0b1 and not Is_Zero(CR3[11:0]) then
Report_General_Protection_Exception!(Zero(32));
endif;
else
if new_cr4.PCIDE == 0b1 then
Report_General_Protection_Exception!(Zero(32));
endif;
endif;
if not Is_CR4_Value_Valid(new_cr4) then
Report_General_Protection_Exception!(Zero(32));
endif;
IA32_EFER.LMA := Bit(CR0.PG == 0b1 and IA32_EFER.LME == 0b1 and new_cr4.PAE == 0b1);
// Attempts to enable FRED when LMA=0 are ignored
if IA32_EFER.LMA == 0b0 and new_cr4.FRED == 0b1 then
new_cr4.FRED := 0b0;
endif;
result := new_cr4;
when 8 =>
if VMX_Operation_Mode == VMX_Non_Root then
if VM_Exec_Controls1().CR8_Load_Exiting == 0b1 then
VM_Exit!(VMX_EXIT_CR_ACCESS);
endif;
if VM_Exec_Controls1().Use_TPR_Shadow == 0b1 then
Unimplemented_Feature("APIC TPR virtualization");
// VTPR[7:4] := result[3:0];
// perform TPR virtualization
endif;
endif;
// MOV CR* instructions, except for MOV CR8, are serializing instructions.
// MOV CR8 is not architecturally defined as a serializing instruction.
if not Is_Zero(result[63:4]) then
Report_General_Protection_Exception!(Zero(32));
endif;
otherwise =>
Report_Invalid_Opcode!();
endcase;
Std::Boolean::Not
Std::Boolean::Strict_And
Std::Integer::Add
Std::Bits::And
Std::Bits::Eq
Std::Bits::Is_Zero
Std::Bits::Ne
Std::Bits::Not
Std::Bits::Or
Std::Bits::Xor
Std::Bits::Zero_Extend
Std::Bits::Zero
Bit
Current_Mode
In_64Bit_Mode
Is_16Bit_Task
Is_CR3_Value_Valid
Is_CR4_Value_Valid
Report_General_Protection_Exception
Report_Invalid_Opcode
Serialize_Instructions
Unimplemented_Feature
VM_Exec_Controls1
VMX::Check_CR0_Fixed_Bits
VMX::Check_CR3_Target
VMX::Check_CR4_Fixed_Bits
VM_Exit
CR0_Guest_Host_Mask
CR0_Read_Shadow
CR4_Guest_Host_Mask
CR4_Read_Shadow
True
False
CS
CR4
CR0
IA32_EFER
TR
IA32e_Mode
Current_VMCS_Pointer
VMX_Operation_Mode
VMX_Non_Root
CPUID_PAE
CR3
Outside_VMX_Operation
VMX_EXIT_CR_ACCESS
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Gt
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
Current_Mode
In_64Bit_Mode
Read_GPR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_DR
Instr_MOV_to_DR
Real_Address_Mode
CPL
Virtual_8086_Mode
CR4
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_DR_ACCESS
let src_size := 32;
let dr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 32);
LockPrefix
#UD
Mode64
#UD
ModeV86
#GP
EVAL(dr_index > 7)
#UD
EVAL(CR4.DE == 0b1 and dr_index in {4, 5})
#UD
VMX_EXEC_1(MOV_DR_Exiting == 0b1)
VMEXIT(VMX_EXIT_DR_ACCESS)
EVAL(CPL != 0 and Current_Mode() != Real_Address_Mode)
#GP
Next_IP := ip;
let result := Instr_MOV_to_DR?(src_size, src, dr_index);
Write_DR?(context.rex_r4 ++ context.rex_r3 ++ reg, result);
DR0-7
r32
result
ModRM:reg
src
ModRM:r/m
dr_index
Std::Boolean::Strict_And
Std::Integer::Add
Std::Integer::Gt
Std::Integer::Ne
Std::Integer::Power2
Std::Integer::Subtract
Std::Bits::Append
Std::Bits::Unsigned
Std::Bits::Eq
Std::Bits::Zero
Current_Mode
Read_GPR
Report_General_Protection_Exception
Report_Invalid_Opcode
VM_Exec_Controls1
VM_Exit
Write_DR
Instr_MOV_to_DR
Real_Address_Mode
CPL
Virtual_8086_Mode
CR4
VMX_Operation_Mode
VMX_Non_Root
Next_IP
VMX_EXIT_DR_ACCESS
let src_size := 64;
let dr_index := Unsigned(context.rex_r3 ++ reg[2:0]);
let src := Read_GPR(context.rex_b4 ++ context.rex_b3 ++ rm, 64);
LockPrefix
#UD
ModeV86
#GP
EVAL(dr_index > 7)
#UD
EVAL(CR4.DE == 0b1 and dr_index in {4, 5})
#UD
VMX_EXEC_1(MOV_DR_Exiting == 0b1)
VMEXIT(VMX_EXIT_DR_ACCESS)
EVAL(CPL != 0 and Current_Mode() != Real_Address_Mode)
#GP
Next_IP := ip;
let result := Instr_MOV_to_DR?(src_size, src, dr_index);
Write_DR?(context.rex_r4 ++ context.rex_r3 ++ reg, result);
DR0-7
r64
result
ModRM:reg
src
ModRM:r/m
dr_index
if DR7.GD == 0b1 then
DR6.BD := 0b1;
(_, DR6.B) := Get_Instruction_Breakpoint_Match();
DR6.B := DR6.B or Debug_Breakpoints_Matched;
DR7.GD := 0b0;
Report_Debug_Exception!();
endif;
// upper 32 bits of DR4-7 are reserved
if src_size == 64 and dr_index in {4..7} then
if dr_index == 7 and CPUID_TRIGGER_DR_MATCH then
if not Is_Zero(src[63:36]) then Report_General_Protection_Exception!(Zero(32)); endif;
else
if not Is_Zero(src[63:32]) then Report_General_Protection_Exception!(Zero(32)); endif;
endif;
endif;
var result := Zero_Extend(src, 64);
Std::Boolean::Not
Std::Boolean::Strict_And
Std::Integer::Eq
Std::Integer::Lt
Std::Bits::Eq
Std::Bits::Is_Zero
Std::Bits::Or
Std::Bits::Zero_Extend
Std::Bits::Zero
Get_Instruction_Breakpoint_Match
Report_Debug_Exception
Report_General_Protection_Exception
Debug_Breakpoints_Matched
DR6
DR7
CPUID_TRIGGER_DR_MATCH
registers/debug
With a REX prefix in 64-bit mode, attempts to access AH, BH, CH, or DH will instead access SPL, DIL, BPL, or SIL, respectively.
Operand is sign-extended to operand_size bits.