- fixed setup for PString which was missing the load/store/move instructions which caused me to overlook its register type.

- properly set up the vector types.
- fixed: a struct must start with a size of 0, not 1. This caused the layout of the vectors to be broken.
This commit is contained in:
Christoph Oelckers 2016-10-28 14:43:29 +02:00
parent ed5a94d187
commit f2f365bfef
2 changed files with 19 additions and 18 deletions

View File

@ -205,6 +205,7 @@ PType::PType(unsigned int size, unsigned int align)
storeOp = OP_NOP; storeOp = OP_NOP;
moveOp = OP_NOP; moveOp = OP_NOP;
RegType = REGT_NIL; RegType = REGT_NIL;
RegCount = 1;
} }
//========================================================================== //==========================================================================
@ -570,7 +571,8 @@ void PType::StaticInit()
TypeVector2->loadOp = OP_LV2; TypeVector2->loadOp = OP_LV2;
TypeVector2->storeOp = OP_SV2; TypeVector2->storeOp = OP_SV2;
TypeVector2->moveOp = OP_MOVEV2; TypeVector2->moveOp = OP_MOVEV2;
TypeVector2->RegType = REGT_FLOAT|REGT_MULTIREG; TypeVector2->RegType = REGT_FLOAT;
TypeVector2->RegCount = 2;
TypeVector3 = new PStruct(NAME_Vector3, nullptr); TypeVector3 = new PStruct(NAME_Vector3, nullptr);
TypeVector3->AddField(NAME_X, TypeFloat64); TypeVector3->AddField(NAME_X, TypeFloat64);
@ -579,10 +581,11 @@ void PType::StaticInit()
// allow accessing xy as a vector2. This is marked native because it's not supposed to be serialized. // allow accessing xy as a vector2. This is marked native because it's not supposed to be serialized.
TypeVector3->Symbols.AddSymbol(new PField(NAME_XY, TypeVector2, VARF_Native, 0)); TypeVector3->Symbols.AddSymbol(new PField(NAME_XY, TypeVector2, VARF_Native, 0));
TypeTable.AddType(TypeVector3); TypeTable.AddType(TypeVector3);
TypeVector2->loadOp = OP_LV3; TypeVector3->loadOp = OP_LV3;
TypeVector2->storeOp = OP_SV3; TypeVector3->storeOp = OP_SV3;
TypeVector2->moveOp = OP_MOVEV3; TypeVector3->moveOp = OP_MOVEV3;
TypeVector2->RegType = REGT_FLOAT | REGT_MULTIREG; TypeVector3->RegType = REGT_FLOAT;
TypeVector3->RegCount = 3;
@ -1207,17 +1210,11 @@ PString::PString()
: PBasicType(sizeof(FString), __alignof(FString)) : PBasicType(sizeof(FString), __alignof(FString))
{ {
mDescriptiveName = "String"; mDescriptiveName = "String";
} storeOp = OP_SS;
loadOp = OP_LS;
moveOp = OP_MOVES;
RegType = REGT_STRING;
//==========================================================================
//
// PString :: GetRegType
//
//==========================================================================
int PString::GetRegType() const
{
return REGT_STRING;
} }
//========================================================================== //==========================================================================
@ -2089,6 +2086,7 @@ IMPLEMENT_CLASS(PStruct)
PStruct::PStruct() PStruct::PStruct()
{ {
mDescriptiveName = "Struct"; mDescriptiveName = "Struct";
Size = 0;
} }
//========================================================================== //==========================================================================
@ -2101,6 +2099,7 @@ PStruct::PStruct(FName name, PTypeBase *outer)
: PNamedType(name, outer) : PNamedType(name, outer)
{ {
mDescriptiveName.Format("Struct<%s>", name.GetChars()); mDescriptiveName.Format("Struct<%s>", name.GetChars());
Size = 0;
} }
//========================================================================== //==========================================================================

View File

@ -224,7 +224,7 @@ public:
PSymbolTable Symbols; PSymbolTable Symbols;
bool MemberOnly = false; // type may only be used as a struct/class member but not as a local variable or function argument. bool MemberOnly = false; // type may only be used as a struct/class member but not as a local variable or function argument.
FString mDescriptiveName; FString mDescriptiveName;
BYTE loadOp, storeOp, moveOp, RegType; BYTE loadOp, storeOp, moveOp, RegType, RegCount;
PType(unsigned int size = 1, unsigned int align = 1); PType(unsigned int size = 1, unsigned int align = 1);
virtual ~PType(); virtual ~PType();
@ -291,6 +291,10 @@ public:
return RegType; return RegType;
} }
int GetRegCount() const
{
return RegCount;
}
// Returns true if this type matches the two identifiers. Referring to the // Returns true if this type matches the two identifiers. Referring to the
// above table, any type is identified by at most two characteristics. Each // above table, any type is identified by at most two characteristics. Each
// type that implements this function will cast these to the appropriate type. // type that implements this function will cast these to the appropriate type.
@ -477,8 +481,6 @@ class PString : public PBasicType
public: public:
PString(); PString();
virtual int GetRegType() const;
void WriteValue(FSerializer &ar, const char *key,const void *addr) const override; void WriteValue(FSerializer &ar, const char *key,const void *addr) const override;
bool ReadValue(FSerializer &ar, const char *key,void *addr) const override; bool ReadValue(FSerializer &ar, const char *key,void *addr) const override;
void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special=NULL) const override; void SetDefaultValue(void *base, unsigned offset, TArray<FTypeAndOffset> *special=NULL) const override;