| Index: src/ia32/lithium-codegen-ia32.cc
|
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
|
| index 0f2d32b106214ace9e070d853ade7387bf8f6f6e..6fa1c4243f4ca71a950a65e26f418618386cb58e 100644
|
| --- a/src/ia32/lithium-codegen-ia32.cc
|
| +++ b/src/ia32/lithium-codegen-ia32.cc
|
| @@ -260,7 +260,7 @@ bool LCodeGen::GeneratePrologue() {
|
|
|
| if (info()->saves_caller_doubles() && CpuFeatures::IsSupported(SSE2)) {
|
| Comment(";;; Save clobbered callee double registers");
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| int count = 0;
|
| BitVector* doubles = chunk()->allocated_double_registers();
|
| BitVector::Iterator save_iterator(doubles);
|
| @@ -1695,8 +1695,8 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
| int32_t lower = static_cast<int32_t>(int_val);
|
| int32_t upper = static_cast<int32_t>(int_val >> (kBitsPerInt));
|
| if (CpuFeatures::IsSupported(SSE4_1)) {
|
| - CpuFeatures::Scope scope1(SSE2);
|
| - CpuFeatures::Scope scope2(SSE4_1);
|
| + CpuFeatureScope scope1(masm(), SSE2);
|
| + CpuFeatureScope scope2(masm(), SSE4_1);
|
| if (lower != 0) {
|
| __ Set(temp, Immediate(lower));
|
| __ movd(res, Operand(temp));
|
| @@ -1708,7 +1708,7 @@ void LCodeGen::DoConstantD(LConstantD* instr) {
|
| __ pinsrd(res, Operand(temp), 1);
|
| }
|
| } else {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| __ Set(temp, Immediate(upper));
|
| __ movd(res, Operand(temp));
|
| __ psllq(res, 32);
|
| @@ -1871,7 +1871,7 @@ void LCodeGen::DoAddI(LAddI* instr) {
|
|
|
|
|
| void LCodeGen::DoMathMinMax(LMathMinMax* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| LOperand* left = instr->left();
|
| LOperand* right = instr->right();
|
| ASSERT(left->Equals(instr->result()));
|
| @@ -1933,7 +1933,7 @@ void LCodeGen::DoMathMinMax(LMathMinMax* instr) {
|
|
|
|
|
| void LCodeGen::DoArithmeticD(LArithmeticD* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister left = ToDoubleRegister(instr->left());
|
| XMMRegister right = ToDoubleRegister(instr->right());
|
| XMMRegister result = ToDoubleRegister(instr->result());
|
| @@ -2018,7 +2018,7 @@ void LCodeGen::EmitBranch(int left_block, int right_block, Condition cc) {
|
| void LCodeGen::DoBranch(LBranch* instr) {
|
| int true_block = chunk_->LookupDestination(instr->true_block_id());
|
| int false_block = chunk_->LookupDestination(instr->false_block_id());
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
|
|
| Representation r = instr->hydrogen()->value()->representation();
|
| if (r.IsInteger32()) {
|
| @@ -2188,7 +2188,7 @@ void LCodeGen::DoCmpIDAndBranch(LCmpIDAndBranch* instr) {
|
| EmitGoto(next_block);
|
| } else {
|
| if (instr->is_double()) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| // Don't base result on EFLAGS when a NaN is involved. Instead
|
| // jump to the false block.
|
| __ ucomisd(ToDoubleRegister(left), ToDoubleRegister(right));
|
| @@ -2706,7 +2706,7 @@ void LCodeGen::DoReturn(LReturn* instr) {
|
| }
|
| if (info()->saves_caller_doubles() && CpuFeatures::IsSupported(SSE2)) {
|
| ASSERT(NeedsEagerFrame());
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| BitVector* doubles = chunk()->allocated_double_registers();
|
| BitVector::Iterator save_iterator(doubles);
|
| int count = 0;
|
| @@ -3119,7 +3119,7 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
|
| instr->additional_index()));
|
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister result(ToDoubleRegister(instr->result()));
|
| __ movss(result, operand);
|
| __ cvtss2sd(result, result);
|
| @@ -3129,7 +3129,7 @@ void LCodeGen::DoLoadKeyedExternalArray(LLoadKeyed* instr) {
|
| }
|
| } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| __ movdbl(ToDoubleRegister(instr->result()), operand);
|
| } else {
|
| __ fld_d(operand);
|
| @@ -3223,7 +3223,7 @@ void LCodeGen::DoLoadKeyedFixedDoubleArray(LLoadKeyed* instr) {
|
| FixedDoubleArray::kHeaderSize - kHeapObjectTag,
|
| instr->additional_index());
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister result = ToDoubleRegister(instr->result());
|
| __ movdbl(result, double_load_operand);
|
| } else {
|
| @@ -3647,7 +3647,7 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
| ASSERT(instr->value()->Equals(instr->result()));
|
| Representation r = instr->hydrogen()->value()->representation();
|
|
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| if (r.IsDouble()) {
|
| XMMRegister scratch = xmm0;
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| @@ -3669,13 +3669,13 @@ void LCodeGen::DoMathAbs(LUnaryMathOperation* instr) {
|
|
|
|
|
| void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister xmm_scratch = xmm0;
|
| Register output_reg = ToRegister(instr->result());
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
|
|
| if (CpuFeatures::IsSupported(SSE4_1)) {
|
| - CpuFeatures::Scope scope(SSE4_1);
|
| + CpuFeatureScope scope(masm(), SSE4_1);
|
| if (instr->hydrogen()->CheckFlag(HValue::kBailoutOnMinusZero)) {
|
| // Deoptimize on negative zero.
|
| Label non_zero;
|
| @@ -3734,7 +3734,7 @@ void LCodeGen::DoMathFloor(LUnaryMathOperation* instr) {
|
| }
|
|
|
| void LCodeGen::DoMathRound(LMathRound* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| Register output_reg = ToRegister(instr->result());
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| XMMRegister xmm_scratch = xmm0;
|
| @@ -3795,7 +3795,7 @@ void LCodeGen::DoMathRound(LMathRound* instr) {
|
|
|
|
|
| void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| ASSERT(ToDoubleRegister(instr->result()).is(input_reg));
|
| __ sqrtsd(input_reg, input_reg);
|
| @@ -3803,7 +3803,7 @@ void LCodeGen::DoMathSqrt(LUnaryMathOperation* instr) {
|
|
|
|
|
| void LCodeGen::DoMathPowHalf(LMathPowHalf* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister xmm_scratch = xmm0;
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| Register scratch = ToRegister(instr->temp());
|
| @@ -3880,7 +3880,7 @@ void LCodeGen::DoRandom(LRandom* instr) {
|
|
|
| DeferredDoRandom* deferred = new(zone()) DeferredDoRandom(this, instr);
|
|
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| // Having marked this instruction as a call we can use any
|
| // registers.
|
| ASSERT(ToDoubleRegister(instr->result()).is(xmm1));
|
| @@ -3948,7 +3948,7 @@ void LCodeGen::DoDeferredRandom(LRandom* instr) {
|
|
|
|
|
| void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| ASSERT(instr->value()->Equals(instr->result()));
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| Label positive, done, zero;
|
| @@ -3980,7 +3980,7 @@ void LCodeGen::DoMathLog(LUnaryMathOperation* instr) {
|
|
|
|
|
| void LCodeGen::DoMathExp(LMathExp* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input = ToDoubleRegister(instr->value());
|
| XMMRegister result = ToDoubleRegister(instr->result());
|
| Register temp1 = ToRegister(instr->temp1());
|
| @@ -4270,11 +4270,11 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
| 0,
|
| instr->additional_index()));
|
| if (elements_kind == EXTERNAL_FLOAT_ELEMENTS) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| __ cvtsd2ss(xmm0, ToDoubleRegister(instr->value()));
|
| __ movss(operand, xmm0);
|
| } else if (elements_kind == EXTERNAL_DOUBLE_ELEMENTS) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| __ movdbl(operand, ToDoubleRegister(instr->value()));
|
| } else {
|
| Register value = ToRegister(instr->value());
|
| @@ -4310,7 +4310,7 @@ void LCodeGen::DoStoreKeyedExternalArray(LStoreKeyed* instr) {
|
|
|
|
|
| void LCodeGen::DoStoreKeyedFixedDoubleArray(LStoreKeyed* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister value = ToDoubleRegister(instr->value());
|
|
|
| if (instr->NeedsCanonicalization()) {
|
| @@ -4585,7 +4585,7 @@ void LCodeGen::DoStringAdd(LStringAdd* instr) {
|
|
|
| void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| LOperand* input = instr->value();
|
| ASSERT(input->IsRegister() || input->IsStackSlot());
|
| LOperand* output = instr->result();
|
| @@ -4598,7 +4598,7 @@ void LCodeGen::DoInteger32ToDouble(LInteger32ToDouble* instr) {
|
|
|
|
|
| void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| LOperand* input = instr->value();
|
| LOperand* output = instr->result();
|
| LOperand* temp = instr->temp();
|
| @@ -4677,7 +4677,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr,
|
| __ SmiUntag(reg);
|
| __ xor_(reg, 0x80000000);
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope feature_scope(SSE2);
|
| + CpuFeatureScope feature_scope(masm(), SSE2);
|
| __ cvtsi2sd(xmm0, Operand(reg));
|
| } else {
|
| __ push(reg);
|
| @@ -4686,7 +4686,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr,
|
| }
|
| } else {
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope feature_scope(SSE2);
|
| + CpuFeatureScope feature_scope(masm(), SSE2);
|
| __ LoadUint32(xmm0, reg, xmm1);
|
| } else {
|
| // There's no fild variant for unsigned values, so zero-extend to a 64-bit
|
| @@ -4726,7 +4726,7 @@ void LCodeGen::DoDeferredNumberTagI(LInstruction* instr,
|
| // number.
|
| __ bind(&done);
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope feature_scope(SSE2);
|
| + CpuFeatureScope feature_scope(masm(), SSE2);
|
| __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), xmm0);
|
| } else {
|
| __ fstp_d(FieldOperand(reg, HeapNumber::kValueOffset));
|
| @@ -4760,7 +4760,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| if (convert_hole) {
|
| bool use_sse2 = CpuFeatures::IsSupported(SSE2);
|
| if (use_sse2) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ ucomisd(input_reg, input_reg);
|
| } else {
|
| @@ -4775,7 +4775,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| __ j(parity_odd, &no_special_nan_handling);
|
| __ sub(esp, Immediate(kDoubleSize));
|
| if (use_sse2) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ movdbl(MemOperand(esp, 0), input_reg);
|
| } else {
|
| @@ -4794,7 +4794,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| ExternalReference nan =
|
| ExternalReference::address_of_canonical_non_hole_nan();
|
| if (use_sse2) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ movdbl(input_reg, Operand::StaticVariable(nan));
|
| } else {
|
| @@ -4813,7 +4813,7 @@ void LCodeGen::DoNumberTagD(LNumberTagD* instr) {
|
| }
|
| __ bind(deferred->exit());
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister input_reg = ToDoubleRegister(instr->value());
|
| __ movdbl(FieldOperand(reg, HeapNumber::kValueOffset), input_reg);
|
| } else {
|
| @@ -4956,7 +4956,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
|
|
|
| __ bind(&heap_number);
|
| if (CpuFeatures::IsSupported(SSE3)) {
|
| - CpuFeatures::Scope scope(SSE3);
|
| + CpuFeatureScope scope(masm(), SSE3);
|
| Label convert;
|
| // Use more powerful conversion when sse3 is available.
|
| // Load x87 register with heap number.
|
| @@ -4981,7 +4981,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
|
| __ mov(input_reg, Operand(esp, 0)); // Low word of answer is the result.
|
| __ add(Operand(esp), Immediate(kDoubleSize));
|
| } else {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister xmm_temp = ToDoubleRegister(instr->temp());
|
| __ movdbl(xmm0, FieldOperand(input_reg, HeapNumber::kValueOffset));
|
| __ cvttsd2si(input_reg, Operand(xmm0));
|
| @@ -4996,7 +4996,7 @@ void LCodeGen::DoDeferredTaggedToI(LTaggedToI* instr) {
|
| DeoptimizeIf(parity_even, instr->environment()); // NaN.
|
| }
|
| } else if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| // Deoptimize if we don't have a heap number.
|
| __ RecordComment("Deferred TaggedToI: not a heap number");
|
| DeoptimizeIf(not_equal, instr->environment());
|
| @@ -5063,7 +5063,7 @@ void LCodeGen::DoNumberUntagD(LNumberUntagD* instr) {
|
| ASSERT(result->IsDoubleRegister());
|
|
|
| if (CpuFeatures::IsSupported(SSE2)) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| Register input_reg = ToRegister(input);
|
| XMMRegister result_reg = ToDoubleRegister(result);
|
|
|
| @@ -5106,7 +5106,7 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
|
| ASSERT(input->IsDoubleRegister());
|
| LOperand* result = instr->result();
|
| ASSERT(result->IsRegister());
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
|
|
| XMMRegister input_reg = ToDoubleRegister(input);
|
| Register result_reg = ToRegister(result);
|
| @@ -5118,7 +5118,7 @@ void LCodeGen::DoDoubleToI(LDoubleToI* instr) {
|
| __ cmp(result_reg, 0x80000000u);
|
| if (CpuFeatures::IsSupported(SSE3)) {
|
| // This will deoptimize if the exponent of the input in out of range.
|
| - CpuFeatures::Scope scope(SSE3);
|
| + CpuFeatureScope scope(masm(), SSE3);
|
| Label convert, done;
|
| __ j(not_equal, &done, Label::kNear);
|
| __ sub(Operand(esp), Immediate(kDoubleSize));
|
| @@ -5323,7 +5323,7 @@ void LCodeGen::DoCheckMaps(LCheckMaps* instr) {
|
|
|
|
|
| void LCodeGen::DoClampDToUint8(LClampDToUint8* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
| XMMRegister value_reg = ToDoubleRegister(instr->unclamped());
|
| Register result_reg = ToRegister(instr->result());
|
| __ ClampDoubleToUint8(value_reg, xmm0, result_reg);
|
| @@ -5338,7 +5338,7 @@ void LCodeGen::DoClampIToUint8(LClampIToUint8* instr) {
|
|
|
|
|
| void LCodeGen::DoClampTToUint8(LClampTToUint8* instr) {
|
| - CpuFeatures::Scope scope(SSE2);
|
| + CpuFeatureScope scope(masm(), SSE2);
|
|
|
| ASSERT(instr->unclamped()->Equals(instr->result()));
|
| Register input_reg = ToRegister(instr->unclamped());
|
|
|