source: dev/trunk/ab5.0/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp@ 461

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

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

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