mirror of
https://github.com/beefytech/Beef.git
synced 2025-06-09 03:52:19 +02:00
Fixed ExtractValue for splat unions
This commit is contained in:
parent
47732ae09c
commit
cafbcd30dc
3 changed files with 23 additions and 11 deletions
|
@ -13213,9 +13213,9 @@ BfTypedValue BfModule::ExtractValue(BfTypedValue typedValue, BfFieldInstance* fi
|
||||||
{
|
{
|
||||||
if (typedValue.IsSplat())
|
if (typedValue.IsSplat())
|
||||||
{
|
{
|
||||||
BfTypedValue innerVal = typedValue;
|
bool isAddr = false;
|
||||||
innerVal.mType = fieldType;
|
BfIRValue irVal = ExtractSplatValue(typedValue, 0, fieldType, &isAddr);
|
||||||
return innerVal;
|
return BfTypedValue(irVal, fieldType, isAddr ? BfTypedValueKind_Addr : BfTypedValueKind_SplatHead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -13240,9 +13240,9 @@ BfTypedValue BfModule::ExtractValue(BfTypedValue typedValue, BfFieldInstance* fi
|
||||||
|
|
||||||
if (typedValue.IsSplat())
|
if (typedValue.IsSplat())
|
||||||
{
|
{
|
||||||
BfTypedValue innerVal = typedValue;
|
bool isAddr = false;
|
||||||
innerVal.mType = fieldType;
|
BfIRValue irVal = ExtractSplatValue(typedValue, 0, fieldType, &isAddr);
|
||||||
return innerVal;
|
return BfTypedValue(irVal, fieldType, isAddr ? BfTypedValueKind_Addr : BfTypedValueKind_SplatHead);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -15499,11 +15499,6 @@ void BfModule::DoLocalVariableDebugInfo(BfLocalVariable* localVarDef, bool doAli
|
||||||
|
|
||||||
BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType)
|
BfLocalVariable* BfModule::AddLocalVariableDef(BfLocalVariable* localVarDef, bool addDebugInfo, bool doAliasValue, BfIRValue declareBefore, BfIRInitType initType)
|
||||||
{
|
{
|
||||||
if (localVarDef->mName == "newSuccIndex")
|
|
||||||
{
|
|
||||||
NOP;
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend()) && (!localVarDef->mResolvedType->IsValuelessType()))
|
if ((localVarDef->mValue) && (!localVarDef->mAddr) && (IsTargetingBeefBackend()) && (!localVarDef->mResolvedType->IsValuelessType()))
|
||||||
{
|
{
|
||||||
if ((!localVarDef->mValue.IsConst()) &&
|
if ((!localVarDef->mValue.IsConst()) &&
|
||||||
|
|
|
@ -420,6 +420,7 @@ namespace Tests
|
||||||
{
|
{
|
||||||
if (!MoveNext())
|
if (!MoveNext())
|
||||||
return .Err;
|
return .Err;
|
||||||
|
#unwarn
|
||||||
return &CurrentRef;
|
return &CurrentRef;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -35,6 +35,18 @@ namespace Tests
|
||||||
public int16 mInt16;
|
public int16 mInt16;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Union]
|
||||||
|
public struct UnionE
|
||||||
|
{
|
||||||
|
public uint32 values;
|
||||||
|
|
||||||
|
public int r
|
||||||
|
{
|
||||||
|
get { return uint8((this.values & 0xFF000000) >> 24); }
|
||||||
|
set mut { this.values = (this.values & 0x00FFFFFF) | ((uint32(value) & 0x000000FF) << 24); }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
static void TestBasics()
|
static void TestBasics()
|
||||||
{
|
{
|
||||||
|
@ -54,6 +66,10 @@ namespace Tests
|
||||||
Test.Assert(sizeof(UnionD) == 6);
|
Test.Assert(sizeof(UnionD) == 6);
|
||||||
Test.Assert(alignof(UnionD) == 4);
|
Test.Assert(alignof(UnionD) == 4);
|
||||||
Test.Assert(((int16*)&ud)[2] == 234);
|
Test.Assert(((int16*)&ud)[2] == 234);
|
||||||
|
|
||||||
|
UnionE ue = .();
|
||||||
|
ue.r = 123;
|
||||||
|
Test.Assert(ue.r == 123);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue