/JIT/PyBytecodeDispatch.h

http://unladen-swallow.googlecode.com/ · C Header · 182 lines · 146 code · 27 blank · 9 comment · 0 complexity · 57a795c65764f7eac53f6c07ddff6e36 MD5 · raw file

  1. // -*- C++ -*-
  2. #ifndef UTIL_PYBYTECODEDISPATCH_H
  3. #define UTIL_PYBYTECODEDISPATCH_H
  4. #ifndef __cplusplus
  5. #error This header expects to be included only in C++ source
  6. #endif
  7. namespace llvm {
  8. class BasicBlock;
  9. }
  10. namespace py {
  11. class LlvmFunctionBuilder;
  12. // This class handles dispatching opcodes by calling their
  13. // implementations in JIT/opcodes/*. If you want to replace a opcode
  14. // implementation, subclass PyBytecodeDispatch and override the
  15. // corresponding method.
  16. //
  17. // The opcode methods are not yet virtualized for performance reasons.
  18. class PyBytecodeDispatch {
  19. public:
  20. PyBytecodeDispatch(LlvmFunctionBuilder *fbuilder);
  21. /// The following methods operate like the opcodes with the same
  22. /// name.
  23. void LOAD_CONST(int index);
  24. void LOAD_FAST(int index);
  25. void STORE_FAST(int index);
  26. void DELETE_FAST(int index);
  27. void SETUP_LOOP(llvm::BasicBlock *target, int target_opindex,
  28. llvm::BasicBlock *fallthrough);
  29. void GET_ITER();
  30. void FOR_ITER(llvm::BasicBlock *target,
  31. llvm::BasicBlock *fallthrough);
  32. void POP_BLOCK();
  33. void SETUP_EXCEPT(llvm::BasicBlock *target, int target_opindex,
  34. llvm::BasicBlock *fallthrough);
  35. void SETUP_FINALLY(llvm::BasicBlock *target, int target_opindex,
  36. llvm::BasicBlock *fallthrough);
  37. void END_FINALLY();
  38. void WITH_CLEANUP();
  39. void JUMP_FORWARD(llvm::BasicBlock *target,
  40. llvm::BasicBlock *fallthrough);
  41. void JUMP_ABSOLUTE(llvm::BasicBlock *target,
  42. llvm::BasicBlock *fallthrough);
  43. void POP_JUMP_IF_FALSE(unsigned target_idx,
  44. unsigned fallthrough_idx,
  45. llvm::BasicBlock *target,
  46. llvm::BasicBlock *fallthrough);
  47. void POP_JUMP_IF_TRUE(unsigned target_idx,
  48. unsigned fallthrough_idx,
  49. llvm::BasicBlock *target,
  50. llvm::BasicBlock *fallthrough);
  51. void JUMP_IF_FALSE_OR_POP(unsigned target_idx,
  52. unsigned fallthrough_idx,
  53. llvm::BasicBlock *target,
  54. llvm::BasicBlock *fallthrough);
  55. void JUMP_IF_TRUE_OR_POP(unsigned target_idx,
  56. unsigned fallthrough_idx,
  57. llvm::BasicBlock *target,
  58. llvm::BasicBlock *fallthrough);
  59. void CONTINUE_LOOP(llvm::BasicBlock *target,
  60. int target_opindex,
  61. llvm::BasicBlock *fallthrough);
  62. void BREAK_LOOP();
  63. void RETURN_VALUE();
  64. void YIELD_VALUE();
  65. void POP_TOP();
  66. void DUP_TOP();
  67. void DUP_TOP_TWO();
  68. void DUP_TOP_THREE();
  69. void ROT_TWO();
  70. void ROT_THREE();
  71. void ROT_FOUR();
  72. void BINARY_ADD();
  73. void BINARY_SUBTRACT();
  74. void BINARY_MULTIPLY();
  75. void BINARY_TRUE_DIVIDE();
  76. void BINARY_DIVIDE();
  77. void BINARY_MODULO();
  78. void BINARY_POWER();
  79. void BINARY_LSHIFT();
  80. void BINARY_RSHIFT();
  81. void BINARY_OR();
  82. void BINARY_XOR();
  83. void BINARY_AND();
  84. void BINARY_FLOOR_DIVIDE();
  85. void BINARY_SUBSCR();
  86. void INPLACE_ADD();
  87. void INPLACE_SUBTRACT();
  88. void INPLACE_MULTIPLY();
  89. void INPLACE_TRUE_DIVIDE();
  90. void INPLACE_DIVIDE();
  91. void INPLACE_MODULO();
  92. void INPLACE_POWER();
  93. void INPLACE_LSHIFT();
  94. void INPLACE_RSHIFT();
  95. void INPLACE_OR();
  96. void INPLACE_XOR();
  97. void INPLACE_AND();
  98. void INPLACE_FLOOR_DIVIDE();
  99. void UNARY_CONVERT();
  100. void UNARY_INVERT();
  101. void UNARY_POSITIVE();
  102. void UNARY_NEGATIVE();
  103. void UNARY_NOT();
  104. void SLICE_NONE();
  105. void SLICE_LEFT();
  106. void SLICE_RIGHT();
  107. void SLICE_BOTH();
  108. void STORE_SLICE_NONE();
  109. void STORE_SLICE_LEFT();
  110. void STORE_SLICE_RIGHT();
  111. void STORE_SLICE_BOTH();
  112. void DELETE_SLICE_NONE();
  113. void DELETE_SLICE_LEFT();
  114. void DELETE_SLICE_RIGHT();
  115. void DELETE_SLICE_BOTH();
  116. void STORE_SUBSCR();
  117. void DELETE_SUBSCR();
  118. void STORE_MAP();
  119. void LIST_APPEND();
  120. void IMPORT_NAME();
  121. void COMPARE_OP(int cmp_op);
  122. void CALL_FUNCTION(int num_args);
  123. void CALL_METHOD(int num_args);
  124. void CALL_FUNCTION_VAR(int num_args);
  125. void CALL_FUNCTION_KW(int num_args);
  126. void CALL_FUNCTION_VAR_KW(int num_args);
  127. void BUILD_TUPLE(int size);
  128. void BUILD_LIST(int size);
  129. void BUILD_MAP(int size);
  130. void BUILD_SLICE_TWO();
  131. void BUILD_SLICE_THREE();
  132. void UNPACK_SEQUENCE(int size);
  133. void LOAD_GLOBAL(int index);
  134. void STORE_GLOBAL(int index);
  135. void DELETE_GLOBAL(int index);
  136. void LOAD_NAME(int index);
  137. void STORE_NAME(int index);
  138. void DELETE_NAME(int index);
  139. void LOAD_ATTR(int index);
  140. void LOAD_METHOD(int index);
  141. void STORE_ATTR(int index);
  142. void DELETE_ATTR(int index);
  143. void LOAD_CLOSURE(int freevar_index);
  144. void MAKE_CLOSURE(int num_defaults);
  145. void LOAD_DEREF(int index);
  146. void STORE_DEREF(int index);
  147. void RAISE_VARARGS_ZERO();
  148. void RAISE_VARARGS_ONE();
  149. void RAISE_VARARGS_TWO();
  150. void RAISE_VARARGS_THREE();
  151. private:
  152. LlvmFunctionBuilder *fbuilder_;
  153. };
  154. }
  155. #endif // UTIL_PYBYTECODEDISPATCH_H