Subzero. ARM32. Implements vector select.
Also piggy-backs necro-comments from cl 1878943009.
BUG= https://bugs.chromium.org/p/nativeclient/issues/detail?id=4076
R=kschimpf@google.com
Review URL: https://codereview.chromium.org/1886263004 .
diff --git a/src/IceTargetLoweringARM32.cpp b/src/IceTargetLoweringARM32.cpp
index b8fa3b6..3de321e 100644
--- a/src/IceTargetLoweringARM32.cpp
+++ b/src/IceTargetLoweringARM32.cpp
@@ -861,24 +861,6 @@
}
return;
}
- case Inst::Select: {
- Variable *Dest = Instr->getDest();
- const auto DestTy = Dest->getType();
- if (isVectorType(DestTy)) {
- auto *SelectInstr = llvm::cast<InstSelect>(Instr);
- scalarizeInstruction(Dest,
- [this](Variable *Dest, Variable *Src0,
- Variable *Src1, Variable *Src2) {
- return Context.insert<InstSelect>(Dest, Src0, Src1,
- Src2);
- },
- llvm::cast<Variable>(SelectInstr->getSrc(0)),
- llvm::cast<Variable>(SelectInstr->getSrc(1)),
- llvm::cast<Variable>(SelectInstr->getSrc(2)));
- SelectInstr->setDeleted();
- }
- return;
- }
}
}
@@ -5727,12 +5709,39 @@
Operand *SrcF = Instr->getFalseOperand();
Operand *Condition = Instr->getCondition();
- if (isVectorType(DestTy)) {
- UnimplementedLoweringError(this, Instr);
+ if (!isVectorType(DestTy)) {
+ lowerInt1ForSelect(Dest, Condition, legalizeUndef(SrcT),
+ legalizeUndef(SrcF));
return;
}
- lowerInt1ForSelect(Dest, Condition, legalizeUndef(SrcT), legalizeUndef(SrcF));
+ Type TType = DestTy;
+ switch (DestTy) {
+ default:
+ llvm::report_fatal_error("Unexpected type for vector select.");
+ case IceType_v4i1:
+ TType = IceType_v4i32;
+ break;
+ case IceType_v8i1:
+ TType = IceType_v8i16;
+ break;
+ case IceType_v16i1:
+ TType = IceType_v16i8;
+ break;
+ case IceType_v4f32:
+ TType = IceType_v4i32;
+ break;
+ case IceType_v4i32:
+ case IceType_v8i16:
+ case IceType_v16i8:
+ break;
+ }
+ auto *T = makeReg(TType);
+ lowerCast(InstCast::create(Func, InstCast::Sext, T, Condition));
+ auto *SrcTR = legalizeToReg(SrcT);
+ auto *SrcFR = legalizeToReg(SrcF);
+ _vbsl(T, SrcTR, SrcFR)->setDestRedefined();
+ _mov(Dest, T);
}
void TargetARM32::lowerStore(const InstStore *Instr) {