source: dev/trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp@ 366

Last change on this file since 366 was 290, checked in by dai_9181, 17 years ago

ジェネリクスのベースを実装

File size: 4.2 KB
Line 
1#include "stdafx.h"
2
3#include <jenga/include/smoothie/Smoothie.h>
4
5#include <Compiler.h>
6
7#include "../BasicCompiler_Common/common.h"
8#include "Opcode.h"
9
10void ExtendStackTo32( const Type &oldType );
11
12void ExtendStackTo64( const Type &oldType )
13{
14 if( oldType.Is64() )
15 {
16 return;
17 }
18
19 //32ビットに拡張
20 ExtendStackTo32( oldType );
21
22 //64ビットに拡張
23 if( oldType.IsSigned() )
24 {
25 //符号あり
26
27 //pop eax
28 compiler.codeGenerator.op_pop(REG_EAX);
29
30 //cdq
31 compiler.codeGenerator.op_cdq();
32
33 //push edx
34 compiler.codeGenerator.op_push(REG_EDX);
35
36 //push eax
37 compiler.codeGenerator.op_push(REG_EAX);
38 }
39 else{
40 //符号なし
41
42 //pop eax
43 compiler.codeGenerator.op_pop(REG_EAX);
44
45 //push 0
46 compiler.codeGenerator.op_push_V(0);
47
48 //push eax
49 compiler.codeGenerator.op_push(REG_EAX);
50 }
51}
52void ExtendStackTo32( const Type &oldType )
53{
54 if( oldType.GetSize() == sizeof(long) )
55 {
56 return;
57 }
58
59 if( oldType.Is64() )
60 {
61 //pop eax
62 compiler.codeGenerator.op_pop(REG_EAX);
63
64 //pop edx
65 compiler.codeGenerator.op_pop(REG_EDX);
66
67 //push eax
68 compiler.codeGenerator.op_push(REG_EAX);
69 }
70 else if( oldType.IsInteger() )
71 {
72 //pop eax
73 compiler.codeGenerator.op_pop(REG_EAX);
74
75 //movsx eax,ax
76 compiler.codeGenerator.op_movsx_R32R16( REG_EAX );
77
78 //push eax
79 compiler.codeGenerator.op_push(REG_EAX);
80 }
81 else if( oldType.IsWord() )
82 {
83 //pop eax
84 compiler.codeGenerator.op_pop(REG_EAX);
85
86 //and eax,0000FFFFh
87 compiler.codeGenerator.op_and_RV( REG_EAX, 0x0000FFFF );
88
89 //push eax
90 compiler.codeGenerator.op_push(REG_EAX);
91 }
92 else if( oldType.IsSByte() )
93 {
94 //pop eax
95 compiler.codeGenerator.op_pop(REG_EAX);
96
97 //movsx eax,al
98 compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
99
100 //push eax
101 compiler.codeGenerator.op_push(REG_EAX);
102 }
103 else if( oldType.IsByte() || oldType.IsBoolean() )
104 {
105 //pop eax
106 compiler.codeGenerator.op_pop(REG_EAX);
107
108 //and eax,000000FFh
109 compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
110
111 //push eax
112 compiler.codeGenerator.op_push(REG_EAX);
113 }
114}
115void ExtendStackTo16( const Type &oldType ){
116 if( oldType.IsSByte() )
117 {
118 //pop eax
119 compiler.codeGenerator.op_pop(REG_EAX);
120
121 //movsx eax,al
122 compiler.codeGenerator.op_movsx_R32R8( REG_EAX );
123
124 //push eax
125 compiler.codeGenerator.op_push(REG_EAX);
126 }
127 else if( oldType.IsByte() )
128 {
129 //pop eax
130 compiler.codeGenerator.op_pop(REG_EAX);
131
132 //and eax,000000FFh
133 compiler.codeGenerator.op_and_RV( REG_EAX, 0x000000FF );
134
135 //push eax
136 compiler.codeGenerator.op_push(REG_EAX);
137 }
138}
139void ExtendStackTo8( const Type &oldType )
140{
141 if( oldType.Is64() )
142 {
143 //pop eax
144 compiler.codeGenerator.op_pop(REG_EAX);
145
146 //pop edx
147 compiler.codeGenerator.op_pop(REG_EDX);
148
149 //push eax
150 compiler.codeGenerator.op_push(REG_EAX);
151 }
152}
153
154
155void ChangeTypeToWhole( const Type &oldType, const Type &newType ){
156 if( oldType.IsDouble() )
157 {
158 if( newType.Is64() )
159 {
160 //fld qword ptr[esp]
161 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
162
163 //fistp qword ptr[esp]
164 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
165 }
166 else{
167 //fld qword ptr[esp]
168 compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
169
170 //add esp,4
171 compiler.codeGenerator.op_add_esp(4);
172
173 //fistp dword ptr[esp]
174 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
175 }
176 }
177 else if( oldType.IsSingle() )
178 {
179 if( newType.Is64() )
180 {
181 //fld dword ptr[esp]
182 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
183
184 //sub esp,4
185 compiler.codeGenerator.op_sub_esp(4);
186
187 //fistp qword ptr[esp]
188 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(_int64) );
189 }
190 else{
191 //fld dword ptr[esp]
192 compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
193
194 //fistp dword ptr[esp]
195 compiler.codeGenerator.op_fistp_ptr_esp( sizeof(long) );
196 }
197 }
198 else{
199 //整数から整数へ変換
200
201 if( newType.Is64() )
202 {
203 ExtendStackTo64( oldType );
204 }
205 else if( newType.GetSize()==sizeof(long)){
206 ExtendStackTo32( oldType );
207 }
208 else if( newType.GetSize()==sizeof(short)){
209 ExtendStackTo16( oldType );
210 }
211 else if( newType.GetSize()==sizeof(char)){
212 ExtendStackTo8( oldType );
213 }
214 }
215}
Note: See TracBrowser for help on using the repository browser.