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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1310863007: Subzero. Changes the declaration for ARM32 registers. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Addresses comments. Created 5 years, 3 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 164 matching lines...) Expand 10 before | Expand all | Expand 10 after
175 // Instead, initialize in some sort of static initializer for the 175 // Instead, initialize in some sort of static initializer for the
176 // class. 176 // 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 Float32Registers(RegARM32::Reg_NUM); 179 llvm::SmallBitVector Float32Registers(RegARM32::Reg_NUM);
180 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM); 180 llvm::SmallBitVector Float64Registers(RegARM32::Reg_NUM);
181 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM); 181 llvm::SmallBitVector VectorRegisters(RegARM32::Reg_NUM);
182 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM); 182 llvm::SmallBitVector InvalidRegisters(RegARM32::Reg_NUM);
183 ScratchRegs.resize(RegARM32::Reg_NUM); 183 ScratchRegs.resize(RegARM32::Reg_NUM);
184 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 184 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
185 isFP32, isFP64, isVec128) \ 185 isFP32, isFP64, isVec128, alias_init) \
186 IntegerRegisters[RegARM32::val] = isInt; \ 186 IntegerRegisters[RegARM32::val] = isInt; \
187 Float32Registers[RegARM32::val] = isFP32; \ 187 Float32Registers[RegARM32::val] = isFP32; \
188 Float64Registers[RegARM32::val] = isFP64; \ 188 Float64Registers[RegARM32::val] = isFP64; \
189 VectorRegisters[RegARM32::val] = isVec128; \ 189 VectorRegisters[RegARM32::val] = isVec128; \
190 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ 190 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
191 RegisterAliases[RegARM32::val].set(RegARM32::val); \ 191 for (SizeT RegAlias : alias_init) { \
192 assert(!RegisterAliases[RegARM32::val][RegAlias] && \
193 "Duplicate alias for " #val); \
194 RegisterAliases[RegARM32::val].set(RegAlias); \
195 } \
196 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
197 assert(RegisterAliases[RegARM32::val][RegARM32::val]); \
192 ScratchRegs[RegARM32::val] = scratch; 198 ScratchRegs[RegARM32::val] = scratch;
193 REGARM32_TABLE; 199 REGARM32_TABLE;
194 #undef X 200 #undef X
195 TypeToRegisterSet[IceType_void] = InvalidRegisters; 201 TypeToRegisterSet[IceType_void] = InvalidRegisters;
196 TypeToRegisterSet[IceType_i1] = IntegerRegisters; 202 TypeToRegisterSet[IceType_i1] = IntegerRegisters;
197 TypeToRegisterSet[IceType_i8] = IntegerRegisters; 203 TypeToRegisterSet[IceType_i8] = IntegerRegisters;
198 TypeToRegisterSet[IceType_i16] = IntegerRegisters; 204 TypeToRegisterSet[IceType_i16] = IntegerRegisters;
199 TypeToRegisterSet[IceType_i32] = IntegerRegisters; 205 TypeToRegisterSet[IceType_i32] = IntegerRegisters;
200 TypeToRegisterSet[IceType_i64] = IntegerRegisters; 206 TypeToRegisterSet[IceType_i64] = IntegerRegisters;
201 TypeToRegisterSet[IceType_f32] = Float32Registers; 207 TypeToRegisterSet[IceType_f32] = Float32Registers;
(...skipping 159 matching lines...) Expand 10 before | Expand all | Expand 10 after
361 return Br->optimizeBranch(NextNode); 367 return Br->optimizeBranch(NextNode);
362 } 368 }
363 return false; 369 return false;
364 } 370 }
365 371
366 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const { 372 IceString TargetARM32::getRegName(SizeT RegNum, Type Ty) const {
367 assert(RegNum < RegARM32::Reg_NUM); 373 assert(RegNum < RegARM32::Reg_NUM);
368 (void)Ty; 374 (void)Ty;
369 static const char *RegNames[] = { 375 static const char *RegNames[] = {
370 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 376 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
371 isFP32, isFP64, isVec128) \ 377 isFP32, isFP64, isVec128, alias_init) \
372 name, 378 name,
373 REGARM32_TABLE 379 REGARM32_TABLE
374 #undef X 380 #undef X
375 }; 381 };
376 382
377 return RegNames[RegNum]; 383 return RegNames[RegNum];
378 } 384 }
379 385
380 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) { 386 Variable *TargetARM32::getPhysicalRegister(SizeT RegNum, Type Ty) {
381 if (Ty == IceType_void) 387 if (Ty == IceType_void)
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after
460 *Reg = RegARM32::Reg_r0 + NumGPRRegsUsed; 466 *Reg = RegARM32::Reg_r0 + NumGPRRegsUsed;
461 ++NumGPRRegsUsed; 467 ++NumGPRRegsUsed;
462 return true; 468 return true;
463 } 469 }
464 470
465 bool TargetARM32::CallingConv::FPInReg(Type Ty, int32_t *Reg) { 471 bool TargetARM32::CallingConv::FPInReg(Type Ty, int32_t *Reg) {
466 if (NumFPRegUnits >= ARM32_MAX_FP_REG_UNITS) 472 if (NumFPRegUnits >= ARM32_MAX_FP_REG_UNITS)
467 return false; 473 return false;
468 if (isVectorType(Ty)) { 474 if (isVectorType(Ty)) {
469 NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 4); 475 NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 4);
470 *Reg = RegARM32::Reg_q0 + (NumFPRegUnits / 4); 476 // Q registers are declared in reverse order, so
477 // RegARM32::Reg_q0 > RegARM32::Reg_q1. Therefore, we need to subtract
478 // NumFPRegUnits from Reg_q0. Same thing goes for D registers.
479 static_assert(RegARM32::Reg_q0 > RegARM32::Reg_q1,
480 "ARM32 Q registers are possibly declared incorrectly.");
481 *Reg = RegARM32::Reg_q0 - (NumFPRegUnits / 4);
471 NumFPRegUnits += 4; 482 NumFPRegUnits += 4;
472 // If this bumps us past the boundary, don't allocate to a register 483 // If this bumps us past the boundary, don't allocate to a register
473 // and leave any previously speculatively consumed registers as consumed. 484 // and leave any previously speculatively consumed registers as consumed.
474 if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS) 485 if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS)
475 return false; 486 return false;
476 } else if (Ty == IceType_f64) { 487 } else if (Ty == IceType_f64) {
488 static_assert(RegARM32::Reg_d0 > RegARM32::Reg_d1,
489 "ARM32 D registers are possibly declared incorrectly.");
477 NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 2); 490 NumFPRegUnits = Utils::applyAlignment(NumFPRegUnits, 2);
478 *Reg = RegARM32::Reg_d0 + (NumFPRegUnits / 2); 491 *Reg = RegARM32::Reg_d0 - (NumFPRegUnits / 2);
479 NumFPRegUnits += 2; 492 NumFPRegUnits += 2;
480 // If this bumps us past the boundary, don't allocate to a register 493 // If this bumps us past the boundary, don't allocate to a register
481 // and leave any previously speculatively consumed registers as consumed. 494 // and leave any previously speculatively consumed registers as consumed.
482 if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS) 495 if (NumFPRegUnits > ARM32_MAX_FP_REG_UNITS)
483 return false; 496 return false;
484 } else { 497 } else {
498 static_assert(RegARM32::Reg_s0 < RegARM32::Reg_s1,
499 "ARM32 S registers are possibly declared incorrectly.");
485 assert(Ty == IceType_f32); 500 assert(Ty == IceType_f32);
486 *Reg = RegARM32::Reg_s0 + NumFPRegUnits; 501 *Reg = RegARM32::Reg_s0 + NumFPRegUnits;
487 ++NumFPRegUnits; 502 ++NumFPRegUnits;
488 } 503 }
489 return true; 504 return true;
490 } 505 }
491 506
492 void TargetARM32::lowerArguments() { 507 void TargetARM32::lowerArguments() {
493 VarList &Args = Func->getArgs(); 508 VarList &Args = Func->getArgs();
494 TargetARM32::CallingConv CC; 509 TargetARM32::CallingConv CC;
(...skipping 650 matching lines...) Expand 10 before | Expand all | Expand 10 after
1145 } 1160 }
1146 llvm_unreachable("Unsupported operand type"); 1161 llvm_unreachable("Unsupported operand type");
1147 return nullptr; 1162 return nullptr;
1148 } 1163 }
1149 1164
1150 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include, 1165 llvm::SmallBitVector TargetARM32::getRegisterSet(RegSetMask Include,
1151 RegSetMask Exclude) const { 1166 RegSetMask Exclude) const {
1152 llvm::SmallBitVector Registers(RegARM32::Reg_NUM); 1167 llvm::SmallBitVector Registers(RegARM32::Reg_NUM);
1153 1168
1154 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \ 1169 #define X(val, encode, name, scratch, preserved, stackptr, frameptr, isInt, \
1155 isFP32, isFP64, isVec128) \ 1170 isFP32, isFP64, isVec128, alias_init) \
1156 if (scratch && (Include & RegSet_CallerSave)) \ 1171 if (scratch && (Include & RegSet_CallerSave)) \
1157 Registers[RegARM32::val] = true; \ 1172 Registers[RegARM32::val] = true; \
1158 if (preserved && (Include & RegSet_CalleeSave)) \ 1173 if (preserved && (Include & RegSet_CalleeSave)) \
1159 Registers[RegARM32::val] = true; \ 1174 Registers[RegARM32::val] = true; \
1160 if (stackptr && (Include & RegSet_StackPointer)) \ 1175 if (stackptr && (Include & RegSet_StackPointer)) \
1161 Registers[RegARM32::val] = true; \ 1176 Registers[RegARM32::val] = true; \
1162 if (frameptr && (Include & RegSet_FramePointer)) \ 1177 if (frameptr && (Include & RegSet_FramePointer)) \
1163 Registers[RegARM32::val] = true; \ 1178 Registers[RegARM32::val] = true; \
1164 if (scratch && (Exclude & RegSet_CallerSave)) \ 1179 if (scratch && (Exclude & RegSet_CallerSave)) \
1165 Registers[RegARM32::val] = false; \ 1180 Registers[RegARM32::val] = false; \
(...skipping 1875 matching lines...) Expand 10 before | Expand all | Expand 10 after
3041 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n"; 3056 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n";
3042 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) { 3057 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) {
3043 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n"; 3058 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n";
3044 } 3059 }
3045 // Technically R9 is used for TLS with Sandboxing, and we reserve it. 3060 // Technically R9 is used for TLS with Sandboxing, and we reserve it.
3046 // However, for compatibility with current NaCl LLVM, don't claim that. 3061 // However, for compatibility with current NaCl LLVM, don't claim that.
3047 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 3062 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
3048 } 3063 }
3049 3064
3050 } // end of namespace Ice 3065 } // 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