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