source: dev/trunk/ab5.0/abdev/BasicCompiler32/NumOpe_Logical.cpp@ 465

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

Messenger/ErrorMessengerクラスを導入。SetError関数によるエラー生成を廃止した。

File size: 10.4 KB
RevLine 
[206]1#include "stdafx.h"
2
[225]3#include <Compiler.h>
4
[3]5#include "../BasicCompiler_Common/common.h"
6#include "Opcode.h"
7
8BOOL Calc_Xor(int *type,LONG_PTR *index_stack,int *pStackPointer){
9 //value[sp-2] xor= value[sp-1]
10 //xor演算
11
12 int sp;
13 sp=*pStackPointer;
14
15 if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
16 //いずれかの項が実数のとき
[465]17 compiler.errorMessenger.Output(45,"xor",cp);
[3]18 return 0;
19 }
20
21 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
22 type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
23 ////////////////////
24 // 64ビット整数演算
25 ////////////////////
26
27 //第2項を64ビットに対応させる
28 if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
29 //第2項が64ビット整数値のとき
30
31 //pop ebx
[225]32 compiler.codeGenerator.op_pop(REG_EBX);
[3]33
34 //pop ecx
[225]35 compiler.codeGenerator.op_pop(REG_ECX);
[3]36 }
37 else{
38 //第2項がその他整数値のとき
39
40 //pop eax
[225]41 compiler.codeGenerator.op_pop(REG_EAX);
[3]42
43 if(IsSignedType(type[sp-1])){
44 //符号拡張
45 //edx:eax ← eax
46
47 //cdq
[225]48 compiler.codeGenerator.op_cdq();
[3]49 }
50 else{
51 //ビット拡張
52 //edx:eax ← eax
53
54 //xor edx,edx
[225]55 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]56 }
57
58 //mov ebx,eax
[225]59 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
[3]60
61 //mov ecx,edx
[225]62 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
[3]63 }
64
65 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
66 //第1項が64ビット整数値のとき
67
68 //xor dword ptr[esp],ebx
[225]69 compiler.codeGenerator.PutOld(
70 (char)0x31,
71 (char)0x1C,
72 (char)0x24
73 );
[3]74
75 //xor dword ptr[esp+sizeof(long)],ecx
[225]76 compiler.codeGenerator.PutOld(
77 (char)0x31,
78 (char)0x4C,
79 (char)0x24,
80 (char)0x04
81 );
[3]82 }
83 else{
84 //第1項がその他整数値のとき
85 if(IsSignedType(type[sp-2])){
86 //pop eax
[225]87 compiler.codeGenerator.op_pop(REG_EAX);
[3]88
89 //符号拡張
90 //edx:eax ← eax
91
92 //cdq
[225]93 compiler.codeGenerator.op_cdq();
[3]94 }
95 else{
96 //pop eax
[225]97 compiler.codeGenerator.op_pop(REG_EAX);
[3]98
99 //ビット拡張
100 //edx:eax ← eax
101
102 //xor edx,edx
[225]103 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]104 }
105
106 //xor ebx,eax
[225]107 compiler.codeGenerator.op_xor_RR( REG_EBX, REG_EAX );
[3]108
109 //xor ecx,edx
[225]110 compiler.codeGenerator.op_xor_RR( REG_ECX, REG_EDX );
[3]111
112 //push ecx
[225]113 compiler.codeGenerator.op_push(REG_ECX);
[3]114
115 //push ebx
[225]116 compiler.codeGenerator.op_push(REG_EBX);
[3]117 }
118
119 sp--;
120 if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
121 else type[sp-1]=DEF_INT64;
122 }
123 else{
124 ////////////////////
125 // 整数演算
126 ////////////////////
127
128 //pop ebx
[225]129 compiler.codeGenerator.op_pop(REG_EBX);
[3]130
131 //pop eax
[225]132 compiler.codeGenerator.op_pop(REG_EAX);
[3]133
134 //sub esp,4
[225]135 compiler.codeGenerator.op_sub_esp(4);
[3]136
137 //xor eax,ebx
[225]138 compiler.codeGenerator.op_xor_RR( REG_EAX, REG_EBX );
[3]139
140 //mov dword ptr[esp],eax
[225]141 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
[3]142
143 sp--;
144 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
145 }
146
147 *pStackPointer=sp;
148 return 1;
149}
150
151BOOL Calc_Or(int *type,LONG_PTR *index_stack,int *pStackPointer){
152 //value[sp-2] or= value[sp-1]
153 //or演算
154
155 int sp;
156 sp=*pStackPointer;
157
158 if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
159 //いずれかの項が実数のとき
[465]160 compiler.errorMessenger.Output(45,"or",cp);
[3]161 return 0;
162 }
163
164 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
165 type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
166 ////////////////////
167 // 64ビット整数演算
168 ////////////////////
169
170 //第2項を64ビットに対応させる
171 if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
172 //第2項が64ビット整数値のとき
173
174 //pop ebx
[225]175 compiler.codeGenerator.op_pop(REG_EBX);
[3]176
177 //pop ecx
[225]178 compiler.codeGenerator.op_pop(REG_ECX);
[3]179 }
180 else{
181 //第2項が32ビット整数値のとき
182
183 //pop eax
[225]184 compiler.codeGenerator.op_pop(REG_EAX);
[3]185
186 if(IsSignedType(type[sp-1])){
187 //符号拡張
188 //edx:eax ← eax
189
190 //cdq
[225]191 compiler.codeGenerator.op_cdq();
[3]192 }
193 else{
194 //ビット拡張
195 //edx:eax ← eax
196
197 //xor edx,edx
[225]198 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]199 }
200
201 //mov ebx,eax
[225]202 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
[3]203
204 //mov ecx,edx
[225]205 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
[3]206 }
207
208 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
209 //第1項が64ビット整数値のとき
210
211 //or dword ptr[esp],ebx
[225]212 compiler.codeGenerator.PutOld(
213 (char)0x09,
214 (char)0x1C,
215 (char)0x24
216 );
[3]217
218 //or dword ptr[esp+sizeof(long)],ecx
[225]219 compiler.codeGenerator.PutOld(
220 (char)0x09,
221 (char)0x4C,
222 (char)0x24,
223 (char)0x04
224 );
[3]225 }
226 else{
227 //第1項が32ビット整数値のとき
228 if(IsSignedType(type[sp-2])){
229 //pop eax
[225]230 compiler.codeGenerator.op_pop(REG_EAX);
[3]231
232 //符号拡張
233 //edx:eax ← eax
234
235 //cdq
[225]236 compiler.codeGenerator.op_cdq();
[3]237 }
238 else{
239 //pop eax
[225]240 compiler.codeGenerator.op_pop(REG_EAX);
[3]241
242 //ビット拡張
243 //edx:eax ← eax
244
245 //xor edx,edx
[225]246 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]247 }
248
249 //or ebx,eax
[225]250 compiler.codeGenerator.op_or_RR( sizeof(long), REG_EBX, REG_EAX );
[3]251
252 //or ecx,edx
[225]253 compiler.codeGenerator.op_or_RR( sizeof(long), REG_ECX, REG_EDX );
[3]254
255 //push ecx
[225]256 compiler.codeGenerator.op_push(REG_ECX);
[3]257
258 //push ebx
[225]259 compiler.codeGenerator.op_push(REG_EBX);
[3]260 }
261
262 sp--;
263 if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
264 else type[sp-1]=DEF_INT64;
265 }
266 else{
267 ////////////////////
268 // 32ビット整数演算
269 ////////////////////
270
271 //pop ebx
[225]272 compiler.codeGenerator.op_pop(REG_EBX);
[3]273
274 //pop eax
[225]275 compiler.codeGenerator.op_pop(REG_EAX);
[3]276
277 //sub esp,4
[225]278 compiler.codeGenerator.op_sub_esp(4);
[3]279
280 //or eax,ebx
[225]281 compiler.codeGenerator.op_or_RR( sizeof(long), REG_EAX, REG_EBX );
[3]282
283 //mov dword ptr[esp],eax
[225]284 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
[3]285
286 sp--;
287 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
288 }
289
290 *pStackPointer=sp;
291 return 1;
292}
293
294BOOL Calc_And(int *type,LONG_PTR *index_stack,int *pStackPointer){
295 //value[sp-2] and= value[sp-1]
296 //and演算
297
298 int sp;
299 sp=*pStackPointer;
300
301 if(IsRealNumberType(type[sp-2])||IsRealNumberType(type[sp-1])){
302 //いずれかの項が実数のとき
[465]303 compiler.errorMessenger.Output(45,"and",cp);
[3]304 return 0;
305 }
306
307 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD||
308 type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
309 ////////////////////
310 // 64ビット整数演算
311 ////////////////////
312
313 //第2項を64ビットに対応させる
314 if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
315 //第2項が64ビット整数値のとき
316
317 //pop ebx
[225]318 compiler.codeGenerator.op_pop(REG_EBX);
[3]319
320 //pop ecx
[225]321 compiler.codeGenerator.op_pop(REG_ECX);
[3]322 }
323 else{
324 //第2項が32ビット整数値のとき
325
326 //pop eax
[225]327 compiler.codeGenerator.op_pop(REG_EAX);
[3]328
329 if(IsSignedType(type[sp-1])){
330 //符号拡張
331 //edx:eax ← eax
332
333 //cdq
[225]334 compiler.codeGenerator.op_cdq();
[3]335 }
336 else{
337 //ビット拡張
338 //edx:eax ← eax
339
340 //xor edx,edx
[225]341 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]342 }
343
344 //mov ebx,eax
[225]345 compiler.codeGenerator.op_mov_RR( REG_EBX, REG_EAX );
[3]346
347 //mov ecx,edx
[225]348 compiler.codeGenerator.op_mov_RR( REG_ECX, REG_EDX );
[3]349 }
350
351 if(type[sp-2]==DEF_INT64||type[sp-2]==DEF_QWORD){
352 //第1項が64ビット整数値のとき
353
354 //and dword ptr[esp],ebx
[225]355 compiler.codeGenerator.PutOld(
356 (char)0x21,
357 (char)0x1C,
358 (char)0x24
359 );
[3]360
361 //and dword ptr[esp+sizeof(long)],ecx
[225]362 compiler.codeGenerator.PutOld(
363 (char)0x21,
364 (char)0x4C,
365 (char)0x24,
366 (char)0x04
367 );
[3]368 }
369 else{
370 //第1項が32ビット整数値のとき
371 if(IsSignedType(type[sp-2])){
372 //pop eax
[225]373 compiler.codeGenerator.op_pop(REG_EAX);
[3]374
375 //符号拡張
376 //edx:eax ← eax
377
378 //cdq
[225]379 compiler.codeGenerator.op_cdq();
[3]380 }
381 else{
382 //pop eax
[225]383 compiler.codeGenerator.op_pop(REG_EAX);
[3]384
385 //ビット拡張
386 //edx:eax ← eax
387
388 //xor edx,edx
[225]389 compiler.codeGenerator.op_zero_reg(REG_EDX);
[3]390 }
391
392 //and ebx,eax
[225]393 compiler.codeGenerator.op_and_RR( REG_EBX, REG_EAX );
[3]394
395 //and ecx,edx
[225]396 compiler.codeGenerator.op_and_RR( REG_ECX, REG_EDX );
[3]397
398 //push ecx
[225]399 compiler.codeGenerator.op_push(REG_ECX);
[3]400
401 //push ebx
[225]402 compiler.codeGenerator.op_push(REG_EBX);
[3]403 }
404
405 sp--;
406 if(type[sp-1]==DEF_QWORD&&type[sp]==DEF_QWORD) type[sp-1]=DEF_QWORD;
407 else type[sp-1]=DEF_INT64;
408 }
409 else{
410 ////////////////////
411 // 32ビット整数演算
412 ////////////////////
413
414 //pop ebx
[225]415 compiler.codeGenerator.op_pop(REG_EBX);
[3]416
417 //pop eax
[225]418 compiler.codeGenerator.op_pop(REG_EAX);
[3]419
420 //sub esp,4
[225]421 compiler.codeGenerator.op_sub_esp(4);
[3]422
423 //and eax,ebx
[225]424 compiler.codeGenerator.op_and_RR( REG_EAX, REG_EBX );
[3]425
426 //mov dword ptr[esp],eax
[225]427 compiler.codeGenerator.op_mov_MR( sizeof(long), REG_EAX, REG_ESP, 0, MOD_BASE );
[3]428
429 sp--;
430 type[sp-1]=NeutralizationType(type[sp-1],index_stack[sp-1],type[sp],index_stack[sp]);
431 }
432
433 *pStackPointer=sp;
434 return 1;
435}
436
437BOOL Calc_Not(int *type,int sp){
438 //value[sp-1]=Not value[sp-1]
439 //NOT演算子
440
441 if(IsRealNumberType(type[sp-1])){
442 //実数のとき
[465]443 compiler.errorMessenger.Output(45,"Not",cp);
[3]444 return 0;
445 }
446
[36]447 if( type[sp - 1] == DEF_BOOLEAN ){
448 //pop eax
[225]449 compiler.codeGenerator.op_pop( REG_EAX );
[36]450
451 //cmp eax,0
[308]452 compiler.codeGenerator.op_cmp_value(Type(type[sp-1]).GetSize(),REG_EAX,0);
[36]453
454 //setne al
[225]455 compiler.codeGenerator.op_setne( REG_EAX );
[36]456
457 //and eax,000000FFh
[225]458 compiler.codeGenerator.op_and_RV(REG_EAX,(int)0xFF);
[36]459
460 //neg
[225]461 compiler.codeGenerator.op_neg( REG_EAX );
[36]462
463 //sbb eax, eax
[225]464 compiler.codeGenerator.op_sbb_RR( REG_EAX, REG_EAX );
[36]465
466 //add eax, 1
[225]467 compiler.codeGenerator.op_add_RV8( REG_EAX, 1 );
[36]468
469 //push eax
[225]470 compiler.codeGenerator.op_push( REG_EAX );
[36]471 }
472 else if(type[sp-1]==DEF_INT64||type[sp-1]==DEF_QWORD){
[3]473 ////////////////////
474 // 64ビット整数演算
475 ////////////////////
476
477 //not dword ptr[esp]
[225]478 compiler.codeGenerator.PutOld(
479 (char)0xF7,
480 (char)0x14,
481 (char)0x24
482 );
[3]483
484 //not dword ptr[esp+4]
[225]485 compiler.codeGenerator.PutOld(
486 (char)0xF7,
487 (char)0x54,
488 (char)0x24,
489 (char)0x04
490 );
[3]491 }
492 else{
493 ////////////////////
494 // 32ビット整数演算
495 ////////////////////
496
497 //not dword ptr[esp]
[225]498 compiler.codeGenerator.PutOld(
499 (char)0xF7,
500 (char)0x14,
501 (char)0x24
502 );
[3]503 }
504
505 return 1;
506}
Note: See TracBrowser for help on using the repository browser.