1 
    2 {------------------------------------------------------------------------}
    3 {--- Beginnings of X86 specific stuff                Arch_X86.hs      ---}
    4 {------------------------------------------------------------------------}
    5 
    6 {- 
    7    This file is part of Cacheprof, a profiling tool for finding
    8    sources of cache misses in programs.
    9 
   10    Copyright (C) 1999 Julian Seward (jseward@acm.org) 
   11    Home page: http://www.cacheprof.org
   12 
   13    This program is free software; you can redistribute it and/or
   14    modify it under the terms of the GNU General Public License as
   15    published by the Free Software Foundation; either version 2 of the
   16    License, or (at your option) any later version.
   17 
   18    This program is distributed in the hope that it will be useful, but
   19    WITHOUT ANY WARRANTY; without even the implied warranty of
   20    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
   21    General Public License for more details.
   22 
   23    You should have received a copy of the GNU General Public License
   24    along with this program; if not, write to the Free Software
   25    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
   26    02111-1307, USA.
   27 
   28    The GNU General Public License is contained in the file LICENSE.
   29 -}
   30 
   31 module Arch_x86 (
   32    Opcode(..),
   33    OperandInfo(..),
   34    OperandEffect(..),
   35    x86info,
   36    nonJumpyOpcodes
   37 )
   38 
   39 where
   40 
   41 data Opcode 
   42    = O_movl | O_movw | O_movb
   43    | O_movzbw | O_movzbl | O_movzwl 
   44    | O_movsbw | O_movsbl | O_movswl 
   45    | O_pushl | O_popl 
   46    | O_pushfl | O_popfl
   47    | O_notl | O_notw | O_notb
   48    | O_sall | O_salw | O_salb
   49    | O_sarl | O_sarw | O_sarb
   50    | O_shrl | O_shrw | O_shrb
   51    | O_roll | O_rolw | O_rolb
   52    | O_rorl | O_rorw | O_rorb
   53    | O_shldl | O_shrdl
   54    | O_addl | O_addw | O_addb
   55    | O_adcl
   56    | O_subl | O_subw | O_subb
   57    | O_sbbl
   58    | O_imull | O_imulw | O_imulb
   59    | O_mull
   60    | O_divl | O_divw | O_divb
   61    | O_idivl
   62    | O_xorl | O_xorw | O_xorb
   63    | O_andl | O_andw | O_andb
   64    | O_orl  | O_orw  | O_orb
   65    | O_incl | O_incw | O_incb
   66    | O_decl | O_decw | O_decb
   67    | O_negl | O_negw | O_negb
   68    | O_testl | O_testw | O_testb
   69    | O_leal
   70    | O_cmpl | O_cmpw | O_cmpb
   71 
   72    | O_cmpsb
   73    | O_scasb
   74    | O_movsl | O_movsw | O_movsb
   75    | O_stosl | O_stosw | O_stosb
   76 
   77    | O_leave | O_ret | O_call | O_jmp
   78    | O_je | O_jne 
   79    | O_jl | O_jle 
   80    | O_jg | O_jge
   81    | O_js | O_jns
   82    | O_jz | O_jnz
   83    | O_jc | O_jnc
   84    | O_jo | O_jno
   85    | O_ja | O_jae
   86    | O_jb | O_jbe
   87    | O_jp
   88    | O_seta | O_setae
   89    | O_setb | O_setbe
   90    | O_sete | O_setne
   91    | O_setl | O_setle
   92    | O_setg | O_setge
   93    | O_setc | O_setcb
   94    | O_btl | O_btsl | O_btrl | O_btcl
   95    | O_cld
   96    | O_cltd
   97    | O_cwtl
   98    | O_cbtw
   99    | O_rep | O_repz | O_repnz
  100    | O_fild | O_fildl | O_fildll
  101    | O_fsubp | O_fsubr | O_fsubrp | O_fsubrl | O_fsubrs 
  102              | O_fsubs | O_fsubl | O_fsub
  103    | O_faddp | O_fadds | O_faddl | O_fadd | O_fiaddl
  104    | O_fmul | O_fmuls | O_fmull | O_fmulp
  105    | O_fimull
  106    | O_fdiv | O_fdivp | O_fdivr | O_fdivrs | O_fdivrl | O_fdivrp
  107    | O_fidivl | O_fidivrl | O_fdivl | O_fdivs
  108    | O_fprem                -- remainder (st(0) / st(1))
  109    | O_fstp | O_fsts | O_fstps | O_fstl | O_fstpl | O_fstpt | O_fst
  110    | O_fistl | O_fistpl | O_fistpll              -- store (int)st(0)
  111    | O_fld
  112    | O_flds
  113    | O_fldl
  114    | O_fldt
  115    | O_fldz | O_fld1 | O_fldl2e | O_fldln2
  116    | O_fchs
  117    | O_fsin | O_fcos | O_fptan | O_fsqrt | O_fpatan | O_fabs
  118    | O_f2xm1 | O_fscale | O_fyl2x
  119    | O_fucom | O_fucomp | O_fucompp
  120    | O_fcomp | O_fcompp | O_fcoml | O_fcompl | O_ficompl
  121    | O_fcoms | O_fcom | O_fcomps
  122    | O_fnstsw               -- store FP status word
  123    | O_fnstcw               -- store FP control word
  124    | O_fldcw                -- load FP control word
  125    | O_frndint              -- round ST(0) to nearest int
  126    | O_fxch
  127    | O_sahf                 -- store AH into flags
  128    | O_nop
  129      deriving (Show, Eq)
  130 
  131 
  132 x86info :: [(Opcode, OperandInfo)]
  133 x86info 
  134   = [
  135       (O_movl,    OI [OE_RW 4 4]),
  136       (O_movw,    OI [OE_RW 2 2]),
  137       (O_movb,    OI [OE_RW 1 1]),
  138 
  139       (O_movzbw,  OI [OE_RW 1 2]),
  140       (O_movzbl,  OI [OE_RW 1 4]),
  141       (O_movzwl,  OI [OE_RW 2 4]),
  142 
  143       (O_movsbw,  OI [OE_RW 1 2]),
  144       (O_movsbl,  OI [OE_RW 1 4]),
  145       (O_movswl,  OI [OE_RW 2 4]),
  146 
  147       (O_pushl,   OI_Special),
  148       (O_popl,    OI_Special),
  149       (O_pushfl,  OI_Error),    -- only generated by simplify?
  150       (O_popfl,   OI_Error),    -- only generated by simplify?
  151 
  152       (O_sall,    OI [OE_RM 1 4]),
  153       (O_salw,    OI [OE_RM 1 2]),
  154       (O_salb,    OI [OE_RM 1 1]),
  155 
  156       (O_sarl,    OI [OE_RM 1 4]),
  157       (O_sarw,    OI [OE_RM 1 2]),
  158       (O_sarb,    OI [OE_RM 1 1]),
  159 
  160       (O_shrl,    OI [OE_RM 1 4]),
  161       (O_shrw,    OI [OE_RM 1 2]),
  162       (O_shrb,    OI [OE_RM 1 1]),
  163 
  164       (O_roll,    OI [OE_RM 1 4]),
  165       (O_rolw,    OI [OE_RM 1 2]),
  166       (O_rolb,    OI [OE_RM 1 1]),
  167 
  168       (O_rorl,    OI [OE_RM 1 4]),
  169       (O_rorw,    OI [OE_RM 1 2]),
  170       (O_rorb,    OI [OE_RM 1 1]),
  171 
  172       (O_shldl,   OI [OE_RRM 4 4 4, OE_RM 4 4]),  -- dubious
  173       (O_shrdl,   OI [OE_RRM 4 4 4, OE_RM 4 4]),  -- equally dubious
  174 
  175       (O_addl,    OI [OE_RM 4 4]),
  176       (O_addw,    OI [OE_RM 2 2]),
  177       (O_addb,    OI [OE_RM 1 1]),
  178 
  179       (O_adcl,    OI [OE_RM 4 4]),
  180 
  181       (O_subl,    OI [OE_RM 4 4]),
  182       (O_subw,    OI [OE_RM 2 2]),
  183       (O_subb,    OI [OE_RM 1 1]),
  184 
  185       (O_sbbl,    OI [OE_RM 4 4]),   -- check this!
  186 
  187       (O_imull,   OI [OE_M 4, OE_RM 4 4, OE_RRM 4 4 4]),   -- dubious
  188       (O_imulb,   OI [OE_M 1]),              -- dubious
  189       (O_imulw,   OI [OE_M 2, OE_RM 2 2]),   -- dubious
  190       (O_mull,    OI [OE_M 4]),              -- dubious
  191       (O_idivl,   OI [OE_M 4]),
  192       (O_divl,    OI [OE_M 4]),
  193       (O_divw,    OI [OE_M 2]),
  194       (O_divb,    OI [OE_M 1]),
  195 
  196       (O_xorl,    OI [OE_RM 4 4]),
  197       (O_xorw,    OI [OE_RM 2 2]),
  198       (O_xorb,    OI [OE_RM 1 1]),
  199 
  200       (O_andl,    OI [OE_RM 4 4]),
  201       (O_andw,    OI [OE_RM 2 2]),
  202       (O_andb,    OI [OE_RM 1 1]),
  203 
  204       (O_orl,     OI [OE_RM 4 4]),
  205       (O_orw,     OI [OE_RM 2 2]),
  206       (O_orb,     OI [OE_RM 1 1]),
  207 
  208       (O_incl,    OI [OE_M 4]),
  209       (O_incw,    OI [OE_M 2]),
  210       (O_incb,    OI [OE_M 1]),
  211 
  212       (O_decl,    OI [OE_M 4]),
  213       (O_decw,    OI [OE_M 2]),
  214       (O_decb,    OI [OE_M 1]),
  215 
  216       (O_negl,    OI [OE_M 4]),
  217       (O_negw,    OI [OE_M 2]),
  218       (O_negb,    OI [OE_M 1]),
  219 
  220       (O_notl,    OI [OE_M 4]),
  221       (O_notw,    OI [OE_M 2]),
  222       (O_notb,    OI [OE_M 1]),
  223 
  224       (O_testl,   OI [OE_RR 4 4]),
  225       (O_testw,   OI [OE_RR 2 2]),
  226       (O_testb,   OI [OE_RR 1 1]),
  227 
  228       (O_leal,    OI [OE_nW 4]),
  229 
  230       (O_cmpl,    OI [OE_RR 4 4]),
  231       (O_cmpw,    OI [OE_RR 2 2]),
  232       (O_cmpb,    OI [OE_RR 1 1]),
  233 
  234       (O_cmpsb,   OI_Special),  -- really is
  235       (O_scasb,   OI_Special),  -- really is
  236       (O_movsl,   OI_Special),
  237       (O_movsw,   OI_Special),
  238       (O_movsb,   OI_Special),
  239       (O_stosl,   OI_Special),
  240       (O_stosw,   OI_Special),
  241       (O_stosb,   OI_Special),
  242 
  243       (O_leave,   OI_Error),
  244       (O_ret,     OI_Special),
  245       (O_call,    OI_Special),
  246 
  247       (O_jmp,     OI_Jumpy),
  248       (O_je,      OI_Jumpy),
  249       (O_jne,     OI_Jumpy),
  250       (O_jl,      OI_Jumpy),
  251       (O_jle,     OI_Jumpy),
  252       (O_jg,      OI_Jumpy),
  253       (O_jge,     OI_Jumpy),
  254       (O_js,      OI_Jumpy),
  255       (O_jns,     OI_Jumpy),
  256       (O_jz,      OI_Jumpy),
  257       (O_jnz,     OI_Jumpy),
  258       (O_jc,      OI_Jumpy),
  259       (O_jnc,     OI_Jumpy),
  260       (O_jo,      OI_Jumpy),
  261       (O_jno,     OI_Jumpy),
  262       (O_ja,      OI_Jumpy),
  263       (O_jae,     OI_Jumpy),
  264       (O_jb,      OI_Jumpy),
  265       (O_jbe,     OI_Jumpy),
  266       (O_jp,      OI_Jumpy),
  267 
  268       (O_seta,    OI [OE_W 1]),
  269       (O_setae,   OI [OE_W 1]),
  270       (O_setb,    OI [OE_W 1]),
  271       (O_setbe,   OI [OE_W 1]),
  272       (O_sete,    OI [OE_W 1]),       -- check
  273       (O_setne,   OI [OE_W 1]),
  274       (O_setl,    OI [OE_W 1]),       -- check
  275       (O_setle,   OI [OE_W 1]),       -- check
  276       (O_setg,    OI [OE_W 1]),       -- check
  277       (O_setge,   OI [OE_W 1]),       -- check
  278       (O_setc,    OI [OE_W 1]),       -- check
  279       (O_setcb,   OI [OE_W 1]),       -- check
  280 
  281       (O_btl,     OI [OE_RR 4 4]),    -- check
  282       (O_btsl,    OI [OE_RM 4 4]),    -- check
  283       (O_btcl,    OI [OE_RM 4 4]),    -- check
  284       (O_btrl,    OI [OE_RM 4 4]),    -- check
  285 
  286       (O_cld,     OI_NoEffect),  -- dubious
  287       (O_cltd,    OI_NoEffect),  -- dubious
  288       (O_cwtl,    OI_NoEffect),  -- dubious
  289       (O_cbtw,    OI_NoEffect),  -- dubious
  290 
  291       (O_rep,     OI_Error),
  292       (O_repz,    OI_Error),
  293       (O_repnz,   OI_Error),
  294 
  295       (O_fld,     OI [OE_R 8]),       -- very dubious
  296       (O_fldt,    OI [OE_R 8]),       -- very dubious
  297       (O_fldl,    OI [OE_R 8]),       -- dubious
  298       (O_flds,    OI [OE_R 4]),       -- dubious
  299       (O_fild,    OI [OE_R 4]),       -- or is it OE_R 2
  300       (O_fildl,   OI [OE_R 4]),       -- dubious
  301       (O_fildll,  OI [OE_R 8]),
  302 
  303       (O_fstl,    OI [OE_W 8]),       -- dubious
  304       (O_fstpl,   OI [OE_W 8]),       -- dubious
  305       (O_fstp,    OI [OE_W 8]),       -- dubious
  306       (O_fstps,   OI [OE_W 4]),       -- dubious
  307       (O_fsts,    OI [OE_W 4]),       -- dubious
  308       (O_fstpt,   OI [OE_W 8]),       -- dubious
  309       (O_fistl,   OI [OE_W 4]),       -- dubious
  310       (O_fistpl,  OI [OE_W 4]),       -- dubious
  311       (O_fistpll, OI [OE_W 8]),       -- dubious
  312       (O_fst,     OI [OE_W 8]),       -- dubious
  313 
  314       (O_fldz,    OI_NoEffect),  -- dubious
  315       (O_fld1,    OI_NoEffect),  -- dubious
  316       (O_fldl2e,  OI_NoEffect),
  317       (O_fldln2,  OI_NoEffect),
  318 
  319       (O_fchs,    OI_NoEffect),
  320 
  321       (O_fsin,    OI_NoEffect),
  322       (O_fcos,    OI_NoEffect),
  323       (O_fptan,   OI_NoEffect),
  324       (O_fsqrt,   OI_NoEffect),
  325       (O_fpatan,  OI_NoEffect),
  326       (O_fabs,    OI_NoEffect),
  327       (O_f2xm1,   OI_NoEffect),
  328       (O_fscale,  OI_NoEffect),
  329       (O_fyl2x,   OI_NoEffect),
  330 
  331       (O_faddp,   OI [OE_R 8, OE_RM 8 8]),
  332       (O_fadds,   OI [OE_R 4]),
  333       (O_faddl,   OI [OE_R 8]),
  334       (O_fiaddl,  OI [OE_R 4]),
  335       (O_fadd,    OI [OE_R 8, OE_RM 8 8]),
  336 
  337       (O_fsubp,   OI [OE_RM 8 8]),
  338       (O_fsubrp,  OI [OE_RM 8 8]),
  339       (O_fsubrl,  OI [OE_R 8]),
  340       (O_fsubrs,  OI [OE_R 4]),
  341       (O_fsubs,   OI [OE_R 4]),
  342       (O_fsubl,   OI [OE_R 8]),       -- dubious
  343       (O_fsub,    OI [OE_R 8, OE_RM 8 8]),
  344       (O_fsubr,   OI [OE_R 8, OE_RM 8 8]),
  345 
  346       (O_fmul,    OI [OE_R 8, OE_RM 8 8]),
  347       (O_fmuls,   OI [OE_R 4]),
  348       (O_fmull,   OI [OE_R 8]),
  349       (O_fmulp,   OI [OE_R 8, OE_RM 8 8]),
  350       (O_fimull,  OI [OE_R 8]),       -- dubious
  351 
  352       (O_fdiv,    OI [OE_RM 8 8]),    -- dubious
  353       (O_fdivp,   OI [OE_RM 8 8]),    -- dubious
  354       (O_fdivr,   OI [OE_RM 8 8]),    -- dubious
  355       (O_fdivrl,  OI [OE_R 8]),       -- haven't got a clue
  356       (O_fdivrs,  OI [OE_R 4]),       -- haven't got a clue
  357       (O_fdivrp,  OI [OE_RM 8 8]),    -- dubious
  358       (O_fidivrl, OI [OE_R 4]),
  359       (O_fidivl,  OI [OE_R 4]),
  360       (O_fdivl,   OI [OE_R 8]),
  361       (O_fdivs,   OI [OE_R 4]),
  362 
  363       (O_fprem,   OI_NoEffect),
  364 
  365       (O_fucom,   OI_NoEffect),  -- dubious
  366       (O_fucomp,  OI_NoEffect),  -- dubious
  367       (O_fucompp, OI_NoEffect),  -- dubious
  368 
  369       (O_fcomp,   OI_NoEffect),  -- dubious
  370       (O_fcompp,  OI_NoEffect),  -- dubious
  371       (O_fcoms,   OI [OE_R 4]),       -- dubious
  372       (O_fcoml,   OI [OE_R 8]),       -- dubious
  373       (O_fcom,    OI [OE_R 8]),       -- dubious
  374       (O_fcomps,  OI [OE_R 4]),       -- dubious
  375       (O_fcompl,  OI [OE_R 8]),       -- dubious
  376       (O_ficompl, OI [OE_R 4]),       -- dubious
  377 
  378       (O_fnstsw,  OI [OE_W 2]),
  379       (O_fnstcw,  OI [OE_W 2]),
  380       (O_fldcw,   OI [OE_R 2]),
  381       (O_fxch,    OI_NoEffect),
  382 
  383       (O_frndint, OI_NoEffect),
  384       (O_sahf,    OI_NoEffect),
  385       (O_nop,     OI_NoEffect)
  386    ]
  387 
  388 
  389 
  390 data OperandInfo
  391    = OI_Special
  392    | OI_Jumpy
  393    | OI_NoEffect
  394    | OI_Error
  395    | OI [OperandEffect]
  396      deriving (Show, Eq)
  397 
  398 data OperandEffect
  399    = OE_RR  Int Int
  400    | OE_RM  Int Int
  401    | OE_RW  Int Int
  402    | OE_nW      Int
  403    | OE_RRM Int Int Int
  404    | OE_R   Int
  405    | OE_M   Int
  406    | OE_W   Int
  407      deriving (Show, Eq)
  408 
  409 
  410 -- Only put an opcode in here if it definitely doesn't
  411 -- cause a control flow transfer.  It's safe to not put
  412 -- stuff in here.
  413 -- Contents are quite arbitrary, and based on looking at
  414 -- common sequences of annotated code.  Arbitrary is safe
  415 -- because it's always safe to leave opcodes out of this list.
  416 nonJumpyOpcodes :: [Opcode]
  417 nonJumpyOpcodes
  418    = [
  419          O_pushl, O_popl
  420         ,O_movl ,O_movw ,O_movb
  421         ,O_andl ,O_andw ,O_andb
  422         ,O_orl  ,O_orw  ,O_orb
  423         ,O_xorl ,O_xorw ,O_xorb
  424         ,O_addl ,O_addw ,O_addb
  425         ,O_subl ,O_subw ,O_subb
  426         ,O_incl ,O_incw ,O_incb
  427         ,O_decl ,O_decw ,O_decb
  428         ,O_cmpl ,O_cmpw ,O_cmpb
  429         ,O_sall ,O_salw ,O_salb
  430         ,O_shrl ,O_shrw ,O_shrb
  431         ,O_sarl
  432         ,O_leal
  433         ,O_movzbw ,O_movzbl ,O_movzwl 
  434         ,O_movsbw ,O_movsbl ,O_movswl 
  435 
  436         , O_seta , O_setae
  437         , O_setb , O_setbe
  438         , O_sete , O_setne
  439         , O_setl , O_setle
  440         , O_setg , O_setge
  441         , O_setc , O_setcb
  442 
  443         , O_testl , O_testw , O_testb
  444 
  445         , O_fld1 , O_fcoml , O_fnstsw , O_fstpl
  446         , O_fstp , O_fsubrl , O_fldl , O_faddl , O_fsubl
  447 
  448      ]
  449 
  450 {------------------------------------------------------------------------}
  451 {--- end                                             Arch_X86.hs      ---}
  452 {------------------------------------------------------------------------}