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

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