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

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