CoqToLeanAsm: x86 Macro Assembler in Lean 4

7.5. Arithmetic Operations

Binary operations use BinOp:

X86.BinOp.ADD : BinOp#check BinOp.ADD -- Addition X86.BinOp.SUB : BinOp#check BinOp.SUB -- Subtraction X86.BinOp.AND : BinOp#check BinOp.AND -- Bitwise AND X86.BinOp.OR : BinOp#check BinOp.OR -- Bitwise OR X86.BinOp.XOR : BinOp#check BinOp.XOR -- Bitwise XOR X86.BinOp.CMP : BinOp#check BinOp.CMP -- Compare (SUB without storing result) X86.BinOp.ADC : BinOp#check BinOp.ADC -- Add with carry X86.BinOp.SBB : BinOp#check BinOp.SBB -- Subtract with borrow

Examples:

Instr.BOP OpSize.Op32 BinOp.ADD (DstSrc.RR EAX EBX) : Instr#check Instr.BOP OpSize.Op32 BinOp.ADD (DstSrc.RR EAX EBX) -- SUB EAX, 10 Instr.BOP OpSize.Op32 BinOp.SUB (DstSrc.RI EAX 10) : Instr#check Instr.BOP OpSize.Op32 BinOp.SUB (DstSrc.RI EAX 10) -- XOR EAX, EAX (zero a register) Instr.BOP OpSize.Op32 BinOp.XOR (DstSrc.RR EAX EAX) : Instr#check Instr.BOP OpSize.Op32 BinOp.XOR (DstSrc.RR EAX EAX)

Unary operations use UnaryOp:

Instr.UOP OpSize.Op32 UnaryOp.INC (RegMem.R ECX) : Instr#check Instr.UOP OpSize.Op32 UnaryOp.INC (RegMem.R ECX) -- DEC ECX Instr.UOP OpSize.Op32 UnaryOp.DEC (RegMem.R ECX) : Instr#check Instr.UOP OpSize.Op32 UnaryOp.DEC (RegMem.R ECX) -- NEG EAX (two's complement) Instr.UOP OpSize.Op32 UnaryOp.NEG (RegMem.R EAX) : Instr#check Instr.UOP OpSize.Op32 UnaryOp.NEG (RegMem.R EAX)