| OLD | NEW |
| 1 // Copyright 2011 the V8 project authors. All rights reserved. | 1 // Copyright 2011 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 240 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 251 // undefined -> false | 251 // undefined -> false |
| 252 CheckOddball(masm, UNDEFINED, factory->undefined_value(), false, &patch); | 252 CheckOddball(masm, UNDEFINED, factory->undefined_value(), false, &patch); |
| 253 | 253 |
| 254 // Boolean -> its value | 254 // Boolean -> its value |
| 255 CheckOddball(masm, BOOLEAN, factory->false_value(), false, &patch); | 255 CheckOddball(masm, BOOLEAN, factory->false_value(), false, &patch); |
| 256 CheckOddball(masm, BOOLEAN, factory->true_value(), true, &patch); | 256 CheckOddball(masm, BOOLEAN, factory->true_value(), true, &patch); |
| 257 | 257 |
| 258 // 'null' -> false. | 258 // 'null' -> false. |
| 259 CheckOddball(masm, NULL_TYPE, factory->null_value(), false, &patch); | 259 CheckOddball(masm, NULL_TYPE, factory->null_value(), false, &patch); |
| 260 | 260 |
| 261 bool need_map = | |
| 262 types_.Contains(SPEC_OBJECT) | | |
| 263 types_.Contains(STRING) | | |
| 264 types_.Contains(HEAP_NUMBER) | | |
| 265 types_.Contains(INTERNAL_OBJECT); | |
| 266 | |
| 267 if (types_.Contains(SMI)) { | 261 if (types_.Contains(SMI)) { |
| 268 // Smis: 0 -> false, all other -> true | 262 // Smis: 0 -> false, all other -> true |
| 269 Label not_smi; | 263 Label not_smi; |
| 270 __ JumpIfNotSmi(argument, ¬_smi, Label::kNear); | 264 __ JumpIfNotSmi(argument, ¬_smi, Label::kNear); |
| 271 // argument contains the correct return value already | 265 // argument contains the correct return value already |
| 272 if (!tos_.is(argument)) { | 266 if (!tos_.is(argument)) { |
| 273 __ mov(tos_, argument); | 267 __ mov(tos_, argument); |
| 274 } | 268 } |
| 275 __ ret(1 * kPointerSize); | 269 __ ret(1 * kPointerSize); |
| 276 __ bind(¬_smi); | 270 __ bind(¬_smi); |
| 277 } else if (need_map) { | 271 } else if (types_.NeedsMap()) { |
| 278 // If we need a map later and have a Smi -> patch. | 272 // If we need a map later and have a Smi -> patch. |
| 279 __ JumpIfSmi(argument, &patch, Label::kNear); | 273 __ JumpIfSmi(argument, &patch, Label::kNear); |
| 280 } | 274 } |
| 281 | 275 |
| 282 if (need_map) { | 276 if (types_.NeedsMap()) { |
| 283 __ mov(map, FieldOperand(argument, HeapObject::kMapOffset)); | 277 __ mov(map, FieldOperand(argument, HeapObject::kMapOffset)); |
| 284 | 278 |
| 285 // Everything with a map could be undetectable, so check this now. | 279 // Everything with a map could be undetectable, so check this now. |
| 286 __ test_b(FieldOperand(map, Map::kBitFieldOffset), | 280 __ test_b(FieldOperand(map, Map::kBitFieldOffset), |
| 287 1 << Map::kIsUndetectable); | 281 1 << Map::kIsUndetectable); |
| 288 // Undetectable -> false. | 282 // Undetectable -> false. |
| 289 Label not_undetectable; | 283 Label not_undetectable; |
| 290 __ j(zero, ¬_undetectable, Label::kNear); | 284 __ j(zero, ¬_undetectable, Label::kNear); |
| 291 __ Set(tos_, Immediate(0)); | 285 __ Set(tos_, Immediate(0)); |
| 292 __ ret(1 * kPointerSize); | 286 __ ret(1 * kPointerSize); |
| (...skipping 6090 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6383 __ Drop(1); | 6377 __ Drop(1); |
| 6384 __ ret(2 * kPointerSize); | 6378 __ ret(2 * kPointerSize); |
| 6385 } | 6379 } |
| 6386 | 6380 |
| 6387 | 6381 |
| 6388 #undef __ | 6382 #undef __ |
| 6389 | 6383 |
| 6390 } } // namespace v8::internal | 6384 } } // namespace v8::internal |
| 6391 | 6385 |
| 6392 #endif // V8_TARGET_ARCH_IA32 | 6386 #endif // V8_TARGET_ARCH_IA32 |
| OLD | NEW |