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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1382063002: Subzero. Adds I64 register pairs for ARM32. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: merge Created 5 years, 2 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
« no previous file with comments | « src/IceRegistersARM32.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
169 ARM32InstructionSet::Begin); 169 ARM32InstructionSet::Begin);
170 } 170 }
171 } 171 }
172 172
173 TargetARM32::TargetARM32(Cfg *Func) 173 TargetARM32::TargetARM32(Cfg *Func)
174 : TargetLowering(Func), CPUFeatures(Func->getContext()->getFlags()) { 174 : TargetLowering(Func), CPUFeatures(Func->getContext()->getFlags()) {
175 // TODO: Don't initialize IntegerRegisters and friends every time. Instead, 175 // TODO: Don't initialize IntegerRegisters and friends every time. Instead,
176 // initialize in some sort of static initializer for the class. 176 // initialize in some sort of static initializer for the class.
177 // Limit this size (or do all bitsets need to be the same width)??? 177 // Limit this size (or do all bitsets need to be the same width)???
178 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM); 178 llvm::SmallBitVector IntegerRegisters(RegARM32::Reg_NUM);
179 llvm::SmallBitVector I64PairRegisters(RegARM32::Reg_NUM);
179 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM); 180 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM);
180 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); 181 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM);
181 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); 182 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
182 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); 183 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
183 ScratchRegs.resize(RegARM32::Reg_NUM); 184 ScratchRegs.resize(RegARM32::Reg_NUM);
184 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 185 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
185 isFP32, isFP64, isVec128, alias_init) \ 186 isI64Pair, isFP32, isFP64, isVec128, alias_init) \
186 IntegerRegisters[RegARM32::val] = isInt; \ 187 IntegerRegisters[RegARM32::val] = isInt; \
188 I64PairRegisters[RegARM32::val] = isI64Pair; \
187 Float32Registers[RegARM32::val] = isFP32; \ 189 Float32Registers[RegARM32::val] = isFP32; \
188 Float64Registers[RegARM32::val] = isFP64; \ 190 Float64Registers[RegARM32::val] = isFP64; \
189 VectorRegisters[RegARM32::val] = isVec128; \ 191 VectorRegisters[RegARM32::val] = isVec128; \
190 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ 192 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
191 for (SizeT RegAlias : alias_init) { \ 193 for (SizeT RegAlias : alias_init) { \
192 assert(!RegisterAliases[RegARM32::val][RegAlias] && \ 194 assert(!RegisterAliases[RegARM32::val][RegAlias] && \
193 "Duplicate alias for " #val); \ 195 "Duplicate alias for " #val); \
194 RegisterAliases[RegARM32::val].set(RegAlias); \ 196 RegisterAliases[RegARM32::val].set(RegAlias); \
195 } \ 197 } \
196 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ 198 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
197 assert(RegisterAliases[RegARM32::val][RegARM32::val]); \ 199 assert(RegisterAliases[RegARM32::val][RegARM32::val]); \
198 ScratchRegs[RegARM32::val] = scratch; 200 ScratchRegs[RegARM32::val] = scratch;
199 REGARM32_TABLE; 201 REGARM32_TABLE;
200 #undef X 202 #undef X
201 TypeToRegisterSet[IceType_void] = InvalidRegisters; 203 TypeToRegisterSet[IceType_void] = InvalidRegisters;
202 TypeToRegisterSet[IceType_i1] = IntegerRegisters; 204 TypeToRegisterSet[IceType_i1] = IntegerRegisters;
203 TypeToRegisterSet[IceType_i8] = IntegerRegisters; 205 TypeToRegisterSet[IceType_i8] = IntegerRegisters;
204 TypeToRegisterSet[IceType_i16] = IntegerRegisters; 206 TypeToRegisterSet[IceType_i16] = IntegerRegisters;
205 TypeToRegisterSet[IceType_i32] = IntegerRegisters; 207 TypeToRegisterSet[IceType_i32] = IntegerRegisters;
206 TypeToRegisterSet[IceType_i64] = IntegerRegisters; 208 TypeToRegisterSet[IceType_i64] = I64PairRegisters;
207 TypeToRegisterSet[IceType_f32] = Float32Registers; 209 TypeToRegisterSet[IceType_f32] = Float32Registers;
208 TypeToRegisterSet[IceType_f64] = Float64Registers; 210 TypeToRegisterSet[IceType_f64] = Float64Registers;
209 TypeToRegisterSet[IceType_v4i1] = VectorRegisters; 211 TypeToRegisterSet[IceType_v4i1] = VectorRegisters;
210 TypeToRegisterSet[IceType_v8i1] = VectorRegisters; 212 TypeToRegisterSet[IceType_v8i1] = VectorRegisters;
211 TypeToRegisterSet[IceType_v16i1] = VectorRegisters; 213 TypeToRegisterSet[IceType_v16i1] = VectorRegisters;
212 TypeToRegisterSet[IceType_v16i8] = VectorRegisters; 214 TypeToRegisterSet[IceType_v16i8] = VectorRegisters;
213 TypeToRegisterSet[IceType_v8i16] = VectorRegisters; 215 TypeToRegisterSet[IceType_v8i16] = VectorRegisters;
214 TypeToRegisterSet[IceType_v4i32] = VectorRegisters; 216 TypeToRegisterSet[IceType_v4i32] = VectorRegisters;
215 TypeToRegisterSet[IceType_v4f32] = VectorRegisters; 217 TypeToRegisterSet[IceType_v4f32] = VectorRegisters;
216 } 218 }
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after
365 return Br->optimizeBranch(NextNode); 367 return Br->optimizeBranch(NextNode);
366 } 368 }
367 return false; 369 return false;
368 } 370 }
369 371
370 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { 372 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const {
371 assert(RegNum < RegARM32::Reg_NUM); 373 assert(RegNum < RegARM32::Reg_NUM);
372 (void)Ty; 374 (void)Ty;
373 static const char *RegNames[] = { 375 static const char *RegNames[] = {
374 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 376 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
375 isFP32, isFP64, isVec128, alias_init) \ 377 isI64Pair, isFP32, isFP64, isVec128, alias_init) \
376 name, 378 name,
377 REGARM32_TABLE 379 REGARM32_TABLE
378 #undef X 380 #undef X
379 }; 381 };
380 382
381 return RegNames[RegNum]; 383 return RegNames[RegNum];
382 } 384 }
383 385
384 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) { 386 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) {
385 static const Type DefaultType[] = { 387 static const Type DefaultType[] = {
386 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 388 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
387 isFP32, isFP64, isVec128, alias_init) \ 389 isI64Pair, isFP32, isFP64, isVec128, alias_init) \
388 (isFP32) \ 390 (isFP32) \
389 ? IceType_f32 \ 391 ? IceType_f32 \
390 : ((isFP64) ? IceType_f64 : ((isVec128 ? IceType_v4i32 : IceType_i32))), 392 : ((isFP64) ? IceType_f64 : ((isVec128 ? IceType_v4i32 : IceType_i32))),
391 REGARM32_TABLE 393 REGARM32_TABLE
392 #undef X 394 #undef X
393 }; 395 };
394 396
395 assert(RegNum < RegARM32::Reg_NUM); 397 assert(RegNum < RegARM32::Reg_NUM);
396 if (Ty == IceType_void) { 398 if (Ty == IceType_void) {
397 assert(RegNum < llvm::array_lengthof(DefaultType)); 399 assert(RegNum < llvm::array_lengthof(DefaultType));
(...skipping 760 matching lines...) Expand 10 before | Expand all | Expand 10 after
1158 } 1160 }
1159 llvm_unreachable("Unsupported operand type"); 1161 llvm_unreachable("Unsupported operand type");
1160 return nullptr; 1162 return nullptr;
1161 } 1163 }
1162 1164
1163 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, 1165 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include,
1164 RegSetMask Exclude) const { 1166 RegSetMask Exclude) const {
1165 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); 1167 llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
1166 1168
1167 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 1169 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
1168 isFP32, isFP64, isVec128, alias_init) \ 1170 isI64Pair, isFP32, isFP64, isVec128, alias_init) \
1169 if (scratch && (Include & RegSet_CallerSave)) \ 1171 if (scratch && (Include & RegSet_CallerSave)) \
1170 Registers[RegARM32::val] = true; \ 1172 Registers[RegARM32::val] = true; \
1171 if (preserved && (Include & RegSet_CalleeSave)) \ 1173 if (preserved && (Include & RegSet_CalleeSave)) \
1172 Registers[RegARM32::val] = true; \ 1174 Registers[RegARM32::val] = true; \
1173 if (stackptr && (Include & RegSet_StackPointer)) \ 1175 if (stackptr && (Include & RegSet_StackPointer)) \
1174 Registers[RegARM32::val] = true; \ 1176 Registers[RegARM32::val] = true; \
1175 if (frameptr && (Include & RegSet_FramePointer)) \ 1177 if (frameptr && (Include & RegSet_FramePointer)) \
1176 Registers[RegARM32::val] = true; \ 1178 Registers[RegARM32::val] = true; \
1177 if (scratch && (Exclude & RegSet_CallerSave)) \ 1179 if (scratch && (Exclude & RegSet_CallerSave)) \
1178 Registers[RegARM32::val] = false; \ 1180 Registers[RegARM32::val] = false; \
(...skipping 2298 matching lines...) Expand 10 before | Expand all | Expand 10 after
3477 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n"; 3479 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n";
3478 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) { 3480 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) {
3479 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n"; 3481 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n";
3480 } 3482 }
3481 // Technically R9 is used for TLS with Sandboxing, and we reserve it. 3483 // Technically R9 is used for TLS with Sandboxing, and we reserve it.
3482 // However, for compatibility with current NaCl LLVM, don't claim that. 3484 // However, for compatibility with current NaCl LLVM, don't claim that.
3483 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 3485 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
3484 } 3486 }
3485 3487
3486 } // end of namespace Ice 3488 } // end of namespace Ice
OLDNEW
« no previous file with comments | « src/IceRegistersARM32.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698