Line 29... |
Line 29... |
#include "cglbdec.h"
|
#include "cglbdec.h"
|
|
|
|
|
AMODE *GenerateShift(ENODE *node,int flags, int size, int op)
|
AMODE *GenerateShift(ENODE *node,int flags, int size, int op)
|
{
|
{
|
AMODE *ap1, *ap2;
|
AMODE *ap1, *ap2, *ap3;
|
|
|
ap1 = GenerateExpression(node->p[0],F_REG,size);
|
ap1 = GenerateExpression(node->p[0],F_REG,size);
|
ap2 = GenerateExpression(node->p[1],F_REG | F_IMMED,8);
|
ap2 = GenerateExpression(node->p[1],F_REG | F_IMMED,8);
|
switch(op) {
|
switch(op) {
|
case op_shru:
|
case op_shru:
|
Line 51... |
Line 51... |
case 32: GenerateTriadic(op_sext32,0,ap1,ap1,NULL); break;
|
case 32: GenerateTriadic(op_sext32,0,ap1,ap1,NULL); break;
|
default: ;
|
default: ;
|
}
|
}
|
break;
|
break;
|
}
|
}
|
|
ap3 = GetTempRegister();
|
if (ap2->mode==am_immed) {
|
if (ap2->mode==am_immed) {
|
switch(op)
|
switch(op)
|
{
|
{
|
case op_shl: op = op_shli; break;
|
case op_shl: op = op_shli; break;
|
case op_shr: op = op_shri; break;
|
case op_shr: op = op_shri; break;
|
case op_shru: op = op_shrui; break;
|
case op_shru: op = op_shrui; break;
|
}
|
}
|
GenerateTriadic(op,0,ap1,ap1,make_immed(ap2->offset->i));
|
GenerateTriadic(op,0,ap3,ap1,make_immed(ap2->offset->i));
|
}
|
}
|
else
|
else
|
GenerateTriadic(op,0,ap1,ap1,ap2);
|
GenerateTriadic(op,0,ap3,ap1,ap2);
|
|
ReleaseTempRegister(ap1);
|
ReleaseTempRegister(ap2);
|
ReleaseTempRegister(ap2);
|
MakeLegalAmode(ap1,flags,size);
|
MakeLegalAmode(ap3,flags,size);
|
return ap1;
|
return ap3;
|
}
|
}
|
|
|
|
|
/*
|
/*
|
* generate shift equals operators.
|
* generate shift equals operators.
|