| ||||||||
| ||||||||
| ||||||||
Description | ||||||||
Functions for generating x86 machine code instructions. The functions make use of the code generation monad in module Harpy.CodeGenMonad for emitting binary code into a code buffer. This module is very low-level, since there are different functions for different addressing modes. A more convenient interface is provided in module Harpy.X86Assembler, which uses the operand types to determine the correct addressing modes for all supported instructions. Note: this file does not (yet) provide the complete x86 instruction set, not even all user-mode instructions. For some operations, some addressing modes are missing as well. Copyright notice: The information in this file is based on the header file x86-codegen.h from the mono distribution, which has the following copyright information: * x86-codegen.h: Macros for generating x86 code * * Authors: * Paolo Molaro (lupus@ximian.com) * Intel Corporation (ORP Project) * Sergey Chaban (serge@wildwestsoftware.com) * Dietmar Maurer (dietmar@ximian.com) * Patrik Torstensson * * Copyright (C) 2000 Intel Corporation. All rights reserved. * Copyright (C) 2001, 2002 Ximian, Inc. * | ||||||||
Synopsis | ||||||||
Constants | ||||||||
Machine characteristics | ||||||||
x86_dword_size :: Int | ||||||||
Sizes of various machine data types in bytes. | ||||||||
x86_qword_size :: Int | ||||||||
Register numbers | ||||||||
x86 general-purpose register numbers | ||||||||
x86_eax :: Word8 | ||||||||
x86_ecx :: Word8 | ||||||||
x86_edx :: Word8 | ||||||||
x86_ebx :: Word8 | ||||||||
x86_esp :: Word8 | ||||||||
x86_ebp :: Word8 | ||||||||
x86_esi :: Word8 | ||||||||
x86_edi :: Word8 | ||||||||
x86_nobasereg :: Word8 | ||||||||
Used to encode the fact that no base register is used in an instruction. | ||||||||
Register masks and predicates | ||||||||
x86_eax_mask :: Int | ||||||||
x86_ecx_mask :: Int | ||||||||
x86_edx_mask :: Int | ||||||||
x86_ebx_mask :: Int | ||||||||
x86_esi_mask :: Int | ||||||||
x86_edi_mask :: Int | ||||||||
Bitvector masks for general-purpose registers | ||||||||
x86_callee_regs :: Int | ||||||||
Bitvector mask for callee-saved registers | ||||||||
x86_caller_regs :: Int | ||||||||
Bitvector mask for caller-saved registers | ||||||||
x86_byte_regs :: Int | ||||||||
Bitvector mask for byte-adressable registers | ||||||||
ALU operations | ||||||||
x86_add :: Word8 | ||||||||
x86_or :: Word8 | ||||||||
x86_adc :: Word8 | ||||||||
x86_sbb :: Word8 | ||||||||
x86_and :: Word8 | ||||||||
x86_sub :: Word8 | ||||||||
x86_xor :: Word8 | ||||||||
x86_cmp :: Word8 | ||||||||
Opcodes for ALU instructions | ||||||||
Shift operations | ||||||||
x86_rol :: Word8 | ||||||||
x86_ror :: Word8 | ||||||||
x86_rcl :: Word8 | ||||||||
x86_rcr :: Word8 | ||||||||
x86_shl :: Word8 | ||||||||
x86_shr :: Word8 | ||||||||
x86_sar :: Word8 | ||||||||
Opcodes for shift instructions | ||||||||
Condition codes | ||||||||
x86_cc_eq :: Int | ||||||||
x86_cc_e :: Int | ||||||||
x86_cc_z :: Int | ||||||||
x86_cc_ne :: Int | ||||||||
x86_cc_nz :: Int | ||||||||
x86_cc_lt :: Int | ||||||||
x86_cc_b :: Int | ||||||||
x86_cc_c :: Int | ||||||||
x86_cc_nae :: Int | ||||||||
x86_cc_le :: Int | ||||||||
x86_cc_be :: Int | ||||||||
x86_cc_na :: Int | ||||||||
x86_cc_gt :: Int | ||||||||
x86_cc_a :: Int | ||||||||
x86_cc_nbe :: Int | ||||||||
x86_cc_ge :: Int | ||||||||
x86_cc_ae :: Int | ||||||||
x86_cc_nb :: Int | ||||||||
x86_cc_nc :: Int | ||||||||
x86_cc_lz :: Int | ||||||||
x86_cc_s :: Int | ||||||||
x86_cc_gez :: Int | ||||||||
x86_cc_ns :: Int | ||||||||
x86_cc_p :: Int | ||||||||
x86_cc_np :: Int | ||||||||
x86_cc_pe :: Int | ||||||||
x86_cc_po :: Int | ||||||||
x86_cc_o :: Int | ||||||||
x86_cc_no :: Int | ||||||||
Integer conditions codes | ||||||||
Functions | ||||||||
Utility functions | ||||||||
x86_is_scratch :: Int -> Bool | ||||||||
Returns true when the given register is caller-saved. | ||||||||
x86_is_callee :: Int -> Bool | ||||||||
Returns true when the given register is caller-saved. | ||||||||
Code emission | ||||||||
x86_imm_emit32 :: Word32 -> CodeGen e s () | ||||||||
Emit a 32-bit constant to the instruction stream. | ||||||||
x86_imm_emit16 :: Word16 -> CodeGen e s () | ||||||||
Emit a 16-bit constant to the instruction stream. | ||||||||
x86_imm_emit8 :: Word8 -> CodeGen e s () | ||||||||
Emit a 8-bit constant to the instruction stream. | ||||||||
x86_membase_emit :: Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
Emit a mem+base address encoding | ||||||||
x86_alu_reg_imm :: Word8 -> Word8 -> Int -> CodeGen e s () | ||||||||
Call instructions | ||||||||
x86_call_hs :: FunPtr a -> CodeGen e s () | ||||||||
x86_call_membase :: Word8 -> Word32 -> CodeGen s e () | ||||||||
x86_call_mem :: Word32 -> CodeGen s e () | ||||||||
x86_call_reg :: Word8 -> CodeGen s e () | ||||||||
x86_call_imm :: Word32 -> CodeGen s e () | ||||||||
Function prologue and epilogue | ||||||||
x86_prolog :: Int -> Int -> CodeGen e s () | ||||||||
x86_epilog :: Int -> CodeGen e s () | ||||||||
x86_enter :: Word16 -> CodeGen s e () | ||||||||
x86_leave :: CodeGen s e () | ||||||||
x86_ret :: CodeGen s e () | ||||||||
x86_ret_imm :: Word16 -> CodeGen s e () | ||||||||
Jump and branch | ||||||||
x86_jecxz :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_branch :: forall e s . Int -> Int -> Bool -> CodeGen e s () | ||||||||
x86_branch32 :: forall e s . Int -> Word32 -> Bool -> CodeGen e s () | ||||||||
x86_branch8 :: forall e s . Int -> Word8 -> Bool -> CodeGen e s () | ||||||||
x86_jump_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_jump_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_jump_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_jump32 :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_jump8 :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_loopne :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_loope :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_loop :: forall e s . Word8 -> CodeGen e s () | ||||||||
Stack operations | ||||||||
x86_push_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_push_regp :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_push_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_push_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_push_imm :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_push_imm_template :: forall e s . CodeGen e s () | ||||||||
x86_push_memindex :: forall e s . Word8 -> Word32 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_pop_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_pop_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_pop_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_popfd :: forall e s . CodeGen e s () | ||||||||
x86_pushfd :: forall e s . CodeGen e s () | ||||||||
x86_popad :: forall e s . CodeGen e s () | ||||||||
x86_pushad :: forall e s . CodeGen e s () | ||||||||
Data movement | ||||||||
x86_mov_reg_reg :: forall t e s . Num t => Word8 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_reg_imm :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_mov_mem_imm :: forall a e s . Num a => Word32 -> Word32 -> a -> CodeGen e s () | ||||||||
x86_mov_membase_imm :: forall a e s . Num a => Word8 -> Word32 -> Word32 -> a -> CodeGen e s () | ||||||||
x86_mov_memindex_imm :: forall a e s . Num a => Word8 -> Word32 -> Word8 -> Word8 -> Word32 -> a -> CodeGen e s () | ||||||||
x86_mov_mem_reg :: forall t e s . Num t => Word32 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_reg_mem :: forall t e s . Num t => Word8 -> Word32 -> t -> CodeGen e s () | ||||||||
x86_mov_regp_reg :: forall t e s . Num t => Word8 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_reg_regp :: forall t e s . Num t => Word8 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_membase_reg :: forall t e s . Num t => Word8 -> Word32 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_reg_membase :: forall t e s . Num t => Word8 -> Word8 -> Word32 -> t -> CodeGen e s () | ||||||||
x86_mov_memindex_reg :: forall t e s . Num t => Word8 -> Word32 -> Word8 -> Word8 -> Word8 -> t -> CodeGen e s () | ||||||||
x86_mov_reg_memindex :: forall e s t . Num t => Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> t -> CodeGen e s () | ||||||||
Arithmetic | ||||||||
x86_xadd_reg_reg :: forall a e s . Num a => Word8 -> Word8 -> a -> CodeGen e s () | ||||||||
x86_xadd_mem_reg :: forall a e s . Num a => Word32 -> Word8 -> a -> CodeGen e s () | ||||||||
x86_xadd_membase_reg :: forall a e s . Num a => Word8 -> Word32 -> Word8 -> a -> CodeGen e s () | ||||||||
x86_inc_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_inc_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_inc_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_dec_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_dec_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_dec_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_not_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_not_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_not_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_neg_mem :: forall e s . Word32 -> CodeGen e s () | ||||||||
x86_neg_membase :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_neg_reg :: forall e s . Word8 -> CodeGen e s () | ||||||||
x86_alu_mem_imm :: forall e s . Word8 -> Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_alu_membase_imm :: forall e s . Word8 -> Word8 -> Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_alu_membase8_imm :: forall e s . Word8 -> Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_alu_mem_reg :: forall e s . Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_alu_membase_reg :: forall e s . Word8 -> Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_alu_reg_reg :: forall e s . Word8 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_alu_reg8_reg8 :: forall e s . Word8 -> Word8 -> Word8 -> Bool -> Bool -> CodeGen e s () | ||||||||
x86_alu_reg_mem :: forall e s . Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_alu_reg_membase :: forall e s . Word8 -> Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_mul_reg :: forall e s . Word8 -> Bool -> CodeGen e s () | ||||||||
x86_mul_mem :: forall e s . Word32 -> Bool -> CodeGen e s () | ||||||||
x86_mul_membase :: forall e s . Word8 -> Word32 -> Bool -> CodeGen e s () | ||||||||
x86_imul_reg_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_imul_reg_membase :: forall e s . Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_imul_reg_reg_imm :: forall e s . Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_imul_reg_mem :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_imul_reg_mem_imm :: forall e s . Word8 -> Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_imul_reg_membase_imm :: forall e s . Word8 -> Word8 -> Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_div_reg :: forall e s . Word8 -> Bool -> CodeGen e s () | ||||||||
x86_div_mem :: forall e s . Word32 -> Bool -> CodeGen e s () | ||||||||
x86_div_membase :: forall e s . Word8 -> Word32 -> Bool -> CodeGen e s () | ||||||||
x86_test_reg_imm :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_test_mem_imm :: forall e s . Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_test_membase_imm :: forall e s . Word8 -> Word32 -> Word32 -> CodeGen e s () | ||||||||
x86_test_reg_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_test_mem_reg :: forall e s . Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_test_membase_reg :: forall e s . Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
Exchange | ||||||||
x86_cmpxchg_reg_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_cmpxchg_mem_reg :: forall e s . Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_cmpxchg_membase_reg :: forall e s . Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_xchg_reg_reg :: forall a e s . Num a => Word8 -> Word8 -> a -> CodeGen e s () | ||||||||
x86_xchg_mem_reg :: forall a e s . Num a => Word32 -> Word8 -> a -> CodeGen e s () | ||||||||
x86_xchg_membase_reg :: forall a e s . Num a => Word8 -> Word32 -> Word8 -> a -> CodeGen e s () | ||||||||
String operations | ||||||||
x86_stosb :: CodeGen s e () | ||||||||
x86_stosl :: CodeGen s e () | ||||||||
x86_stosd :: CodeGen s e () | ||||||||
x86_movsb :: CodeGen s e () | ||||||||
x86_movsl :: CodeGen s e () | ||||||||
x86_movsd :: CodeGen s e () | ||||||||
Bitwise shift | ||||||||
x86_shift_reg_imm :: forall e s . Word8 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_shift_mem_imm :: forall e s . Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_shift_membase_imm :: forall e s . Word8 -> Word8 -> Word32 -> Word8 -> CodeGen e s () | ||||||||
x86_shift_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_shift_mem :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_shift_membase :: forall e s . Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_shrd_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_shrd_reg_imm :: forall e s . Word8 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_shld_reg :: forall e s . Word8 -> Word8 -> CodeGen e s () | ||||||||
x86_shld_reg_imm :: forall e s . Word8 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
Conditional move | ||||||||
x86_cmov_membase :: forall e s . Int -> Bool -> Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_cmov_mem :: forall e s . Int -> Bool -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_cmov_reg :: forall e s . Int -> Bool -> Word8 -> Word8 -> CodeGen e s () | ||||||||
Conditional set | ||||||||
x86_set_membase :: forall e s . Int -> Word8 -> Word32 -> Bool -> CodeGen e s () | ||||||||
x86_set_mem :: forall e s . Int -> Word32 -> Bool -> CodeGen e s () | ||||||||
x86_set_reg :: forall e s . Int -> Word8 -> Bool -> CodeGen e s () | ||||||||
Address calculation | ||||||||
x86_lea_mem :: forall e s . Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_lea_membase :: forall e s . Word8 -> Word8 -> Word32 -> CodeGen e s () | ||||||||
x86_lea_memindex :: forall e s . Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> CodeGen e s () | ||||||||
Conversion | ||||||||
x86_cdq :: CodeGen s e () | ||||||||
x86_widen_memindex :: forall e s . Word8 -> Word8 -> Word32 -> Word8 -> Word8 -> Bool -> Bool -> CodeGen e s () | ||||||||
x86_widen_membase :: forall e s . Word8 -> Word8 -> Word32 -> Bool -> Bool -> CodeGen e s () | ||||||||
x86_widen_mem :: forall e s . Word8 -> Word32 -> Bool -> Bool -> CodeGen e s () | ||||||||
x86_widen_reg :: forall e s . Word8 -> Word8 -> Bool -> Bool -> CodeGen e s () | ||||||||
Miscellaneous | ||||||||
x86_sahf :: CodeGen s e () | ||||||||
x86_wait :: CodeGen s e () | ||||||||
x86_nop :: CodeGen s e () | ||||||||
x86_breakpoint :: CodeGen s e () | ||||||||
x86_rdtsc :: CodeGen s e () | ||||||||
x86_cld :: CodeGen s e () | ||||||||
Other utilities | ||||||||
negateCC :: Int -> Int | ||||||||
Invert a condition code. | ||||||||
Produced by Haddock version 0.8 |