[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] | 10 | void ExtendStackTo32( const Type &oldType );
|
---|
[3] | 11 |
|
---|
[290] | 12 | void 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] | 52 | void 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] | 115 | void 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] | 139 | void 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] | 155 | void 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 | }
|
---|