OpenCores
URL https://opencores.org/ocsvn/raptor64/raptor64/trunk

Subversion Repositories raptor64

[/] [raptor64/] [trunk/] [software/] [c64/] [source/] [CodeGenerator.c] - Diff between revs 37 and 51

Show entire file | Details | Blame | View Log

Rev 37 Rev 51
Line 293... Line 293...
        ap1 = GenerateExpression(node->p[0],F_REG,8);
        ap1 = GenerateExpression(node->p[0],F_REG,8);
        ap2 = GenerateExpression(node->p[1],F_REG,8);
        ap2 = GenerateExpression(node->p[1],F_REG,8);
        ap1->mode = am_indx2;
        ap1->mode = am_indx2;
        ap1->sreg = ap2->preg;
        ap1->sreg = ap2->preg;
                ap1->offset = makeinode(en_icon,0);
                ap1->offset = makeinode(en_icon,0);
 
                ap1->scale = node->scale;
        return ap1;
        return ap1;
    }
    }
    ap1 = GenerateExpression(node->p[0],F_REG | F_IMMED,8);
    ap1 = GenerateExpression(node->p[0],F_REG | F_IMMED,8);
    if( ap1->mode == am_immed )
    if( ap1->mode == am_immed )
    {
    {
Line 320... Line 321...
//      ap3 = GetTempRegister();
//      ap3 = GetTempRegister();
//      GenerateTriadic(op_addu,0,ap3,ap1,ap2);             /* add left to address reg */
//      GenerateTriadic(op_addu,0,ap3,ap1,ap2);             /* add left to address reg */
    ap1->mode = am_indx2;            /* make indirect */
    ap1->mode = am_indx2;            /* make indirect */
        ap1->sreg = ap2->preg;
        ap1->sreg = ap2->preg;
        ap1->offset = makeinode(en_icon,0);
        ap1->offset = makeinode(en_icon,0);
 
        ap1->scale = node->scale;
//  ReleaseTempRegister(ap2);                    /* release any temps in ap2 */
//  ReleaseTempRegister(ap2);                    /* release any temps in ap2 */
//      ReleaseTempRegister(ap1);
//      ReleaseTempRegister(ap1);
    return ap1;                     /* return indirect */
    return ap1;                     /* return indirect */
}
}
 
 
Line 476... Line 478...
 *      generate code to evaluate a mod operator or a divide
 *      generate code to evaluate a mod operator or a divide
 *      operator.
 *      operator.
 */
 */
AMODE *GenerateModDiv(ENODE *node,int flags,int size, int op)
AMODE *GenerateModDiv(ENODE *node,int flags,int size, int op)
{
{
        AMODE *ap1, *ap2;
        AMODE *ap1, *ap2, *ap3;
 
 
    if( node->p[0]->nodetype == en_icon )
    if( node->p[0]->nodetype == en_icon )
         swap_nodes(node);
         swap_nodes(node);
    ap1 = GenerateExpression(node->p[0],F_REG,8);
    ap1 = GenerateExpression(node->p[0],F_REG,8);
    ap2 = GenerateExpression(node->p[1],F_REG | F_IMMED,8);
    ap2 = GenerateExpression(node->p[1],F_REG | F_IMMED,8);
        GenerateTriadic(op,0,ap1,ap1,ap2);
        ap3 = GetTempRegister();
    GenerateDiadic(op_ext,0,ap1,0);
        GenerateTriadic(op,0,ap3,ap1,ap2);
    MakeLegalAmode(ap1,flags,4);
//    GenerateDiadic(op_ext,0,ap3,0);
 
    MakeLegalAmode(ap3,flags,4);
 
    ReleaseTempRegister(ap1);
    ReleaseTempRegister(ap2);
    ReleaseTempRegister(ap2);
    return ap1;
    return ap3;
}
}
 
 
/*
/*
 *      exchange the two operands in a node.
 *      exchange the two operands in a node.
 */
 */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.