Ignore:
Timestamp:
Aug 21, 2007, 11:00:25 PM (17 years ago)
Author:
dai_9181
Message:

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

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/abdev/BasicCompiler32/NumOpe_TypeOperation.cpp

    r235 r290  
    88#include "Opcode.h"
    99
    10 void ExtendStackTo32(int type);
    11 void ExtendStackTo64(int type){
    12     if(Is64Type(type)) return;
     10void ExtendStackTo32( const Type &oldType );
     11
     12void ExtendStackTo64( const Type &oldType )
     13{
     14    if( oldType.Is64() )
     15    {
     16        return;
     17    }
    1318
    1419    //32ビットに拡張
    15     ExtendStackTo32(type);
     20    ExtendStackTo32( oldType );
    1621
    1722    //64ビットに拡張
    18     if(IsSignedType(type)){
     23    if( oldType.IsSigned() )
     24    {
    1925        //符号あり
    2026
     
    4450    }
    4551}
    46 void ExtendStackTo32(int type){
    47     if(GetTypeSize(type,-1)==sizeof(long)) return;
    48 
    49     if(Is64Type(type)){
     52void ExtendStackTo32( const Type &oldType )
     53{
     54    if( oldType.GetSize() == sizeof(long) )
     55    {
     56        return;
     57    }
     58
     59    if( oldType.Is64() )
     60    {
    5061        //pop eax
    5162        compiler.codeGenerator.op_pop(REG_EAX);
     
    5768        compiler.codeGenerator.op_push(REG_EAX);
    5869    }
    59     else if(type==DEF_INTEGER || (Smoothie::IsUnicode()&&type==DEF_CHAR)){
     70    else if( oldType.IsInteger() )
     71    {
    6072        //pop eax
    6173        compiler.codeGenerator.op_pop(REG_EAX);
     
    6779        compiler.codeGenerator.op_push(REG_EAX);
    6880    }
    69     else if(type==DEF_WORD){
     81    else if( oldType.IsWord() )
     82    {
    7083        //pop eax
    7184        compiler.codeGenerator.op_pop(REG_EAX);
     
    7790        compiler.codeGenerator.op_push(REG_EAX);
    7891    }
    79     else if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
     92    else if( oldType.IsSByte() )
     93    {
    8094        //pop eax
    8195        compiler.codeGenerator.op_pop(REG_EAX);
     
    87101        compiler.codeGenerator.op_push(REG_EAX);
    88102    }
    89     else if(type==DEF_BYTE||type==DEF_BOOLEAN){
     103    else if( oldType.IsByte() || oldType.IsBoolean() )
     104    {
    90105        //pop eax
    91106        compiler.codeGenerator.op_pop(REG_EAX);
     
    98113    }
    99114}
    100 void ExtendStackTo16(int type){
    101     if(type==DEF_SBYTE || (Smoothie::IsUnicode()==false&&type==DEF_CHAR)){
     115void ExtendStackTo16( const Type &oldType ){
     116    if( oldType.IsSByte() )
     117    {
    102118        //pop eax
    103119        compiler.codeGenerator.op_pop(REG_EAX);
     
    109125        compiler.codeGenerator.op_push(REG_EAX);
    110126    }
    111     else if(type==DEF_BYTE){
     127    else if( oldType.IsByte() )
     128    {
    112129        //pop eax
    113130        compiler.codeGenerator.op_pop(REG_EAX);
     
    120137    }
    121138}
    122 void ExtendStackTo8(int type){
    123     if(Is64Type(type)){
     139void ExtendStackTo8( const Type &oldType )
     140{
     141    if( oldType.Is64() )
     142    {
    124143        //pop eax
    125144        compiler.codeGenerator.op_pop(REG_EAX);
     
    134153
    135154
    136 void ChangeTypeToWhole(int OldType,int NewType){
    137     if(OldType==DEF_DOUBLE){
    138         if(Is64Type(NewType)){
     155void ChangeTypeToWhole( const Type &oldType, const Type &newType ){
     156    if( oldType.IsDouble() )
     157    {
     158        if( newType.Is64() )
     159        {
    139160            //fld qword ptr[esp]
    140161            compiler.codeGenerator.op_fld_ptr_esp(DEF_DOUBLE);
     
    154175        }
    155176    }
    156     else if(OldType==DEF_SINGLE){
    157         if(Is64Type(NewType)){
     177    else if( oldType.IsSingle() )
     178    {
     179        if( newType.Is64() )
     180        {
    158181            //fld dword ptr[esp]
    159182            compiler.codeGenerator.op_fld_ptr_esp(DEF_SINGLE);
     
    176199        //整数から整数へ変換
    177200
    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 }
     201        if( newType.Is64() )
     202        {
     203            ExtendStackTo64( oldType );
     204        }
     205        else if( newType.GetSize()==sizeof(long)){
     206            ExtendStackTo32( oldType );
     207        }
     208        else if( newType.GetSize()==sizeof(short)){
     209            ExtendStackTo16( oldType );
     210        }
     211        else if( newType.GetSize()==sizeof(char)){
     212            ExtendStackTo8( oldType );
     213        }
     214    }
     215}
Note: See TracChangeset for help on using the changeset viewer.