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

Side by Side Diff: src/ia32/lithium-codegen-ia32.cc

Issue 195023002: Fix uses of range analysis results in HChange. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 9 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 | Annotate | Revision Log
« no previous file with comments | « src/hydrogen-instructions.cc ('k') | src/ia32/lithium-ia32.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 4856 matching lines...) Expand 10 before | Expand all | Expand 10 after
4867 Register input_reg = ToRegister(input); 4867 Register input_reg = ToRegister(input);
4868 __ push(input_reg); 4868 __ push(input_reg);
4869 X87Mov(ToX87Register(output), Operand(esp, 0), kX87IntOperand); 4869 X87Mov(ToX87Register(output), Operand(esp, 0), kX87IntOperand);
4870 __ pop(input_reg); 4870 __ pop(input_reg);
4871 } else { 4871 } else {
4872 X87Mov(ToX87Register(output), ToOperand(input), kX87IntOperand); 4872 X87Mov(ToX87Register(output), ToOperand(input), kX87IntOperand);
4873 } 4873 }
4874 } 4874 }
4875 4875
4876 4876
4877 void LCodeGen::DoInteger32ToSmi(LInteger32ToSmi* instr) {
4878 Register input = ToRegister(instr->value());
4879 __ SmiTag(input);
4880 if (!instr->hydrogen()->value()->HasRange() ||
4881 !instr->hydrogen()->value()->range()->IsInSmiRange()) {
4882 DeoptimizeIf(overflow, instr->environment());
4883 }
4884 }
4885
4886
4887 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) { 4877 void LCodeGen::DoUint32ToDouble(LUint32ToDouble* instr) {
4888 LOperand* input = instr->value(); 4878 LOperand* input = instr->value();
4889 LOperand* output = instr->result(); 4879 LOperand* output = instr->result();
4890 if (CpuFeatures::IsSupported(SSE2)) { 4880 if (CpuFeatures::IsSupported(SSE2)) {
4891 CpuFeatureScope scope(masm(), SSE2); 4881 CpuFeatureScope scope(masm(), SSE2);
4892 LOperand* temp = instr->temp(); 4882 LOperand* temp = instr->temp();
4893 4883
4894 __ LoadUint32(ToDoubleRegister(output), 4884 __ LoadUint32(ToDoubleRegister(output),
4895 ToRegister(input), 4885 ToRegister(input),
4896 ToDoubleRegister(temp)); 4886 ToDoubleRegister(temp));
4897 } else { 4887 } else {
4898 X87Register res = ToX87Register(output); 4888 X87Register res = ToX87Register(output);
4899 X87PrepareToWrite(res); 4889 X87PrepareToWrite(res);
4900 __ LoadUint32NoSSE2(ToRegister(input)); 4890 __ LoadUint32NoSSE2(ToRegister(input));
4901 X87CommitWrite(res); 4891 X87CommitWrite(res);
4902 } 4892 }
4903 } 4893 }
4904 4894
4905 4895
4906 void LCodeGen::DoUint32ToSmi(LUint32ToSmi* instr) {
4907 Register input = ToRegister(instr->value());
4908 if (!instr->hydrogen()->value()->HasRange() ||
4909 !instr->hydrogen()->value()->range()->IsInSmiRange()) {
4910 __ test(input, Immediate(0xc0000000));
4911 DeoptimizeIf(not_zero, instr->environment());
4912 }
4913 __ SmiTag(input);
4914 }
4915
4916
4917 void LCodeGen::DoNumberTagI(LNumberTagI* instr) { 4896 void LCodeGen::DoNumberTagI(LNumberTagI* instr) {
4918 class DeferredNumberTagI V8_FINAL : public LDeferredCode { 4897 class DeferredNumberTagI V8_FINAL : public LDeferredCode {
4919 public: 4898 public:
4920 DeferredNumberTagI(LCodeGen* codegen, 4899 DeferredNumberTagI(LCodeGen* codegen,
4921 LNumberTagI* instr, 4900 LNumberTagI* instr,
4922 const X87Stack& x87_stack) 4901 const X87Stack& x87_stack)
4923 : LDeferredCode(codegen, x87_stack), instr_(instr) { } 4902 : LDeferredCode(codegen, x87_stack), instr_(instr) { }
4924 virtual void Generate() V8_OVERRIDE { 4903 virtual void Generate() V8_OVERRIDE {
4925 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(), 4904 codegen()->DoDeferredNumberTagIU(instr_, instr_->value(), instr_->temp(),
4926 NULL, SIGNED_INT32); 4905 NULL, SIGNED_INT32);
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after
5108 // not have easy access to the local context. 5087 // not have easy access to the local context.
5109 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); 5088 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
5110 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber); 5089 __ CallRuntimeSaveDoubles(Runtime::kAllocateHeapNumber);
5111 RecordSafepointWithRegisters( 5090 RecordSafepointWithRegisters(
5112 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt); 5091 instr->pointer_map(), 0, Safepoint::kNoLazyDeopt);
5113 __ StoreToSafepointRegisterSlot(reg, eax); 5092 __ StoreToSafepointRegisterSlot(reg, eax);
5114 } 5093 }
5115 5094
5116 5095
5117 void LCodeGen::DoSmiTag(LSmiTag* instr) { 5096 void LCodeGen::DoSmiTag(LSmiTag* instr) {
5118 LOperand* input = instr->value(); 5097 HChange* hchange = instr->hydrogen();
5119 ASSERT(input->IsRegister() && input->Equals(instr->result())); 5098 Register input = ToRegister(instr->value());
5120 ASSERT(!instr->hydrogen_value()->CheckFlag(HValue::kCanOverflow)); 5099 if (hchange->CheckFlag(HValue::kCanOverflow) &&
5121 __ SmiTag(ToRegister(input)); 5100 hchange->value()->CheckFlag(HValue::kUint32)) {
5101 __ test(input, Immediate(0xc0000000));
5102 DeoptimizeIf(not_zero, instr->environment());
5103 }
5104 __ SmiTag(input);
5105 if (hchange->CheckFlag(HValue::kCanOverflow) &&
5106 !hchange->value()->CheckFlag(HValue::kUint32)) {
5107 DeoptimizeIf(overflow, instr->environment());
5108 }
5122 } 5109 }
5123 5110
5124 5111
5125 void LCodeGen::DoSmiUntag(LSmiUntag* instr) { 5112 void LCodeGen::DoSmiUntag(LSmiUntag* instr) {
5126 LOperand* input = instr->value(); 5113 LOperand* input = instr->value();
5127 Register result = ToRegister(input); 5114 Register result = ToRegister(input);
5128 ASSERT(input->IsRegister() && input->Equals(instr->result())); 5115 ASSERT(input->IsRegister() && input->Equals(instr->result()));
5129 if (instr->needs_check()) { 5116 if (instr->needs_check()) {
5130 __ test(result, Immediate(kSmiTagMask)); 5117 __ test(result, Immediate(kSmiTagMask));
5131 DeoptimizeIf(not_zero, instr->environment()); 5118 DeoptimizeIf(not_zero, instr->environment());
(...skipping 1211 matching lines...) Expand 10 before | Expand all | Expand 10 after
6343 FixedArray::kHeaderSize - kPointerSize)); 6330 FixedArray::kHeaderSize - kPointerSize));
6344 __ bind(&done); 6331 __ bind(&done);
6345 } 6332 }
6346 6333
6347 6334
6348 #undef __ 6335 #undef __
6349 6336
6350 } } // namespace v8::internal 6337 } } // namespace v8::internal
6351 6338
6352 #endif // V8_TARGET_ARCH_IA32 6339 #endif // V8_TARGET_ARCH_IA32
OLDNEW
« no previous file with comments | « src/hydrogen-instructions.cc ('k') | src/ia32/lithium-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698