Advertisement
Guest User

Untitled

a guest
Jul 21st, 2019
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 6.23 KB | None | 0 0
  1. struct BinaryNode : public Node
  2. {
  3. NodePtr node_0;
  4. NodePtr node_1;
  5. xed_iclass_enum_t cls;
  6.  
  7. BinaryNode(const NodePtr &node_0, const NodePtr &node_1,
  8. xed_iclass_enum_t cls) : Node(node_0->width), node_0(node_0), node_1(node_1), cls(cls)
  9. {
  10. expect(node_0->width == node_1->width);
  11.  
  12. eval_const();
  13. }
  14.  
  15. void eval_const()
  16. {
  17. if ((node_0->const_value.type == ConstValueType::Invalid) || (node_1->const_value.type == ConstValueType::Invalid))
  18. return;
  19.  
  20. uint64_t value = 0;
  21.  
  22. switch (cls)
  23. {
  24. case XED_ICLASS_AND:
  25. switch (width)
  26. {
  27. case 8: value = node_0->const_value.value8 & node_1->const_value.value8; break;
  28. case 16: value = node_0->const_value.value16 & node_1->const_value.value16; break;
  29. case 32: value = node_0->const_value.value32 & node_1->const_value.value32; break;
  30. case 64: value = node_0->const_value.value64 & node_1->const_value.value64; break;
  31. default:
  32. expect(false);
  33. }
  34. break;
  35.  
  36. case XED_ICLASS_OR:
  37. switch (width)
  38. {
  39. case 8: value = node_0->const_value.value8 | node_1->const_value.value8; break;
  40. case 16: value = node_0->const_value.value16 | node_1->const_value.value16; break;
  41. case 32: value = node_0->const_value.value32 | node_1->const_value.value32; break;
  42. case 64: value = node_0->const_value.value64 | node_1->const_value.value64; break;
  43. default:
  44. expect(false);
  45. }
  46. break;
  47.  
  48. case XED_ICLASS_XOR:
  49. switch (width)
  50. {
  51. case 8: value = node_0->const_value.value8 ^ node_1->const_value.value8; break;
  52. case 16: value = node_0->const_value.value16 ^ node_1->const_value.value16; break;
  53. case 32: value = node_0->const_value.value32 ^ node_1->const_value.value32; break;
  54. case 64: value = node_0->const_value.value64 ^ node_1->const_value.value64; break;
  55. default:
  56. expect(false);
  57. }
  58. break;
  59.  
  60. case XED_ICLASS_ADD:
  61. switch (width)
  62. {
  63. case 8: value = node_0->const_value.value8 + node_1->const_value.value8; break;
  64. case 16: value = node_0->const_value.value16 + node_1->const_value.value16; break;
  65. case 32: value = node_0->const_value.value32 + node_1->const_value.value32; break;
  66. case 64: value = node_0->const_value.value64 + node_1->const_value.value64; break;
  67. default:
  68. expect(false);
  69. }
  70. break;
  71.  
  72. case XED_ICLASS_SUB:
  73. switch (width)
  74. {
  75. case 8: value = node_0->const_value.value8 - node_1->const_value.value8; break;
  76. case 16: value = node_0->const_value.value16 - node_1->const_value.value16; break;
  77. case 32: value = node_0->const_value.value32 - node_1->const_value.value32; break;
  78. case 64: value = node_0->const_value.value64 - node_1->const_value.value64; break;
  79. default:
  80. expect(false);
  81. }
  82. break;
  83.  
  84. case XED_ICLASS_SHL:
  85. switch (width)
  86. {
  87. case 8: value = node_0->const_value.value8 << node_1->const_value.value8; break;
  88. case 16: value = node_0->const_value.value16 << node_1->const_value.value16; break;
  89. case 32: value = node_0->const_value.value32 << node_1->const_value.value32; break;
  90. case 64: value = node_0->const_value.value64 << node_1->const_value.value64; break;
  91. default:
  92. expect(false);
  93. }
  94. break;
  95.  
  96. case XED_ICLASS_SHR:
  97. switch (width)
  98. {
  99. case 8: value = node_0->const_value.value8 >> node_1->const_value.value8; break;
  100. case 16: value = node_0->const_value.value16 >> node_1->const_value.value16; break;
  101. case 32: value = node_0->const_value.value32 >> node_1->const_value.value32; break;
  102. case 64: value = node_0->const_value.value64 >> node_1->const_value.value64; break;
  103. default:
  104. expect(false);
  105. }
  106. break;
  107.  
  108. default:
  109. expect(false);
  110. }
  111.  
  112. ConstValueType type = pick_type(node_0->const_value.type, node_1->const_value.type);
  113. const_value = ConstValue(value, type);
  114. }
  115.  
  116. void to_string(std::ostream &o) const override
  117. {
  118. o << cls;
  119. }
  120.  
  121. NodePtr get_prev_0() const override
  122. {
  123. return node_0;
  124. }
  125.  
  126. NodePtr get_prev_1() const override
  127. {
  128. return node_1;
  129. }
  130.  
  131. llvm::Value *eval_impl(IrFunc &ir) override
  132. {
  133. llvm::Value *value_0 = ir(node_0);
  134. llvm::Value *value_1 = ir(node_1);
  135. expect(value_0->getType() == value_1->getType());
  136.  
  137. switch (cls)
  138. {
  139. case XED_ICLASS_SUB:
  140. return ir.builder.CreateSub(value_0, value_1);
  141.  
  142. case XED_ICLASS_ADD:
  143. return ir.builder.CreateAdd(value_0, value_1);
  144.  
  145. case XED_ICLASS_OR:
  146. return ir.builder.CreateOr(value_0, value_1);
  147.  
  148. case XED_ICLASS_AND:
  149. return ir.builder.CreateAnd(value_0, value_1);
  150.  
  151. case XED_ICLASS_XOR:
  152. return ir.builder.CreateXor(value_0, value_1);
  153.  
  154. case XED_ICLASS_SHR:
  155. return ir.builder.CreateLShr(value_0, value_1);
  156.  
  157. case XED_ICLASS_SHL:
  158. return ir.builder.CreateShl(value_0, value_1);
  159.  
  160. default:
  161. expect(false);
  162. }
  163. }
  164. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement