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

Side by Side Diff: src/code-stubs.cc

Issue 22184004: Desugar bitwise negation into XOR and kill all UnaryOp stuff. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Rebased. Feedback. Created 7 years, 4 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
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 186 matching lines...) Expand 10 before | Expand all | Expand 10 after
197 stream->Add("%s", MajorName(MajorKey(), false)); 197 stream->Add("%s", MajorName(MajorKey(), false));
198 } 198 }
199 199
200 200
201 void CodeStub::PrintName(StringStream* stream) { 201 void CodeStub::PrintName(StringStream* stream) {
202 PrintBaseName(stream); 202 PrintBaseName(stream);
203 PrintState(stream); 203 PrintState(stream);
204 } 204 }
205 205
206 206
207 Builtins::JavaScript UnaryOpStub::ToJSBuiltin() {
208 switch (operation_) {
209 default:
210 UNREACHABLE();
211 case Token::BIT_NOT:
212 return Builtins::BIT_NOT;
213 }
214 }
215
216
217 Handle<JSFunction> UnaryOpStub::ToJSFunction(Isolate* isolate) {
218 Handle<JSBuiltinsObject> builtins(isolate->js_builtins_object());
219 Object* builtin = builtins->javascript_builtin(ToJSBuiltin());
220 return Handle<JSFunction>(JSFunction::cast(builtin), isolate);
221 }
222
223
224 MaybeObject* UnaryOpStub::Result(Handle<Object> object, Isolate* isolate) {
225 Handle<JSFunction> builtin_function = ToJSFunction(isolate);
226 bool caught_exception;
227 Handle<Object> result = Execution::Call(builtin_function, object,
228 0, NULL, &caught_exception);
229 if (caught_exception) {
230 return Failure::Exception();
231 }
232 return *result;
233 }
234
235
236 void UnaryOpStub::UpdateStatus(Handle<Object> object) {
237 State old_state(state_);
238 if (object->IsSmi()) {
239 state_.Add(SMI);
240 } else if (object->IsHeapNumber()) {
241 state_.Add(HEAP_NUMBER);
242 } else {
243 state_.Add(GENERIC);
244 }
245 TraceTransition(old_state, state_);
246 }
247
248
249 Handle<Type> UnaryOpStub::GetType(Isolate* isolate) {
250 if (state_.Contains(GENERIC)) {
251 return handle(Type::Any(), isolate);
252 }
253 Handle<Type> type = handle(Type::None(), isolate);
254 if (state_.Contains(SMI)) {
255 type = handle(
256 Type::Union(type, handle(Type::Smi(), isolate)), isolate);
257 }
258 if (state_.Contains(HEAP_NUMBER)) {
259 type = handle(
260 Type::Union(type, handle(Type::Double(), isolate)), isolate);
261 }
262 return type;
263 }
264
265
266 void BinaryOpStub::Generate(MacroAssembler* masm) { 207 void BinaryOpStub::Generate(MacroAssembler* masm) {
267 // Explicitly allow generation of nested stubs. It is safe here because 208 // Explicitly allow generation of nested stubs. It is safe here because
268 // generation code does not use any raw pointers. 209 // generation code does not use any raw pointers.
269 AllowStubCallsScope allow_stub_calls(masm, true); 210 AllowStubCallsScope allow_stub_calls(masm, true);
270 211
271 BinaryOpIC::TypeInfo operands_type = Max(left_type_, right_type_); 212 BinaryOpIC::TypeInfo operands_type = Max(left_type_, right_type_);
272 if (left_type_ == BinaryOpIC::ODDBALL && right_type_ == BinaryOpIC::ODDBALL) { 213 if (left_type_ == BinaryOpIC::ODDBALL && right_type_ == BinaryOpIC::ODDBALL) {
273 // The OddballStub handles a number and an oddball, not two oddballs. 214 // The OddballStub handles a number and an oddball, not two oddballs.
274 operands_type = BinaryOpIC::GENERIC; 215 operands_type = BinaryOpIC::GENERIC;
275 } 216 }
(...skipping 65 matching lines...) Expand 10 before | Expand all | Expand 10 after
341 break; 282 break;
342 default: 283 default:
343 UNREACHABLE(); 284 UNREACHABLE();
344 } 285 }
345 } 286 }
346 287
347 288
348 #undef __ 289 #undef __
349 290
350 291
351 void UnaryOpStub::PrintBaseName(StringStream* stream) {
352 CodeStub::PrintBaseName(stream);
353 if (operation_ == Token::BIT_NOT) stream->Add("Not");
354 }
355
356
357 void UnaryOpStub::PrintState(StringStream* stream) {
358 state_.Print(stream);
359 }
360
361
362 void UnaryOpStub::State::Print(StringStream* stream) const {
363 stream->Add("(");
364 SimpleListPrinter printer(stream);
365 if (IsEmpty()) printer.Add("None");
366 if (Contains(GENERIC)) printer.Add("Generic");
367 if (Contains(HEAP_NUMBER)) printer.Add("HeapNumber");
368 if (Contains(SMI)) printer.Add("Smi");
369 stream->Add(")");
370 }
371
372
373 void BinaryOpStub::PrintName(StringStream* stream) { 292 void BinaryOpStub::PrintName(StringStream* stream) {
374 const char* op_name = Token::Name(op_); 293 const char* op_name = Token::Name(op_);
375 const char* overwrite_name; 294 const char* overwrite_name;
376 switch (mode_) { 295 switch (mode_) {
377 case NO_OVERWRITE: overwrite_name = "Alloc"; break; 296 case NO_OVERWRITE: overwrite_name = "Alloc"; break;
378 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break; 297 case OVERWRITE_RIGHT: overwrite_name = "OverwriteRight"; break;
379 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break; 298 case OVERWRITE_LEFT: overwrite_name = "OverwriteLeft"; break;
380 default: overwrite_name = "UnknownOverwrite"; break; 299 default: overwrite_name = "UnknownOverwrite"; break;
381 } 300 }
382 stream->Add("BinaryOpStub_%s_%s_%s+%s", 301 stream->Add("BinaryOpStub_%s_%s_%s+%s",
(...skipping 494 matching lines...) Expand 10 before | Expand all | Expand 10 after
877 InstallDescriptor(isolate, &stub3); 796 InstallDescriptor(isolate, &stub3);
878 } 797 }
879 798
880 InternalArrayConstructorStub::InternalArrayConstructorStub( 799 InternalArrayConstructorStub::InternalArrayConstructorStub(
881 Isolate* isolate) { 800 Isolate* isolate) {
882 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate); 801 InternalArrayConstructorStubBase::GenerateStubsAheadOfTime(isolate);
883 } 802 }
884 803
885 804
886 } } // namespace v8::internal 805 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/code-stubs.h ('k') | src/code-stubs-hydrogen.cc » ('j') | src/x64/lithium-codegen-x64.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698