/JIT/PyBytecodeDispatch.cc

http://unladen-swallow.googlecode.com/ · C++ · 660 lines · 568 code · 92 blank · 0 comment · 0 complexity · 89365320db518189a097449c2b96e744 MD5 · raw file

  1. #include "Python.h"
  2. #include "opcode.h"
  3. #include "JIT/PyBytecodeDispatch.h"
  4. #include "JIT/llvm_fbuilder.h"
  5. #include "JIT/opcodes/attributes.h"
  6. #include "JIT/opcodes/binops.h"
  7. #include "JIT/opcodes/block.h"
  8. #include "JIT/opcodes/call.h"
  9. #include "JIT/opcodes/closure.h"
  10. #include "JIT/opcodes/cmpops.h"
  11. #include "JIT/opcodes/container.h"
  12. #include "JIT/opcodes/control.h"
  13. #include "JIT/opcodes/globals.h"
  14. #include "JIT/opcodes/locals.h"
  15. #include "JIT/opcodes/loop.h"
  16. #include "JIT/opcodes/name.h"
  17. #include "JIT/opcodes/slice.h"
  18. #include "JIT/opcodes/stack.h"
  19. #include "JIT/opcodes/unaryops.h"
  20. #include "llvm/BasicBlock.h"
  21. using llvm::BasicBlock;
  22. namespace py {
  23. PyBytecodeDispatch::PyBytecodeDispatch(LlvmFunctionBuilder *fbuilder) :
  24. fbuilder_(fbuilder)
  25. {
  26. }
  27. void
  28. PyBytecodeDispatch::LOAD_CONST(int index)
  29. {
  30. OpcodeLocals locals(fbuilder_);
  31. locals.LOAD_CONST(index);
  32. }
  33. void
  34. PyBytecodeDispatch::LOAD_GLOBAL(int name_index)
  35. {
  36. OpcodeGlobals globals(fbuilder_);
  37. globals.LOAD_GLOBAL(name_index);
  38. }
  39. void
  40. PyBytecodeDispatch::STORE_GLOBAL(int name_index)
  41. {
  42. OpcodeGlobals globals(fbuilder_);
  43. globals.STORE_GLOBAL(name_index);
  44. }
  45. void
  46. PyBytecodeDispatch::DELETE_GLOBAL(int name_index)
  47. {
  48. OpcodeGlobals globals(fbuilder_);
  49. globals.DELETE_GLOBAL(name_index);
  50. }
  51. void
  52. PyBytecodeDispatch::LOAD_NAME(int index)
  53. {
  54. OpcodeName name(fbuilder_);
  55. name.LOAD_NAME(index);
  56. }
  57. void
  58. PyBytecodeDispatch::STORE_NAME(int index)
  59. {
  60. OpcodeName name(fbuilder_);
  61. name.STORE_NAME(index);
  62. }
  63. void
  64. PyBytecodeDispatch::DELETE_NAME(int index)
  65. {
  66. OpcodeName name(fbuilder_);
  67. name.DELETE_NAME(index);
  68. }
  69. void
  70. PyBytecodeDispatch::LOAD_ATTR(int names_index)
  71. {
  72. OpcodeAttributes attr(fbuilder_);
  73. attr.LOAD_ATTR(names_index);
  74. }
  75. void
  76. PyBytecodeDispatch::LOAD_METHOD(int names_index)
  77. {
  78. OpcodeAttributes attr(fbuilder_);
  79. attr.LOAD_METHOD(names_index);
  80. }
  81. void
  82. PyBytecodeDispatch::STORE_ATTR(int names_index)
  83. {
  84. OpcodeAttributes attr(fbuilder_);
  85. attr.STORE_ATTR(names_index);
  86. }
  87. void
  88. PyBytecodeDispatch::DELETE_ATTR(int index)
  89. {
  90. OpcodeAttributes attr(fbuilder_);
  91. attr.DELETE_ATTR(index);
  92. }
  93. void
  94. PyBytecodeDispatch::LOAD_FAST(int index)
  95. {
  96. OpcodeLocals locals(fbuilder_);
  97. locals.LOAD_FAST(index);
  98. }
  99. void
  100. PyBytecodeDispatch::WITH_CLEANUP()
  101. {
  102. OpcodeBlock block(fbuilder_);
  103. block.WITH_CLEANUP();
  104. }
  105. void
  106. PyBytecodeDispatch::LOAD_CLOSURE(int freevars_index)
  107. {
  108. OpcodeClosure closure(fbuilder_);
  109. closure.LOAD_CLOSURE(freevars_index);
  110. }
  111. void
  112. PyBytecodeDispatch::MAKE_CLOSURE(int num_defaults)
  113. {
  114. OpcodeClosure closure(fbuilder_);
  115. closure.MAKE_CLOSURE(num_defaults);
  116. }
  117. void
  118. PyBytecodeDispatch::CALL_FUNCTION(int oparg)
  119. {
  120. OpcodeCall call(fbuilder_);
  121. call.CALL_FUNCTION(oparg);
  122. }
  123. void
  124. PyBytecodeDispatch::CALL_METHOD(int oparg)
  125. {
  126. OpcodeCall call(fbuilder_);
  127. call.CALL_METHOD(oparg);
  128. }
  129. void
  130. PyBytecodeDispatch::CALL_FUNCTION_VAR(int oparg)
  131. {
  132. OpcodeCall call(fbuilder_);
  133. call.CALL_FUNCTION_VAR(oparg);
  134. }
  135. void
  136. PyBytecodeDispatch::CALL_FUNCTION_KW(int oparg)
  137. {
  138. OpcodeCall call(fbuilder_);
  139. call.CALL_FUNCTION_KW(oparg);
  140. }
  141. void
  142. PyBytecodeDispatch::CALL_FUNCTION_VAR_KW(int oparg)
  143. {
  144. OpcodeCall call(fbuilder_);
  145. call.CALL_FUNCTION_VAR_KW(oparg);
  146. }
  147. void
  148. PyBytecodeDispatch::IMPORT_NAME()
  149. {
  150. OpcodeContainer cont(fbuilder_);
  151. cont.IMPORT_NAME();
  152. }
  153. void
  154. PyBytecodeDispatch::LOAD_DEREF(int index)
  155. {
  156. OpcodeClosure closure(fbuilder_);
  157. closure.LOAD_DEREF(index);
  158. }
  159. void
  160. PyBytecodeDispatch::STORE_DEREF(int index)
  161. {
  162. OpcodeClosure closure(fbuilder_);
  163. closure.STORE_DEREF(index);
  164. }
  165. void
  166. PyBytecodeDispatch::JUMP_FORWARD(llvm::BasicBlock *target,
  167. llvm::BasicBlock *fallthrough)
  168. {
  169. OpcodeControl control(fbuilder_);
  170. control.JUMP_FORWARD(target, fallthrough);
  171. }
  172. void
  173. PyBytecodeDispatch::JUMP_ABSOLUTE(llvm::BasicBlock *target,
  174. llvm::BasicBlock *fallthrough)
  175. {
  176. OpcodeControl control(fbuilder_);
  177. control.JUMP_ABSOLUTE(target, fallthrough);
  178. }
  179. void
  180. PyBytecodeDispatch::POP_JUMP_IF_FALSE(unsigned target_idx,
  181. unsigned fallthrough_idx,
  182. BasicBlock *target,
  183. BasicBlock *fallthrough)
  184. {
  185. OpcodeControl control(fbuilder_);
  186. control.POP_JUMP_IF_FALSE(target_idx, fallthrough_idx,
  187. target, fallthrough);
  188. }
  189. void
  190. PyBytecodeDispatch::POP_JUMP_IF_TRUE(unsigned target_idx,
  191. unsigned fallthrough_idx,
  192. BasicBlock *target,
  193. BasicBlock *fallthrough)
  194. {
  195. OpcodeControl control(fbuilder_);
  196. control.POP_JUMP_IF_TRUE(target_idx, fallthrough_idx,
  197. target, fallthrough);
  198. }
  199. void
  200. PyBytecodeDispatch::JUMP_IF_FALSE_OR_POP(unsigned target_idx,
  201. unsigned fallthrough_idx,
  202. BasicBlock *target,
  203. BasicBlock *fallthrough)
  204. {
  205. OpcodeControl control(fbuilder_);
  206. control.JUMP_IF_FALSE_OR_POP(target_idx, fallthrough_idx,
  207. target, fallthrough);
  208. }
  209. void
  210. PyBytecodeDispatch::JUMP_IF_TRUE_OR_POP(unsigned target_idx,
  211. unsigned fallthrough_idx,
  212. BasicBlock *target,
  213. BasicBlock *fallthrough)
  214. {
  215. OpcodeControl control(fbuilder_);
  216. control.JUMP_IF_TRUE_OR_POP(target_idx, fallthrough_idx,
  217. target, fallthrough);
  218. }
  219. void
  220. PyBytecodeDispatch::STORE_FAST(int index)
  221. {
  222. OpcodeLocals locals(fbuilder_);
  223. locals.STORE_FAST(index);
  224. }
  225. void
  226. PyBytecodeDispatch::DELETE_FAST(int index)
  227. {
  228. OpcodeLocals locals(fbuilder_);
  229. locals.DELETE_FAST(index);
  230. }
  231. void
  232. PyBytecodeDispatch::SETUP_LOOP(llvm::BasicBlock *target,
  233. int target_opindex,
  234. llvm::BasicBlock *fallthrough)
  235. {
  236. OpcodeBlock block(fbuilder_);
  237. block.SETUP_LOOP(target, target_opindex, fallthrough);
  238. }
  239. void
  240. PyBytecodeDispatch::GET_ITER()
  241. {
  242. OpcodeLoop loop(fbuilder_);
  243. loop.GET_ITER();
  244. }
  245. void
  246. PyBytecodeDispatch::FOR_ITER(llvm::BasicBlock *target,
  247. llvm::BasicBlock *fallthrough)
  248. {
  249. OpcodeLoop loop(fbuilder_);
  250. loop.FOR_ITER(target, fallthrough);
  251. }
  252. void
  253. PyBytecodeDispatch::POP_BLOCK()
  254. {
  255. OpcodeBlock block(fbuilder_);
  256. block.POP_BLOCK();
  257. }
  258. void
  259. PyBytecodeDispatch::SETUP_EXCEPT(llvm::BasicBlock *target,
  260. int target_opindex,
  261. llvm::BasicBlock *fallthrough)
  262. {
  263. OpcodeBlock block(fbuilder_);
  264. block.SETUP_EXCEPT(target, target_opindex, fallthrough);
  265. }
  266. void
  267. PyBytecodeDispatch::SETUP_FINALLY(llvm::BasicBlock *target,
  268. int target_opindex,
  269. llvm::BasicBlock *fallthrough)
  270. {
  271. OpcodeBlock block(fbuilder_);
  272. block.SETUP_FINALLY(target, target_opindex, fallthrough);
  273. }
  274. void
  275. PyBytecodeDispatch::END_FINALLY()
  276. {
  277. OpcodeBlock block(fbuilder_);
  278. block.END_FINALLY();
  279. }
  280. void
  281. PyBytecodeDispatch::CONTINUE_LOOP(llvm::BasicBlock *target,
  282. int target_opindex,
  283. llvm::BasicBlock *fallthrough)
  284. {
  285. OpcodeLoop loop(fbuilder_);
  286. loop.CONTINUE_LOOP(target, target_opindex, fallthrough);
  287. }
  288. void
  289. PyBytecodeDispatch::BREAK_LOOP()
  290. {
  291. OpcodeLoop loop(fbuilder_);
  292. loop.BREAK_LOOP();
  293. }
  294. void
  295. PyBytecodeDispatch::RETURN_VALUE()
  296. {
  297. OpcodeControl control(fbuilder_);
  298. control.RETURN_VALUE();
  299. }
  300. void
  301. PyBytecodeDispatch::YIELD_VALUE()
  302. {
  303. OpcodeControl control(fbuilder_);
  304. control.YIELD_VALUE();
  305. }
  306. void
  307. PyBytecodeDispatch::RAISE_VARARGS_ZERO()
  308. {
  309. OpcodeControl control(fbuilder_);
  310. control.RAISE_VARARGS_ZERO();
  311. }
  312. void
  313. PyBytecodeDispatch::RAISE_VARARGS_ONE()
  314. {
  315. OpcodeControl control(fbuilder_);
  316. control.RAISE_VARARGS_ONE();
  317. }
  318. void
  319. PyBytecodeDispatch::RAISE_VARARGS_TWO()
  320. {
  321. OpcodeControl control(fbuilder_);
  322. control.RAISE_VARARGS_TWO();
  323. }
  324. void
  325. PyBytecodeDispatch::RAISE_VARARGS_THREE()
  326. {
  327. OpcodeControl control(fbuilder_);
  328. control.RAISE_VARARGS_THREE();
  329. }
  330. void
  331. PyBytecodeDispatch::STORE_SUBSCR()
  332. {
  333. OpcodeContainer cont(fbuilder_);
  334. cont.STORE_SUBSCR();
  335. }
  336. void
  337. PyBytecodeDispatch::DELETE_SUBSCR()
  338. {
  339. OpcodeContainer cont(fbuilder_);
  340. cont.DELETE_SUBSCR();
  341. }
  342. #define BINOP_METH(OPCODE) \
  343. void \
  344. PyBytecodeDispatch::OPCODE() \
  345. { \
  346. OpcodeBinops binops(fbuilder_); \
  347. binops.OPCODE(); \
  348. }
  349. BINOP_METH(BINARY_ADD)
  350. BINOP_METH(BINARY_SUBTRACT)
  351. BINOP_METH(BINARY_MULTIPLY)
  352. BINOP_METH(BINARY_DIVIDE)
  353. BINOP_METH(BINARY_MODULO)
  354. BINOP_METH(BINARY_SUBSCR)
  355. BINOP_METH(BINARY_TRUE_DIVIDE)
  356. BINOP_METH(BINARY_LSHIFT)
  357. BINOP_METH(BINARY_RSHIFT)
  358. BINOP_METH(BINARY_OR)
  359. BINOP_METH(BINARY_XOR)
  360. BINOP_METH(BINARY_AND)
  361. BINOP_METH(BINARY_FLOOR_DIVIDE)
  362. BINOP_METH(INPLACE_ADD)
  363. BINOP_METH(INPLACE_SUBTRACT)
  364. BINOP_METH(INPLACE_MULTIPLY)
  365. BINOP_METH(INPLACE_TRUE_DIVIDE)
  366. BINOP_METH(INPLACE_DIVIDE)
  367. BINOP_METH(INPLACE_MODULO)
  368. BINOP_METH(INPLACE_LSHIFT)
  369. BINOP_METH(INPLACE_RSHIFT)
  370. BINOP_METH(INPLACE_OR)
  371. BINOP_METH(INPLACE_XOR)
  372. BINOP_METH(INPLACE_AND)
  373. BINOP_METH(INPLACE_FLOOR_DIVIDE)
  374. #undef BINOP_METH
  375. void
  376. PyBytecodeDispatch::BINARY_POWER()
  377. {
  378. OpcodeBinops binops(fbuilder_);
  379. binops.BINARY_POWER();
  380. }
  381. void
  382. PyBytecodeDispatch::INPLACE_POWER()
  383. {
  384. OpcodeBinops binops(fbuilder_);
  385. binops.INPLACE_POWER();
  386. }
  387. #define UNARYOP_METH(NAME) \
  388. void \
  389. PyBytecodeDispatch::NAME() \
  390. { \
  391. OpcodeUnaryops unary(fbuilder_); \
  392. unary.NAME(); \
  393. }
  394. UNARYOP_METH(UNARY_CONVERT)
  395. UNARYOP_METH(UNARY_INVERT)
  396. UNARYOP_METH(UNARY_POSITIVE)
  397. UNARYOP_METH(UNARY_NEGATIVE)
  398. UNARYOP_METH(UNARY_NOT)
  399. #undef UNARYOP_METH
  400. void
  401. PyBytecodeDispatch::POP_TOP()
  402. {
  403. OpcodeStack stack(fbuilder_);
  404. stack.POP_TOP();
  405. }
  406. void
  407. PyBytecodeDispatch::DUP_TOP()
  408. {
  409. OpcodeStack stack(fbuilder_);
  410. stack.DUP_TOP();
  411. }
  412. void
  413. PyBytecodeDispatch::DUP_TOP_TWO()
  414. {
  415. OpcodeStack stack(fbuilder_);
  416. stack.DUP_TOP_TWO();
  417. }
  418. void
  419. PyBytecodeDispatch::DUP_TOP_THREE()
  420. {
  421. OpcodeStack stack(fbuilder_);
  422. stack.DUP_TOP_THREE();
  423. }
  424. void
  425. PyBytecodeDispatch::ROT_TWO()
  426. {
  427. OpcodeStack stack(fbuilder_);
  428. stack.ROT_TWO();
  429. }
  430. void
  431. PyBytecodeDispatch::ROT_THREE()
  432. {
  433. OpcodeStack stack(fbuilder_);
  434. stack.ROT_THREE();
  435. }
  436. void
  437. PyBytecodeDispatch::ROT_FOUR()
  438. {
  439. OpcodeStack stack(fbuilder_);
  440. stack.ROT_FOUR();
  441. }
  442. void
  443. PyBytecodeDispatch::COMPARE_OP(int cmp_op)
  444. {
  445. OpcodeCmpops cmpops(fbuilder_);
  446. cmpops.COMPARE_OP(cmp_op);
  447. }
  448. void
  449. PyBytecodeDispatch::LIST_APPEND()
  450. {
  451. OpcodeContainer cont(fbuilder_);
  452. cont.LIST_APPEND();
  453. }
  454. void
  455. PyBytecodeDispatch::STORE_MAP()
  456. {
  457. OpcodeContainer cont(fbuilder_);
  458. cont.STORE_MAP();
  459. }
  460. void
  461. PyBytecodeDispatch::BUILD_LIST(int size)
  462. {
  463. OpcodeContainer cont(fbuilder_);
  464. cont.BUILD_LIST(size);
  465. }
  466. void
  467. PyBytecodeDispatch::BUILD_TUPLE(int size)
  468. {
  469. OpcodeContainer cont(fbuilder_);
  470. cont.BUILD_TUPLE(size);
  471. }
  472. void
  473. PyBytecodeDispatch::BUILD_MAP(int size)
  474. {
  475. OpcodeContainer cont(fbuilder_);
  476. cont.BUILD_MAP(size);
  477. }
  478. void
  479. PyBytecodeDispatch::SLICE_BOTH()
  480. {
  481. OpcodeSlice slice(fbuilder_);
  482. slice.SLICE_BOTH();
  483. }
  484. void
  485. PyBytecodeDispatch::SLICE_LEFT()
  486. {
  487. OpcodeSlice slice(fbuilder_);
  488. slice.SLICE_LEFT();
  489. }
  490. void
  491. PyBytecodeDispatch::SLICE_RIGHT()
  492. {
  493. OpcodeSlice slice(fbuilder_);
  494. slice.SLICE_RIGHT();
  495. }
  496. void
  497. PyBytecodeDispatch::SLICE_NONE()
  498. {
  499. OpcodeSlice slice(fbuilder_);
  500. slice.SLICE_NONE();
  501. }
  502. void
  503. PyBytecodeDispatch::STORE_SLICE_BOTH()
  504. {
  505. OpcodeSlice slice(fbuilder_);
  506. slice.STORE_SLICE_BOTH();
  507. }
  508. void
  509. PyBytecodeDispatch::STORE_SLICE_LEFT()
  510. {
  511. OpcodeSlice slice(fbuilder_);
  512. slice.STORE_SLICE_LEFT();
  513. }
  514. void
  515. PyBytecodeDispatch::STORE_SLICE_RIGHT()
  516. {
  517. OpcodeSlice slice(fbuilder_);
  518. slice.STORE_SLICE_RIGHT();
  519. }
  520. void
  521. PyBytecodeDispatch::STORE_SLICE_NONE()
  522. {
  523. OpcodeSlice slice(fbuilder_);
  524. slice.STORE_SLICE_NONE();
  525. }
  526. void
  527. PyBytecodeDispatch::DELETE_SLICE_BOTH()
  528. {
  529. OpcodeSlice slice(fbuilder_);
  530. slice.DELETE_SLICE_BOTH();
  531. }
  532. void
  533. PyBytecodeDispatch::DELETE_SLICE_LEFT()
  534. {
  535. OpcodeSlice slice(fbuilder_);
  536. slice.DELETE_SLICE_LEFT();
  537. }
  538. void
  539. PyBytecodeDispatch::DELETE_SLICE_RIGHT()
  540. {
  541. OpcodeSlice slice(fbuilder_);
  542. slice.DELETE_SLICE_RIGHT();
  543. }
  544. void
  545. PyBytecodeDispatch::DELETE_SLICE_NONE()
  546. {
  547. OpcodeSlice slice(fbuilder_);
  548. slice.DELETE_SLICE_NONE();
  549. }
  550. void
  551. PyBytecodeDispatch::BUILD_SLICE_TWO()
  552. {
  553. OpcodeSlice slice(fbuilder_);
  554. slice.BUILD_SLICE_TWO();
  555. }
  556. void
  557. PyBytecodeDispatch::BUILD_SLICE_THREE()
  558. {
  559. OpcodeSlice slice(fbuilder_);
  560. slice.BUILD_SLICE_THREE();
  561. }
  562. void
  563. PyBytecodeDispatch::UNPACK_SEQUENCE(int size)
  564. {
  565. OpcodeContainer cont(fbuilder_);
  566. cont.UNPACK_SEQUENCE(size);
  567. }
  568. }