|
4 | 4 | * @copyright (c) 2017 Avast Software, licensed under the MIT license
|
5 | 5 | */
|
6 | 6 |
|
7 |
| -#include <iomanip> |
8 |
| - |
9 | 7 | #include "capstone2llvmir/x86/x86_impl.h"
|
10 | 8 |
|
11 | 9 | namespace retdec {
|
@@ -2618,6 +2616,51 @@ void Capstone2LlvmIrTranslatorX86_impl::translateMul(cs_insn* i, cs_x86* xi, llv
|
2618 | 2616 | storeRegister(X86_REG_CF, f, irb);
|
2619 | 2617 | }
|
2620 | 2618 |
|
| 2619 | +/** |
| 2620 | + * X86_INS_MULX |
| 2621 | + */ |
| 2622 | +void Capstone2LlvmIrTranslatorX86_impl::translateMulx(cs_insn* i, cs_x86* xi, llvm::IRBuilder<>& irb) |
| 2623 | +{ |
| 2624 | + EXPECT_IS_TERNARY(i, xi, irb); |
| 2625 | + |
| 2626 | + llvm::IntegerType* halfT = nullptr; |
| 2627 | + llvm::IntegerType* mulT = nullptr; |
| 2628 | + uint32_t otherOp = X86_REG_INVALID; |
| 2629 | + switch (xi->operands[0].size) { |
| 2630 | + case 4: |
| 2631 | + { |
| 2632 | + halfT = irb.getInt32Ty(); |
| 2633 | + mulT = irb.getInt64Ty(); |
| 2634 | + otherOp = X86_REG_EDX; |
| 2635 | + break; |
| 2636 | + } |
| 2637 | + case 8: |
| 2638 | + { |
| 2639 | + halfT = irb.getInt64Ty(); |
| 2640 | + mulT = irb.getInt128Ty(); |
| 2641 | + otherOp = X86_REG_RDX; |
| 2642 | + break; |
| 2643 | + } |
| 2644 | + default: |
| 2645 | + { |
| 2646 | + throw GenericError("Unhandled op size in translateMulx()."); |
| 2647 | + } |
| 2648 | + } |
| 2649 | + op0 = loadOp(xi->operands[2], irb, halfT); |
| 2650 | + op1 = loadRegister(otherOp, irb, halfT); |
| 2651 | + |
| 2652 | + op0 = irb.CreateZExt(op0, mulT); |
| 2653 | + op1 = irb.CreateZExt(op1, mulT); |
| 2654 | + |
| 2655 | + auto* mul = irb.CreateMul(op0, op1); |
| 2656 | + auto* l = irb.CreateTrunc(mul, halfT); |
| 2657 | + auto* h = irb.CreateTrunc(irb.CreateLShr(mul, halfT->getBitWidth()), halfT); |
| 2658 | + |
| 2659 | + // First operand is high destination register, second operand is low |
| 2660 | + storeRegister(xi->operands[1].reg, l, irb); |
| 2661 | + storeRegister(xi->operands[0].reg, h, irb); |
| 2662 | +} |
| 2663 | + |
2621 | 2664 | /**
|
2622 | 2665 | * X86_INS_NEG
|
2623 | 2666 | */
|
|
0 commit comments