| ||||||||
| ||||||||
| ||||||||
| 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 |