1 #ifndef _JITTER_CODEGEN_X86_MUL_H_
2 #define _JITTER_CODEGEN_X86_MUL_H_
3
4 template <bool isSigned>
Emit_MulTmp64RegReg(const STATEMENT & statement)5 void CCodeGen_x86::Emit_MulTmp64RegReg(const STATEMENT& statement)
6 {
7 auto dst = statement.dst->GetSymbol().get();
8 auto src1 = statement.src1->GetSymbol().get();
9 auto src2 = statement.src2->GetSymbol().get();
10
11 assert(src1->m_type == SYM_REGISTER);
12 assert(src2->m_type == SYM_REGISTER);
13
14 m_assembler.MovEd(CX86Assembler::rAX, CX86Assembler::MakeRegisterAddress(m_registers[src2->m_valueLow]));
15 if(isSigned)
16 {
17 m_assembler.ImulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
18 }
19 else
20 {
21 m_assembler.MulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
22 }
23 m_assembler.MovGd(MakeTemporary64SymbolLoAddress(dst), CX86Assembler::rAX);
24 m_assembler.MovGd(MakeTemporary64SymbolHiAddress(dst), CX86Assembler::rDX);
25 }
26
27 template <bool isSigned>
Emit_MulTmp64RegMem(const STATEMENT & statement)28 void CCodeGen_x86::Emit_MulTmp64RegMem(const STATEMENT& statement)
29 {
30 auto dst = statement.dst->GetSymbol().get();
31 auto src1 = statement.src1->GetSymbol().get();
32 auto src2 = statement.src2->GetSymbol().get();
33
34 assert(src1->m_type == SYM_REGISTER);
35
36 m_assembler.MovEd(CX86Assembler::rAX, MakeMemorySymbolAddress(src2));
37 if(isSigned)
38 {
39 m_assembler.ImulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
40 }
41 else
42 {
43 m_assembler.MulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
44 }
45 m_assembler.MovGd(MakeTemporary64SymbolLoAddress(dst), CX86Assembler::rAX);
46 m_assembler.MovGd(MakeTemporary64SymbolHiAddress(dst), CX86Assembler::rDX);
47 }
48
49 template <bool isSigned>
Emit_MulTmp64RegCst(const STATEMENT & statement)50 void CCodeGen_x86::Emit_MulTmp64RegCst(const STATEMENT& statement)
51 {
52 auto dst = statement.dst->GetSymbol().get();
53 auto src1 = statement.src1->GetSymbol().get();
54 auto src2 = statement.src2->GetSymbol().get();
55
56 assert(src1->m_type == SYM_REGISTER);
57 assert(src2->m_type == SYM_CONSTANT);
58
59 m_assembler.MovId(CX86Assembler::rAX, src2->m_valueLow);
60 if(isSigned)
61 {
62 m_assembler.ImulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
63 }
64 else
65 {
66 m_assembler.MulEd(CX86Assembler::MakeRegisterAddress(m_registers[src1->m_valueLow]));
67 }
68 m_assembler.MovGd(MakeTemporary64SymbolLoAddress(dst), CX86Assembler::rAX);
69 m_assembler.MovGd(MakeTemporary64SymbolHiAddress(dst), CX86Assembler::rDX);
70 }
71
72 template <bool isSigned>
Emit_MulTmp64MemMem(const STATEMENT & statement)73 void CCodeGen_x86::Emit_MulTmp64MemMem(const STATEMENT& statement)
74 {
75 auto dst = statement.dst->GetSymbol().get();
76 auto src1 = statement.src1->GetSymbol().get();
77 auto src2 = statement.src2->GetSymbol().get();
78
79 m_assembler.MovEd(CX86Assembler::rAX, MakeMemorySymbolAddress(src2));
80 if(isSigned)
81 {
82 m_assembler.ImulEd(MakeMemorySymbolAddress(src1));
83 }
84 else
85 {
86 m_assembler.MulEd(MakeMemorySymbolAddress(src1));
87 }
88 m_assembler.MovGd(MakeTemporary64SymbolLoAddress(dst), CX86Assembler::rAX);
89 m_assembler.MovGd(MakeTemporary64SymbolHiAddress(dst), CX86Assembler::rDX);
90 }
91
92 template <bool isSigned>
Emit_MulTmp64MemCst(const STATEMENT & statement)93 void CCodeGen_x86::Emit_MulTmp64MemCst(const STATEMENT& statement)
94 {
95 auto dst = statement.dst->GetSymbol().get();
96 auto src1 = statement.src1->GetSymbol().get();
97 auto src2 = statement.src2->GetSymbol().get();
98
99 assert(src2->m_type == SYM_CONSTANT);
100
101 m_assembler.MovId(CX86Assembler::rAX, src2->m_valueLow);
102 if(isSigned)
103 {
104 m_assembler.ImulEd(MakeMemorySymbolAddress(src1));
105 }
106 else
107 {
108 m_assembler.MulEd(MakeMemorySymbolAddress(src1));
109 }
110 m_assembler.MovGd(MakeTemporary64SymbolLoAddress(dst), CX86Assembler::rAX);
111 m_assembler.MovGd(MakeTemporary64SymbolHiAddress(dst), CX86Assembler::rDX);
112 }
113
114 #endif
115