public override Reg CGenValue(CGenState state) {
Reg ret = this.Expr.CGenValue(state);
if (ret != Reg.EAX) {
throw new InvalidProgramException();
}
if (this.Expr.Type.Kind != ExprTypeKind.POINTER) {
throw new InvalidProgramException();
}
ExprType type = ((PointerType)this.Expr.Type).RefType;
switch (type.Kind) {
case ExprTypeKind.ARRAY:
case ExprTypeKind.FUNCTION:
return Reg.EAX;
case ExprTypeKind.CHAR:
state.MOVSBL(0, Reg.EAX, Reg.EAX);
return Reg.EAX;
case ExprTypeKind.UCHAR:
state.MOVZBL(0, Reg.EAX, Reg.EAX);
return Reg.EAX;
case ExprTypeKind.SHORT:
state.MOVSWL(0, Reg.EAX, Reg.EAX);
return Reg.EAX;
case ExprTypeKind.USHORT:
state.MOVZWL(0, Reg.EAX, Reg.EAX);
return Reg.EAX;
case ExprTypeKind.LONG:
case ExprTypeKind.ULONG:
case ExprTypeKind.POINTER:
state.MOVL(0, Reg.EAX, Reg.EAX);
return Reg.EAX;
case ExprTypeKind.FLOAT:
state.FLDS(0, Reg.EAX);
return Reg.ST0;
case ExprTypeKind.DOUBLE:
state.FLDL(0, Reg.EAX);
return Reg.ST0;
case ExprTypeKind.STRUCT_OR_UNION:
//// %esi = src address
//state.MOVL(Reg.EAX, Reg.ESI);
//// %edi = dst address
//state.CGenExpandStackBy(Utils.RoundUp(Type.SizeOf, 4));
//state.LEA(0, Reg.ESP, Reg.EDI);
//// %ecx = nbytes
//state.MOVL(Type.SizeOf, Reg.ECX);
//state.CGenMemCpy();
//return Reg.STACK;
return Reg.EAX;
case ExprTypeKind.VOID:
default:
throw new InvalidProgramException();
}
}