Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(14)

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1655313002: Subzero: ARM32: lowering of vector insert and extract. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Code review feedback. Created 4 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===// 1 //===- subzero/src/IceTargetLoweringARM32.cpp - ARM32 lowering ------------===//
2 // 2 //
3 // The Subzero Code Generator 3 // The Subzero Code Generator
4 // 4 //
5 // This file is distributed under the University of Illinois Open Source 5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details. 6 // License. See LICENSE.TXT for details.
7 // 7 //
8 //===----------------------------------------------------------------------===// 8 //===----------------------------------------------------------------------===//
9 /// 9 ///
10 /// \file 10 /// \file
(...skipping 279 matching lines...) Expand 10 before | Expand all | Expand 10 after
290 CPUFeatures(Func->getContext()->getFlags()) {} 290 CPUFeatures(Func->getContext()->getFlags()) {}
291 291
292 void TargetARM32::staticInit(GlobalContext *Ctx) { 292 void TargetARM32::staticInit(GlobalContext *Ctx) {
293 293
294 // Limit this size (or do all bitsets need to be the same width)??? 294 // Limit this size (or do all bitsets need to be the same width)???
295 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); 295 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM);
296 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); 296 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM);
297 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); 297 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM);
298 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); 298 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM);
299 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); 299 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
300 llvm::SmallBitVector QtoSRegisters(RegARM32::Reg_NUM);
300 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); 301 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
301 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { 302 for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
302 const auto &Entry = RegARM32::RegTable[i]; 303 const auto &Entry = RegARM32::RegTable[i];
304 const auto EncodedReg_q8 = RegARM32::RegTable[RegARM32::Reg_q8].Encoding;
303 IntegerRegisters[i] = Entry.IsInt; 305 IntegerRegisters[i] = Entry.IsInt;
304 I64PairRegisters[i] = Entry.IsI64Pair; 306 I64PairRegisters[i] = Entry.IsI64Pair;
305 Float32Registers[i] = Entry.IsFP32; 307 Float32Registers[i] = Entry.IsFP32;
306 Float64Registers[i] = Entry.IsFP64; 308 Float64Registers[i] = Entry.IsFP64;
307 VectorRegisters[i] = Entry.IsVec128; 309 VectorRegisters[i] = Entry.IsVec128;
308 RegisterAliases[i].resize(RegARM32::Reg_NUM); 310 RegisterAliases[i].resize(RegARM32::Reg_NUM);
311 // TODO(eholk): It would be better to store a QtoS flag in the
312 // IceRegistersARM32 table than to compare their encodings here.
313 QtoSRegisters[i] = Entry.IsVec128 && Entry.Encoding < EncodedReg_q8;
309 for (int j = 0; j < Entry.NumAliases; ++j) { 314 for (int j = 0; j < Entry.NumAliases; ++j) {
310 assert(i == j || !RegisterAliases[i][Entry.Aliases[j]]); 315 assert(i == j || !RegisterAliases[i][Entry.Aliases[j]]);
311 RegisterAliases[i].set(Entry.Aliases[j]); 316 RegisterAliases[i].set(Entry.Aliases[j]);
312 } 317 }
313 assert(RegisterAliases[i][i]); 318 assert(RegisterAliases[i][i]);
314 if (Entry.CCArg <= 0) { 319 if (Entry.CCArg <= 0) {
315 continue; 320 continue;
316 } 321 }
317 if (Entry.IsGPR) { 322 if (Entry.IsGPR) {
318 GPRArgInitializer[Entry.CCArg - 1] = i; 323 GPRArgInitializer[Entry.CCArg - 1] = i;
(...skipping 15 matching lines...) Expand all
334 TypeToRegisterSet[IceType_i64] = I64PairRegisters; 339 TypeToRegisterSet[IceType_i64] = I64PairRegisters;
335 TypeToRegisterSet[IceType_f32] = Float32Registers; 340 TypeToRegisterSet[IceType_f32] = Float32Registers;
336 TypeToRegisterSet[IceType_f64] = Float64Registers; 341 TypeToRegisterSet[IceType_f64] = Float64Registers;
337 TypeToRegisterSet[IceType_v4i1] = VectorRegisters; 342 TypeToRegisterSet[IceType_v4i1] = VectorRegisters;
338 TypeToRegisterSet[IceType_v8i1] = VectorRegisters; 343 TypeToRegisterSet[IceType_v8i1] = VectorRegisters;
339 TypeToRegisterSet[IceType_v16i1] = VectorRegisters; 344 TypeToRegisterSet[IceType_v16i1] = VectorRegisters;
340 TypeToRegisterSet[IceType_v16i8] = VectorRegisters; 345 TypeToRegisterSet[IceType_v16i8] = VectorRegisters;
341 TypeToRegisterSet[IceType_v8i16] = VectorRegisters; 346 TypeToRegisterSet[IceType_v8i16] = VectorRegisters;
342 TypeToRegisterSet[IceType_v4i32] = VectorRegisters; 347 TypeToRegisterSet[IceType_v4i32] = VectorRegisters;
343 TypeToRegisterSet[IceType_v4f32] = VectorRegisters; 348 TypeToRegisterSet[IceType_v4f32] = VectorRegisters;
349 TypeToRegisterSet[RegARM32::RCARM32_QtoS] = QtoSRegisters;
344 350
345 for (size_t i = 0; i < llvm::array_lengthof(TypeToRegisterSet); ++i) 351 for (size_t i = 0; i < llvm::array_lengthof(TypeToRegisterSet); ++i)
346 TypeToRegisterSetUnfiltered[i] = TypeToRegisterSet[i]; 352 TypeToRegisterSetUnfiltered[i] = TypeToRegisterSet[i];
347 353
348 filterTypeToRegisterSet( 354 filterTypeToRegisterSet(
349 Ctx, RegARM32::Reg_NUM, TypeToRegisterSet, 355 Ctx, RegARM32::Reg_NUM, TypeToRegisterSet,
350 llvm::array_lengthof(TypeToRegisterSet), [](int32_t RegNum) -> IceString { 356 llvm::array_lengthof(TypeToRegisterSet), [](int32_t RegNum) -> IceString {
351 // This function simply removes ", " from the register name. 357 // This function simply removes ", " from the register name.
352 IceString Name = RegARM32::getRegName(RegNum); 358 IceString Name = RegARM32::getRegName(RegNum);
353 constexpr const char RegSeparator[] = ", "; 359 constexpr const char RegSeparator[] = ", ";
(...skipping 3473 matching lines...) Expand 10 before | Expand all | Expand 10 after
3827 UnimplementedLoweringError(this, Instr); 3833 UnimplementedLoweringError(this, Instr);
3828 break; 3834 break;
3829 } 3835 }
3830 } 3836 }
3831 break; 3837 break;
3832 } 3838 }
3833 } 3839 }
3834 } 3840 }
3835 3841
3836 void TargetARM32::lowerExtractElement(const InstExtractElement *Instr) { 3842 void TargetARM32::lowerExtractElement(const InstExtractElement *Instr) {
3837 UnimplementedLoweringError(this, Instr); 3843 Variable *Dest = Instr->getDest();
3844 auto DestTy = Dest->getType();
3845
3846 Variable *Src0 = legalizeToReg(Instr->getSrc(0));
3847 Operand *Src1 = Instr->getSrc(1);
3848
3849 if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src1)) {
3850 const uint32_t Index = Imm->getValue();
3851 Variable *T = makeReg(DestTy);
3852 Variable *TSrc0 = makeReg(Src0->getType());
3853
3854 if (isFloatingType(DestTy)) {
3855 // We need to make sure the source is in a suitable register.
3856 TSrc0->setRegClass(RegARM32::RCARM32_QtoS);
3857 }
3858
3859 _mov(TSrc0, Src0);
3860 _extractelement(T, TSrc0, Index);
3861 _mov(Dest, T);
3862 return;
3863 }
3864 assert(false && "extractelement requires a constant index");
3838 } 3865 }
3839 3866
3840 namespace { 3867 namespace {
3841 // Validates FCMPARM32_TABLE's declaration w.r.t. InstFcmp::FCondition ordering 3868 // Validates FCMPARM32_TABLE's declaration w.r.t. InstFcmp::FCondition ordering
3842 // (and naming). 3869 // (and naming).
3843 enum { 3870 enum {
3844 #define X(val, CC0, CC1) _fcmp_ll_##val, 3871 #define X(val, CC0, CC1) _fcmp_ll_##val,
3845 FCMPARM32_TABLE 3872 FCMPARM32_TABLE
3846 #undef X 3873 #undef X
3847 _fcmp_ll_NUM 3874 _fcmp_ll_NUM
(...skipping 374 matching lines...) Expand 10 before | Expand all | Expand 10 after
4222 CondWhenTrue Cond = lowerIcmpCond(Instr); 4249 CondWhenTrue Cond = lowerIcmpCond(Instr);
4223 _mov_redefined(T, _1, Cond.WhenTrue0); 4250 _mov_redefined(T, _1, Cond.WhenTrue0);
4224 _mov(Dest, T); 4251 _mov(Dest, T);
4225 4252
4226 assert(Cond.WhenTrue1 == CondARM32::kNone); 4253 assert(Cond.WhenTrue1 == CondARM32::kNone);
4227 4254
4228 return; 4255 return;
4229 } 4256 }
4230 4257
4231 void TargetARM32::lowerInsertElement(const InstInsertElement *Instr) { 4258 void TargetARM32::lowerInsertElement(const InstInsertElement *Instr) {
4232 UnimplementedLoweringError(this, Instr); 4259 Variable *Dest = Instr->getDest();
4260 auto DestTy = Dest->getType();
4261
4262 Variable *Src0 = legalizeToReg(Instr->getSrc(0));
4263 Variable *Src1 = legalizeToReg(Instr->getSrc(1));
4264 Operand *Src2 = Instr->getSrc(2);
4265
4266 if (const auto *Imm = llvm::dyn_cast<ConstantInteger32>(Src2)) {
4267 auto Index = Imm->getValue();
Jim Stichnoth 2016/02/08 20:13:59 const uint32_t
Eric Holk 2016/02/08 21:24:17 Done.
4268 Variable *T = makeReg(DestTy);
4269
4270 if (isFloatingType(DestTy)) {
4271 T->setRegClass(RegARM32::RCARM32_QtoS);
4272 }
4273
4274 _mov(T, Src0);
4275 _insertelement(T, Src1, Index);
4276 _set_dest_redefined();
4277 _mov(Dest, T);
4278 return;
4279 }
4280 assert(false && "insertelement requires a constant index");
4233 } 4281 }
4234 4282
4235 namespace { 4283 namespace {
4236 inline uint64_t getConstantMemoryOrder(Operand *Opnd) { 4284 inline uint64_t getConstantMemoryOrder(Operand *Opnd) {
4237 if (auto *Integer = llvm::dyn_cast<ConstantInteger32>(Opnd)) 4285 if (auto *Integer = llvm::dyn_cast<ConstantInteger32>(Opnd))
4238 return Integer->getValue(); 4286 return Integer->getValue();
4239 return Intrinsics::MemoryOrderInvalid; 4287 return Intrinsics::MemoryOrderInvalid;
4240 } 4288 }
4241 } // end of anonymous namespace 4289 } // end of anonymous namespace
4242 4290
(...skipping 2280 matching lines...) Expand 10 before | Expand all | Expand 10 after
6523 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 6571 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
6524 } 6572 }
6525 6573
6526 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[RegARM32::RCARM32_NUM]; 6574 llvm::SmallBitVector TargetARM32::TypeToRegisterSet[RegARM32::RCARM32_NUM];
6527 llvm::SmallBitVector 6575 llvm::SmallBitVector
6528 TargetARM32::TypeToRegisterSetUnfiltered[RegARM32::RCARM32_NUM]; 6576 TargetARM32::TypeToRegisterSetUnfiltered[RegARM32::RCARM32_NUM];
6529 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM]; 6577 llvm::SmallBitVector TargetARM32::RegisterAliases[RegARM32::Reg_NUM];
6530 6578
6531 } // end of namespace ARM32 6579 } // end of namespace ARM32
6532 } // end of namespace Ice 6580 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698