source: dev/trunk/ab5.0/abdev/compiler_x86/NumOpe_TypeOperation.cpp@ 628

Last change on this file since 628 was 461, checked in by dai_9181, 16 years ago

smoothieプロジェクトが不要になったため、破棄。

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