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

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: No more auto. 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 278 matching lines...) Expand 10 before | Expand all | Expand 10 after
289 CPUFeatures(Func->getContext()->getFlags()) {} 289 CPUFeatures(Func->getContext()->getFlags()) {}
290 290
291 void TargetARM32::staticInit(GlobalContext *Ctx) { 291 void TargetARM32::staticInit(GlobalContext *Ctx) {
292 292
293 // Limit this size (or do all bitsets need to be the same width)??? 293 // Limit this size (or do all bitsets need to be the same width)???
294 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); 294 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM);
295 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM); 295 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM);
296 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); 296 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM);
297 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); 297 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM);
298 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); 298 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
299 llvm::SmallBitVector QtoSRegisters(RegARM32::Reg_NUM);
299 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); 300 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
301 const unsigned EncodedReg_q8 = RegARM32::RegTable[RegARM32::Reg_q8].Encoding;
300 for (int i = 0; i < RegARM32::Reg_NUM; ++i) { 302 for (int i = 0; i < RegARM32::Reg_NUM; ++i) {
301 const auto &Entry = RegARM32::RegTable[i]; 303 const auto &Entry = RegARM32::RegTable[i];
302 IntegerRegisters[i] = Entry.IsInt; 304 IntegerRegisters[i] = Entry.IsInt;
303 I64PairRegisters[i] = Entry.IsI64Pair; 305 I64PairRegisters[i] = Entry.IsI64Pair;
304 Float32Registers[i] = Entry.IsFP32; 306 Float32Registers[i] = Entry.IsFP32;
305 Float64Registers[i] = Entry.IsFP64; 307 Float64Registers[i] = Entry.IsFP64;
306 VectorRegisters[i] = Entry.IsVec128; 308 VectorRegisters[i] = Entry.IsVec128;
307 RegisterAliases[i].resize(RegARM32::Reg_NUM); 309 RegisterAliases[i].resize(RegARM32::Reg_NUM);
310 // TODO(eholk): It would be better to store a QtoS flag in the
311 // IceRegistersARM32 table than to compare their encodings here.
312 QtoSRegisters[i] = Entry.IsVec128 && Entry.Encoding < EncodedReg_q8;
308 for (int j = 0; j < Entry.NumAliases; ++j) { 313 for (int j = 0; j < Entry.NumAliases; ++j) {
309 assert(i == j || !RegisterAliases[i][Entry.Aliases[j]]); 314 assert(i == j || !RegisterAliases[i][Entry.Aliases[j]]);
310 RegisterAliases[i].set(Entry.Aliases[j]); 315 RegisterAliases[i].set(Entry.Aliases[j]);
311 } 316 }
312 assert(RegisterAliases[i][i]); 317 assert(RegisterAliases[i][i]);
313 if (Entry.CCArg <= 0) { 318 if (Entry.CCArg <= 0) {
314 continue; 319 continue;
315 } 320 }
316 if (Entry.IsGPR) { 321 if (Entry.IsGPR) {
317 GPRArgInitializer[Entry.CCArg - 1] = i; 322 GPRArgInitializer[Entry.CCArg - 1] = i;
(...skipping 15 matching lines...) Expand all
333 TypeToRegisterSet[IceType_i64] = I64PairRegisters; 338 TypeToRegisterSet[IceType_i64] = I64PairRegisters;
334 TypeToRegisterSet[IceType_f32] = Float32Registers; 339 TypeToRegisterSet[IceType_f32] = Float32Registers;
335 TypeToRegisterSet[IceType_f64] = Float64Registers; 340 TypeToRegisterSet[IceType_f64] = Float64Registers;
336 TypeToRegisterSet[IceType_v4i1] = VectorRegisters; 341 TypeToRegisterSet[IceType_v4i1] = VectorRegisters;
337 TypeToRegisterSet[IceType_v8i1] = VectorRegisters; 342 TypeToRegisterSet[IceType_v8i1] = VectorRegisters;
338 TypeToRegisterSet[IceType_v16i1] = VectorRegisters; 343 TypeToRegisterSet[IceType_v16i1] = VectorRegisters;
339 TypeToRegisterSet[IceType_v16i8] = VectorRegisters; 344 TypeToRegisterSet[IceType_v16i8] = VectorRegisters;
340 TypeToRegisterSet[IceType_v8i16] = VectorRegisters; 345 TypeToRegisterSet[IceType_v8i16] = VectorRegisters;
341 TypeToRegisterSet[IceType_v4i32] = VectorRegisters; 346 TypeToRegisterSet[IceType_v4i32] = VectorRegisters;
342 TypeToRegisterSet[IceType_v4f32] = VectorRegisters; 347 TypeToRegisterSet[IceType_v4f32] = VectorRegisters;
348 TypeToRegisterSet[RegARM32::RCARM32_QtoS] = QtoSRegisters;
343 349
344 for (size_t i = 0; i < llvm::array_lengthof(TypeToRegisterSet); ++i) 350 for (size_t i = 0; i < llvm::array_lengthof(TypeToRegisterSet); ++i)
345 TypeToRegisterSetUnfiltered[i] = TypeToRegisterSet[i]; 351 TypeToRegisterSetUnfiltered[i] = TypeToRegisterSet[i];
346 352
347 filterTypeToRegisterSet( 353 filterTypeToRegisterSet(
348 Ctx, RegARM32::Reg_NUM, TypeToRegisterSet, 354 Ctx, RegARM32::Reg_NUM, TypeToRegisterSet,
349 llvm::array_lengthof(TypeToRegisterSet), [](int32_t RegNum) -> IceString { 355 llvm::array_lengthof(TypeToRegisterSet), [](int32_t RegNum) -> IceString {
350 // This function simply removes ", " from the register name. 356 // This function simply removes ", " from the register name.
351 IceString Name = RegARM32::getRegName(RegNum); 357 IceString Name = RegARM32::getRegName(RegNum);
352 constexpr const char RegSeparator[] = ", "; 358 constexpr const char RegSeparator[] = ", ";
(...skipping 3474 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 Type DestTy = Dest->getType();
3845
3846 Variable *Src0 = legalizeToReg(Instr->getSrc(0));
3847 Operand *Src1 = Instr->getSrc(1);
3848
3849 if (const ConstantInteger32 *Imm = llvm::dyn_cast<ConstantInteger32>(Src1)) {
Jim Stichnoth 2016/02/08 23:08:58 const auto *Imm
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 Type 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 ConstantInteger32 *Imm = llvm::dyn_cast<ConstantInteger32>(Src2)) {
Jim Stichnoth 2016/02/08 23:08:58 const auto *Imm
4267 const uint32_t Index = Imm->getValue();
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