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

Side by Side Diff: src/IceTargetLoweringARM32.cpp

Issue 1419903002: Subzero: Refactor x86 register definitions to use the alias mechanism. (Closed) Base URL: https://chromium.googlesource.com/native_client/pnacl-subzero.git@master
Patch Set: Bring back ByteRegister Created 5 years, 1 month 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 165 matching lines...) Expand 10 before | Expand all | Expand 10 after
176 I64PairRegisters[RegARM32::val] = isI64Pair; \ 176 I64PairRegisters[RegARM32::val] = isI64Pair; \
177 Float32Registers[RegARM32::val] = isFP32; \ 177 Float32Registers[RegARM32::val] = isFP32; \
178 Float64Registers[RegARM32::val] = isFP64; \ 178 Float64Registers[RegARM32::val] = isFP64; \
179 VectorRegisters[RegARM32::val] = isVec128; \ 179 VectorRegisters[RegARM32::val] = isVec128; \
180 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \ 180 RegisterAliases[RegARM32::val].resize(RegARM32::Reg_NUM); \
181 for (SizeT RegAlias : alias_init) { \ 181 for (SizeT RegAlias : alias_init) { \
182 assert(!RegisterAliases[RegARM32::val][RegAlias] && \ 182 assert(!RegisterAliases[RegARM32::val][RegAlias] && \
183 "Duplicate alias for " #val); \ 183 "Duplicate alias for " #val); \
184 RegisterAliases[RegARM32::val].set(RegAlias); \ 184 RegisterAliases[RegARM32::val].set(RegAlias); \
185 } \ 185 } \
186 assert(RegisterAliases[RegARM32::val][RegARM32::val]); \ 186 RegisterAliases[RegARM32::val].set(RegARM32::val); \
187 ScratchRegs[RegARM32::val] = scratch; 187 ScratchRegs[RegARM32::val] = scratch;
188 REGARM32_TABLE; 188 REGARM32_TABLE;
189 #undef X 189 #undef X
190 TypeToRegisterSet[IceType_void] = InvalidRegisters; 190 TypeToRegisterSet[IceType_void] = InvalidRegisters;
191 TypeToRegisterSet[IceType_i1] = IntegerRegisters; 191 TypeToRegisterSet[IceType_i1] = IntegerRegisters;
192 TypeToRegisterSet[IceType_i8] = IntegerRegisters; 192 TypeToRegisterSet[IceType_i8] = IntegerRegisters;
193 TypeToRegisterSet[IceType_i16] = IntegerRegisters; 193 TypeToRegisterSet[IceType_i16] = IntegerRegisters;
194 TypeToRegisterSet[IceType_i32] = IntegerRegisters; 194 TypeToRegisterSet[IceType_i32] = IntegerRegisters;
195 TypeToRegisterSet[IceType_i64] = I64PairRegisters; 195 TypeToRegisterSet[IceType_i64] = I64PairRegisters;
196 TypeToRegisterSet[IceType_f32] = Float32Registers; 196 TypeToRegisterSet[IceType_f32] = Float32Registers;
(...skipping 2374 matching lines...) Expand 10 before | Expand all | Expand 10 after
2571 return; 2571 return;
2572 } 2572 }
2573 2573
2574 void TargetARM32::lowerInsertElement(const InstInsertElement *Inst) { 2574 void TargetARM32::lowerInsertElement(const InstInsertElement *Inst) {
2575 (void)Inst; 2575 (void)Inst;
2576 UnimplementedError(Func->getContext()->getFlags()); 2576 UnimplementedError(Func->getContext()->getFlags());
2577 } 2577 }
2578 2578
2579 namespace { 2579 namespace {
2580 inline uint64_t getConstantMemoryOrder(Operand *Opnd) { 2580 inline uint64_t getConstantMemoryOrder(Operand *Opnd) {
2581 if (auto Integer = llvm::dyn_cast<ConstantInteger32>(Opnd)) 2581 if (auto *Integer = llvm::dyn_cast<ConstantInteger32>(Opnd))
2582 return Integer->getValue(); 2582 return Integer->getValue();
2583 return Intrinsics::MemoryOrderInvalid; 2583 return Intrinsics::MemoryOrderInvalid;
2584 } 2584 }
2585 } // end of anonymous namespace 2585 } // end of anonymous namespace
2586 2586
2587 void TargetARM32::lowerAtomicRMW(Variable *Dest, uint32_t Operation, 2587 void TargetARM32::lowerAtomicRMW(Variable *Dest, uint32_t Operation,
2588 Operand *Ptr, Operand *Val) { 2588 Operand *Ptr, Operand *Val) {
2589 // retry: 2589 // retry:
2590 // ldrex contents, [addr] 2590 // ldrex contents, [addr]
2591 // op tmp, contents, operand 2591 // op tmp, contents, operand
(...skipping 882 matching lines...) Expand 10 before | Expand all | Expand 10 after
3474 int32_t RegNum) { 3474 int32_t RegNum) {
3475 Type Ty = From->getType(); 3475 Type Ty = From->getType();
3476 // Assert that a physical register is allowed. To date, all calls to 3476 // Assert that a physical register is allowed. To date, all calls to
3477 // legalize() allow a physical register. Legal_Flex converts registers to the 3477 // legalize() allow a physical register. Legal_Flex converts registers to the
3478 // right type OperandARM32FlexReg as needed. 3478 // right type OperandARM32FlexReg as needed.
3479 assert(Allowed & Legal_Reg); 3479 assert(Allowed & Legal_Reg);
3480 // Go through the various types of operands: OperandARM32Mem, 3480 // Go through the various types of operands: OperandARM32Mem,
3481 // OperandARM32Flex, Constant, and Variable. Given the above assertion, if 3481 // OperandARM32Flex, Constant, and Variable. Given the above assertion, if
3482 // type of operand is not legal (e.g., OperandARM32Mem and !Legal_Mem), we 3482 // type of operand is not legal (e.g., OperandARM32Mem and !Legal_Mem), we
3483 // can always copy to a register. 3483 // can always copy to a register.
3484 if (auto Mem = llvm::dyn_cast<OperandARM32Mem>(From)) { 3484 if (auto *Mem = llvm::dyn_cast<OperandARM32Mem>(From)) {
3485 static const struct { 3485 static const struct {
3486 bool CanHaveOffset; 3486 bool CanHaveOffset;
3487 bool CanHaveIndex; 3487 bool CanHaveIndex;
3488 } MemTraits[] = { 3488 } MemTraits[] = {
3489 #define X(tag, elementty, int_width, vec_width, sbits, ubits, rraddr) \ 3489 #define X(tag, elementty, int_width, vec_width, sbits, ubits, rraddr) \
3490 { (ubits) > 0, rraddr } \ 3490 { (ubits) > 0, rraddr } \
3491 , 3491 ,
3492 ICETYPEARM32_TABLE 3492 ICETYPEARM32_TABLE
3493 #undef X 3493 #undef X
3494 }; 3494 };
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
3539 if (Allowed & Legal_Mem) { 3539 if (Allowed & Legal_Mem) {
3540 From = Mem; 3540 From = Mem;
3541 } else { 3541 } else {
3542 Variable *Reg = makeReg(Ty, RegNum); 3542 Variable *Reg = makeReg(Ty, RegNum);
3543 _ldr(Reg, Mem); 3543 _ldr(Reg, Mem);
3544 From = Reg; 3544 From = Reg;
3545 } 3545 }
3546 return From; 3546 return From;
3547 } 3547 }
3548 3548
3549 if (auto Flex = llvm::dyn_cast<OperandARM32Flex>(From)) { 3549 if (auto *Flex = llvm::dyn_cast<OperandARM32Flex>(From)) {
3550 if (!(Allowed & Legal_Flex)) { 3550 if (!(Allowed & Legal_Flex)) {
3551 if (auto FlexReg = llvm::dyn_cast<OperandARM32FlexReg>(Flex)) { 3551 if (auto *FlexReg = llvm::dyn_cast<OperandARM32FlexReg>(Flex)) {
3552 if (FlexReg->getShiftOp() == OperandARM32::kNoShift) { 3552 if (FlexReg->getShiftOp() == OperandARM32::kNoShift) {
3553 From = FlexReg->getReg(); 3553 From = FlexReg->getReg();
3554 // Fall through and let From be checked as a Variable below, where it 3554 // Fall through and let From be checked as a Variable below, where it
3555 // may or may not need a register. 3555 // may or may not need a register.
3556 } else { 3556 } else {
3557 return copyToReg(Flex, RegNum); 3557 return copyToReg(Flex, RegNum);
3558 } 3558 }
3559 } else { 3559 } else {
3560 return copyToReg(Flex, RegNum); 3560 return copyToReg(Flex, RegNum);
3561 } 3561 }
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
3622 llvm::cast<Constant>(From)->setShouldBePooled(true); 3622 llvm::cast<Constant>(From)->setShouldBePooled(true);
3623 Constant *Offset = Ctx->getConstantSym(0, StrBuf.str(), true); 3623 Constant *Offset = Ctx->getConstantSym(0, StrBuf.str(), true);
3624 Variable *BaseReg = makeReg(getPointerType()); 3624 Variable *BaseReg = makeReg(getPointerType());
3625 _movw(BaseReg, Offset); 3625 _movw(BaseReg, Offset);
3626 _movt(BaseReg, Offset); 3626 _movt(BaseReg, Offset);
3627 From = formMemoryOperand(BaseReg, Ty); 3627 From = formMemoryOperand(BaseReg, Ty);
3628 return copyToReg(From, RegNum); 3628 return copyToReg(From, RegNum);
3629 } 3629 }
3630 } 3630 }
3631 3631
3632 if (auto Var = llvm::dyn_cast<Variable>(From)) { 3632 if (auto *Var = llvm::dyn_cast<Variable>(From)) {
3633 // Check if the variable is guaranteed a physical register. This can happen 3633 // Check if the variable is guaranteed a physical register. This can happen
3634 // either when the variable is pre-colored or when it is assigned infinite 3634 // either when the variable is pre-colored or when it is assigned infinite
3635 // weight. 3635 // weight.
3636 bool MustHaveRegister = (Var->hasReg() || Var->mustHaveReg()); 3636 bool MustHaveRegister = (Var->hasReg() || Var->mustHaveReg());
3637 // We need a new physical register for the operand if: 3637 // We need a new physical register for the operand if:
3638 // Mem is not allowed and Var isn't guaranteed a physical 3638 // Mem is not allowed and Var isn't guaranteed a physical
3639 // register, or 3639 // register, or
3640 // RegNum is required and Var->getRegNum() doesn't match. 3640 // RegNum is required and Var->getRegNum() doesn't match.
3641 if ((!(Allowed & Legal_Mem) && !MustHaveRegister) || 3641 if ((!(Allowed & Legal_Mem) && !MustHaveRegister) ||
3642 (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) { 3642 (RegNum != Variable::NoRegister && RegNum != Var->getRegNum())) {
(...skipping 311 matching lines...) Expand 10 before | Expand all | Expand 10 after
3954 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n"; 3954 << ".eabi_attribute 68, 1 @ Tag_Virtualization_use\n";
3955 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) { 3955 if (CPUFeatures.hasFeature(TargetARM32Features::HWDivArm)) {
3956 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n"; 3956 Str << ".eabi_attribute 44, 2 @ Tag_DIV_use\n";
3957 } 3957 }
3958 // Technically R9 is used for TLS with Sandboxing, and we reserve it. 3958 // Technically R9 is used for TLS with Sandboxing, and we reserve it.
3959 // However, for compatibility with current NaCl LLVM, don't claim that. 3959 // However, for compatibility with current NaCl LLVM, don't claim that.
3960 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n"; 3960 Str << ".eabi_attribute 14, 3 @ Tag_ABI_PCS_R9_use: Not used\n";
3961 } 3961 }
3962 3962
3963 } // end of namespace Ice 3963 } // end of namespace Ice
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698