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

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

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

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