summaryrefslogtreecommitdiff
path: root/compiler/optimizing
diff options
context:
space:
mode:
Diffstat (limited to 'compiler/optimizing')
-rw-r--r--compiler/optimizing/code_generator_x86.cc162
-rw-r--r--compiler/optimizing/code_generator_x86.h3
2 files changed, 26 insertions, 139 deletions
diff --git a/compiler/optimizing/code_generator_x86.cc b/compiler/optimizing/code_generator_x86.cc
index a6fb07fa98..48445d79da 100644
--- a/compiler/optimizing/code_generator_x86.cc
+++ b/compiler/optimizing/code_generator_x86.cc
@@ -2712,16 +2712,16 @@ void LocationsBuilderX86::HandleShift(HBinaryOperation* op) {
switch (op->GetResultType()) {
case Primitive::kPrimInt: {
- locations->SetInAt(0, Location::Any());
- // The shift count needs to be in CL or a constant.
+ locations->SetInAt(0, Location::RequiresRegister());
+ // The shift count needs to be in CL.
locations->SetInAt(1, Location::ByteRegisterOrConstant(ECX, op->InputAt(1)));
locations->SetOut(Location::SameAsFirstInput());
break;
}
case Primitive::kPrimLong: {
locations->SetInAt(0, Location::RequiresRegister());
- // The shift count needs to be in CL or a constant.
- locations->SetInAt(1, Location::ByteRegisterOrConstant(ECX, op->InputAt(1)));
+ // The shift count needs to be in CL.
+ locations->SetInAt(1, Location::RegisterLocation(ECX));
locations->SetOut(Location::SameAsFirstInput());
break;
}
@@ -2740,87 +2740,38 @@ void InstructionCodeGeneratorX86::HandleShift(HBinaryOperation* op) {
switch (op->GetResultType()) {
case Primitive::kPrimInt: {
- if (first.IsRegister()) {
- Register first_reg = first.AsRegister<Register>();
- if (second.IsRegister()) {
- Register second_reg = second.AsRegister<Register>();
- DCHECK_EQ(ECX, second_reg);
- if (op->IsShl()) {
- __ shll(first_reg, second_reg);
- } else if (op->IsShr()) {
- __ sarl(first_reg, second_reg);
- } else {
- __ shrl(first_reg, second_reg);
- }
+ Register first_reg = first.AsRegister<Register>();
+ if (second.IsRegister()) {
+ Register second_reg = second.AsRegister<Register>();
+ DCHECK_EQ(ECX, second_reg);
+ if (op->IsShl()) {
+ __ shll(first_reg, second_reg);
+ } else if (op->IsShr()) {
+ __ sarl(first_reg, second_reg);
} else {
- int32_t shift = second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftValue;
- if (shift == 0) {
- return;
- }
- Immediate imm(shift);
- if (op->IsShl()) {
- __ shll(first_reg, imm);
- } else if (op->IsShr()) {
- __ sarl(first_reg, imm);
- } else {
- __ shrl(first_reg, imm);
- }
+ __ shrl(first_reg, second_reg);
}
} else {
- DCHECK(first.IsStackSlot()) << first;
- Address addr(ESP, first.GetStackIndex());
- if (second.IsRegister()) {
- Register second_reg = second.AsRegister<Register>();
- DCHECK_EQ(ECX, second_reg);
- if (op->IsShl()) {
- __ shll(addr, second_reg);
- } else if (op->IsShr()) {
- __ sarl(addr, second_reg);
- } else {
- __ shrl(addr, second_reg);
- }
+ Immediate imm(second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftValue);
+ if (op->IsShl()) {
+ __ shll(first_reg, imm);
+ } else if (op->IsShr()) {
+ __ sarl(first_reg, imm);
} else {
- int32_t shift = second.GetConstant()->AsIntConstant()->GetValue() & kMaxIntShiftValue;
- if (shift == 0) {
- return;
- }
- Immediate imm(shift);
- if (op->IsShl()) {
- __ shll(addr, imm);
- } else if (op->IsShr()) {
- __ sarl(addr, imm);
- } else {
- __ shrl(addr, imm);
- }
+ __ shrl(first_reg, imm);
}
}
-
break;
}
case Primitive::kPrimLong: {
- if (second.IsRegister()) {
- Register second_reg = second.AsRegister<Register>();
- DCHECK_EQ(ECX, second_reg);
- if (op->IsShl()) {
- GenerateShlLong(first, second_reg);
- } else if (op->IsShr()) {
- GenerateShrLong(first, second_reg);
- } else {
- GenerateUShrLong(first, second_reg);
- }
+ Register second_reg = second.AsRegister<Register>();
+ DCHECK_EQ(ECX, second_reg);
+ if (op->IsShl()) {
+ GenerateShlLong(first, second_reg);
+ } else if (op->IsShr()) {
+ GenerateShrLong(first, second_reg);
} else {
- // Shift by a constant.
- int shift = second.GetConstant()->AsIntConstant()->GetValue() & kMaxLongShiftValue;
- // Nothing to do if the shift is 0, as the input is already the output.
- if (shift != 0) {
- if (op->IsShl()) {
- GenerateShlLong(first, shift);
- } else if (op->IsShr()) {
- GenerateShrLong(first, shift);
- } else {
- GenerateUShrLong(first, shift);
- }
- }
+ GenerateUShrLong(first, second_reg);
}
break;
}
@@ -2829,26 +2780,6 @@ void InstructionCodeGeneratorX86::HandleShift(HBinaryOperation* op) {
}
}
-void InstructionCodeGeneratorX86::GenerateShlLong(const Location& loc, int shift) {
- Register low = loc.AsRegisterPairLow<Register>();
- Register high = loc.AsRegisterPairHigh<Register>();
- if (shift == 32) {
- // Shift by 32 is easy. High gets low, and low gets 0.
- codegen_->EmitParallelMoves(
- loc.ToLow(), loc.ToHigh(),
- Location::ConstantLocation(GetGraph()->GetIntConstant(0)), loc.ToLow());
- } else if (shift > 32) {
- // Low part becomes 0. High part is low part << (shift-32).
- __ movl(high, low);
- __ shll(high, Immediate(shift - 32));
- __ xorl(low, low);
- } else {
- // Between 1 and 31.
- __ shld(high, low, Immediate(shift));
- __ shll(low, Immediate(shift));
- }
-}
-
void InstructionCodeGeneratorX86::GenerateShlLong(const Location& loc, Register shifter) {
Label done;
__ shld(loc.AsRegisterPairHigh<Register>(), loc.AsRegisterPairLow<Register>(), shifter);
@@ -2860,27 +2791,6 @@ void InstructionCodeGeneratorX86::GenerateShlLong(const Location& loc, Register
__ Bind(&done);
}
-void InstructionCodeGeneratorX86::GenerateShrLong(const Location& loc, int shift) {
- Register low = loc.AsRegisterPairLow<Register>();
- Register high = loc.AsRegisterPairHigh<Register>();
- if (shift == 32) {
- // Need to copy the sign.
- DCHECK_NE(low, high);
- __ movl(low, high);
- __ sarl(high, Immediate(31));
- } else if (shift > 32) {
- DCHECK_NE(low, high);
- // High part becomes sign. Low part is shifted by shift - 32.
- __ movl(low, high);
- __ sarl(high, Immediate(31));
- __ shrl(low, Immediate(shift - 32));
- } else {
- // Between 1 and 31.
- __ shrd(low, high, Immediate(shift));
- __ sarl(high, Immediate(shift));
- }
-}
-
void InstructionCodeGeneratorX86::GenerateShrLong(const Location& loc, Register shifter) {
Label done;
__ shrd(loc.AsRegisterPairLow<Register>(), loc.AsRegisterPairHigh<Register>(), shifter);
@@ -2892,26 +2802,6 @@ void InstructionCodeGeneratorX86::GenerateShrLong(const Location& loc, Register
__ Bind(&done);
}
-void InstructionCodeGeneratorX86::GenerateUShrLong(const Location& loc, int shift) {
- Register low = loc.AsRegisterPairLow<Register>();
- Register high = loc.AsRegisterPairHigh<Register>();
- if (shift == 32) {
- // Shift by 32 is easy. Low gets high, and high gets 0.
- codegen_->EmitParallelMoves(
- loc.ToHigh(), loc.ToLow(),
- Location::ConstantLocation(GetGraph()->GetIntConstant(0)), loc.ToHigh());
- } else if (shift > 32) {
- // Low part is high >> (shift - 32). High part becomes 0.
- __ movl(low, high);
- __ shrl(low, Immediate(shift - 32));
- __ xorl(high, high);
- } else {
- // Between 1 and 31.
- __ shrd(low, high, Immediate(shift));
- __ shrl(high, Immediate(shift));
- }
-}
-
void InstructionCodeGeneratorX86::GenerateUShrLong(const Location& loc, Register shifter) {
Label done;
__ shrd(loc.AsRegisterPairLow<Register>(), loc.AsRegisterPairHigh<Register>(), shifter);
diff --git a/compiler/optimizing/code_generator_x86.h b/compiler/optimizing/code_generator_x86.h
index 8c56e35329..00a4323a54 100644
--- a/compiler/optimizing/code_generator_x86.h
+++ b/compiler/optimizing/code_generator_x86.h
@@ -172,9 +172,6 @@ class InstructionCodeGeneratorX86 : public HGraphVisitor {
void GenerateShlLong(const Location& loc, Register shifter);
void GenerateShrLong(const Location& loc, Register shifter);
void GenerateUShrLong(const Location& loc, Register shifter);
- void GenerateShlLong(const Location& loc, int shift);
- void GenerateShrLong(const Location& loc, int shift);
- void GenerateUShrLong(const Location& loc, int shift);
void GenerateMemoryBarrier(MemBarrierKind kind);
void HandleFieldSet(HInstruction* instruction, const FieldInfo& field_info);
void HandleFieldGet(HInstruction* instruction, const FieldInfo& field_info);