This commit is contained in:
Xiang Li 2017-03-15 15:02:16 -07:00 коммит произвёл GitHub
Родитель dc00d74028
Коммит b88ce03da3
3 изменённых файлов: 41 добавлений и 1 удалений

Просмотреть файл

@ -221,7 +221,32 @@ RValue CodeGenFunction::EmitCXXMemberOrOperatorMemberCallExpr(
llvm::Value *This = nullptr;
if (Base->getValueKind() != ExprValueKind::VK_RValue) {
LValue LV = EmitLValue(Base);
if (LV.isSimple()) {
This = EmitLValue(Base).getAddress();
if (isa<ExtMatrixElementExpr>(Base)) {
llvm::Value *Val = Builder.CreateLoad(This);
This = Builder.CreateAlloca(Val->getType());
Builder.CreateStore(Val, This);
}
} else {
assert(LV.isExtVectorElt() && "must be ext vector here");
This = LV.getExtVectorAddr();
llvm::Constant *Elts = LV.getExtVectorElts();
llvm::Type *Ty = ConvertType(LV.getType());
llvm::Constant *zero = Builder.getInt32(0);
llvm::Value *TmpThis = Builder.CreateAlloca(Ty);
for (unsigned i = 0; i < Ty->getVectorNumElements(); i++) {
llvm::Value *EltIdx = Elts->getAggregateElement(i);
llvm::Value *EltGEP = Builder.CreateGEP(This, {zero, EltIdx});
llvm::Value *TmpEltGEP =
Builder.CreateGEP(TmpThis, {zero, Builder.getInt32(i)});
llvm::Value *Elt = Builder.CreateLoad(EltGEP);
Builder.CreateStore(Elt, TmpEltGEP);
}
This = TmpThis;
}
} else {
llvm::Value *Val = EmitScalarExpr(Base);
This = Builder.CreateAlloca(Val->getType());

Просмотреть файл

@ -0,0 +1,10 @@
// RUN: %dxc -E main -T ps_6_0 %s | FileCheck %s
// CHECK: @main
float4x4 m;
uint4 main(uint4 a : AAA, uint4 b : BBB) : SV_Target
{
float4x4 tm = m;
return a.wzyx[b.x] + tm._m00_m11[b.x];
}

Просмотреть файл

@ -529,6 +529,7 @@ public:
TEST_METHOD(CodeGenSwizzle2)
TEST_METHOD(CodeGenSwizzleAtomic)
TEST_METHOD(CodeGenSwizzleAtomic2)
TEST_METHOD(CodeGenSwizzleIndexing)
TEST_METHOD(CodeGenTemp1)
TEST_METHOD(CodeGenTemp2)
TEST_METHOD(CodeGenTexSubscript)
@ -2811,6 +2812,10 @@ TEST_F(CompilerTest, CodeGenSwizzleAtomic2) {
CodeGenTestCheck(L"..\\CodeGenHLSL\\swizzleAtomic2.hlsl");
}
TEST_F(CompilerTest, CodeGenSwizzleIndexing) {
CodeGenTestCheck(L"..\\CodeGenHLSL\\swizzleIndexing.hlsl");
}
TEST_F(CompilerTest, CodeGenTemp1) {
CodeGenTest(L"..\\CodeGenHLSL\\temp1.hlsl");
}