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