dyncode.h
上传用户:wstnjxml
上传日期:2014-04-03
资源大小:7248k
文件大小:3k
源码类别:

Windows CE

开发平台:

C/C++

  1. /*****************************************************************************
  2.  *
  3.  * This program is free software ; you can redistribute it and/or modify
  4.  * it under the terms of the GNU General Public License as published by
  5.  * the Free Software Foundation; either version 2 of the License, or
  6.  * (at your option) any later version.
  7.  *
  8.  * This program is distributed in the hope that it will be useful,
  9.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  11.  * GNU General Public License for more details.
  12.  *
  13.  * You should have received a copy of the GNU General Public License
  14.  * along with this program; if not, write to the Free Software
  15.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307 USA
  16.  *
  17.  * $Id: dyncode.h 585 2006-01-16 09:48:55Z picard $
  18.  *
  19.  * The Core Pocket Media Player
  20.  * Copyright (c) 2004-2005 Gabor Kovacs
  21.  *
  22.  ****************************************************************************/
  23. #ifndef __DYNCODE_H
  24. #define __DYNCODE_H
  25. typedef uint8_t reg;
  26. #define NONE ((reg)-1)
  27. typedef struct dyncode
  28. {
  29. char* Code;
  30. int Size;
  31. int Allocated;
  32. } dyncode;
  33. typedef struct dyninst
  34. {
  35. int Tag;
  36. struct dyninst* Next;
  37. struct dyninst* Prev;
  38. int RdFlags;
  39. int WrFlags;
  40. int RdRegs;
  41. int WrRegs;
  42. struct dyninst* ReAlloc;
  43. bool_t Branch;
  44. int CodeSmall;
  45. char* CodeLarge;
  46. int CodeSize;
  47. char* Address;
  48. } dyninst;
  49. #include "dyncode_arm.h"
  50. #include "dyncode_mips.h"
  51. #include "dyncode_sh3.h"
  52. void DynCode_Init();
  53. void DynCode_Done();
  54. #ifdef CONFIG_DYNCODE
  55. void CodeInit(dyncode*);
  56. void CodeDone(dyncode*);
  57. void CodeBuild(dyncode*);
  58. void CodeStart(dyncode*);
  59. #else
  60. static INLINE void CodeInit(dyncode* p) { memset(p,0,sizeof(dyncode)); }
  61. static INLINE void CodeDone(dyncode* p) {}
  62. static INLINE void CodeBuild(dyncode* p) {}
  63. static INLINE void CodeStart(dyncode* p) {}
  64. #endif
  65. void Align(int);
  66. void MB();
  67. void DS();
  68. dyninst* Label(bool_t DoPost);
  69. //-----------------------------------------------------------------------
  70. static INLINE char* InstCode(dyninst* p)
  71. {
  72. return p->CodeLarge ? p->CodeLarge : (char*)&p->CodeSmall;
  73. }
  74. static INLINE int InstSize(dyninst* p, int Pos)
  75. {
  76. if (p->CodeSize >= 0)
  77. return p->CodeSize;
  78. Pos = Pos % -p->CodeSize;
  79. if (Pos)
  80. Pos = -p->CodeSize - Pos;
  81. return Pos;
  82. }
  83. static INLINE bool_t InstReadWrite(const dyninst* a, const dyninst* b)
  84. {
  85. return (a->RdFlags & b->WrFlags) != 0 ||
  86.    (a->RdRegs & b->WrRegs) != 0;
  87. }
  88. static INLINE bool_t InstBothWrite(const dyninst* a, const dyninst* b)
  89. {
  90. return (a->WrFlags & b->WrFlags) != 0 ||
  91.    (a->WrRegs & b->WrRegs) != 0;
  92. }
  93. static INLINE int RotateRight(int v, int Bits)
  94. {
  95. Bits &= 31;
  96. return ((v >> Bits) & ((1 << (32-Bits))-1)) | (v << (32-Bits));
  97. }
  98. bool_t InstReAlloc(dyninst*,dyninst*);
  99. void InstPost(dyninst*);
  100. void InstInit();
  101. void InstAdd(dyninst*,context*);
  102. dyninst* InstCreate(const void* Code, int CodeSize, reg Wr, reg Rd1, reg Rd2, int RdFlags, int WrFlags);
  103. dyninst* InstCreate16(int Code16, reg Wr, reg Rd1, reg Rd2, int RdFlags, int WrFlags);
  104. dyninst* InstCreate32(int Code32, reg Wr, reg Rd1, reg Rd2, int RdFlags, int WrFlags);
  105. #endif