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

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

Issue 207453008: ARM64: Minor improvement in LCodeGen::DoCheckInstanceType. (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/arm64/lithium-codegen-arm64.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 1060 matching lines...) Expand 10 before | Expand all | Expand 10 after
1071 } 1071 }
1072 1072
1073 1073
1074 void LCodeGen::DeoptimizeIfNotZero(Register rt, LEnvironment* environment) { 1074 void LCodeGen::DeoptimizeIfNotZero(Register rt, LEnvironment* environment) {
1075 DeoptimizeBranch(environment, reg_not_zero, rt); 1075 DeoptimizeBranch(environment, reg_not_zero, rt);
1076 } 1076 }
1077 1077
1078 1078
1079 void LCodeGen::DeoptimizeIfNegative(Register rt, LEnvironment* environment) { 1079 void LCodeGen::DeoptimizeIfNegative(Register rt, LEnvironment* environment) {
1080 int sign_bit = rt.Is64Bits() ? kXSignBit : kWSignBit; 1080 int sign_bit = rt.Is64Bits() ? kXSignBit : kWSignBit;
1081 DeoptimizeBranch(environment, reg_bit_set, rt, sign_bit); 1081 DeoptimizeIfBitSet(rt, sign_bit, environment);
1082 } 1082 }
1083 1083
1084 1084
1085 void LCodeGen::DeoptimizeIfSmi(Register rt, 1085 void LCodeGen::DeoptimizeIfSmi(Register rt,
1086 LEnvironment* environment) { 1086 LEnvironment* environment) {
1087 DeoptimizeBranch(environment, reg_bit_clear, rt, MaskToBit(kSmiTagMask)); 1087 DeoptimizeIfBitClear(rt, MaskToBit(kSmiTagMask), environment);
1088 } 1088 }
1089 1089
1090 1090
1091 void LCodeGen::DeoptimizeIfNotSmi(Register rt, LEnvironment* environment) { 1091 void LCodeGen::DeoptimizeIfNotSmi(Register rt, LEnvironment* environment) {
1092 DeoptimizeBranch(environment, reg_bit_set, rt, MaskToBit(kSmiTagMask)); 1092 DeoptimizeIfBitSet(rt, MaskToBit(kSmiTagMask), environment);
1093 } 1093 }
1094 1094
1095 1095
1096 void LCodeGen::DeoptimizeIfRoot(Register rt, 1096 void LCodeGen::DeoptimizeIfRoot(Register rt,
1097 Heap::RootListIndex index, 1097 Heap::RootListIndex index,
1098 LEnvironment* environment) { 1098 LEnvironment* environment) {
1099 __ CompareRoot(rt, index); 1099 __ CompareRoot(rt, index);
1100 DeoptimizeIf(eq, environment); 1100 DeoptimizeIf(eq, environment);
1101 } 1101 }
1102 1102
1103 1103
1104 void LCodeGen::DeoptimizeIfNotRoot(Register rt, 1104 void LCodeGen::DeoptimizeIfNotRoot(Register rt,
1105 Heap::RootListIndex index, 1105 Heap::RootListIndex index,
1106 LEnvironment* environment) { 1106 LEnvironment* environment) {
1107 __ CompareRoot(rt, index); 1107 __ CompareRoot(rt, index);
1108 DeoptimizeIf(ne, environment); 1108 DeoptimizeIf(ne, environment);
1109 } 1109 }
1110 1110
1111 1111
1112 void LCodeGen::DeoptimizeIfMinusZero(DoubleRegister input, 1112 void LCodeGen::DeoptimizeIfMinusZero(DoubleRegister input,
1113 LEnvironment* environment) { 1113 LEnvironment* environment) {
1114 __ TestForMinusZero(input); 1114 __ TestForMinusZero(input);
1115 DeoptimizeIf(vs, environment); 1115 DeoptimizeIf(vs, environment);
1116 } 1116 }
1117 1117
1118 1118
1119 void LCodeGen::DeoptimizeIfBitSet(Register rt,
1120 int bit,
1121 LEnvironment* environment) {
1122 DeoptimizeBranch(environment, reg_bit_set, rt, bit);
1123 }
1124
1125
1126 void LCodeGen::DeoptimizeIfBitClear(Register rt,
1127 int bit,
1128 LEnvironment* environment) {
1129 DeoptimizeBranch(environment, reg_bit_clear, rt, bit);
1130 }
1131
1132
1119 void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) { 1133 void LCodeGen::EnsureSpaceForLazyDeopt(int space_needed) {
1120 if (!info()->IsStub()) { 1134 if (!info()->IsStub()) {
1121 // Ensure that we have enough space after the previous lazy-bailout 1135 // Ensure that we have enough space after the previous lazy-bailout
1122 // instruction for patching the code here. 1136 // instruction for patching the code here.
1123 intptr_t current_pc = masm()->pc_offset(); 1137 intptr_t current_pc = masm()->pc_offset();
1124 1138
1125 if (current_pc < (last_lazy_deopt_pc_ + space_needed)) { 1139 if (current_pc < (last_lazy_deopt_pc_ + space_needed)) {
1126 ptrdiff_t padding_size = last_lazy_deopt_pc_ + space_needed - current_pc; 1140 ptrdiff_t padding_size = last_lazy_deopt_pc_ + space_needed - current_pc;
1127 ASSERT((padding_size % kInstructionSize) == 0); 1141 ASSERT((padding_size % kInstructionSize) == 0);
1128 InstructionAccurateScope instruction_accurate( 1142 InstructionAccurateScope instruction_accurate(
(...skipping 1048 matching lines...) Expand 10 before | Expand all | Expand 10 after
2177 __ Ccmp(scratch, last, CFlag, hs); 2191 __ Ccmp(scratch, last, CFlag, hs);
2178 DeoptimizeIf(hi, instr->environment()); 2192 DeoptimizeIf(hi, instr->environment());
2179 } 2193 }
2180 } else { 2194 } else {
2181 uint8_t mask; 2195 uint8_t mask;
2182 uint8_t tag; 2196 uint8_t tag;
2183 instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag); 2197 instr->hydrogen()->GetCheckMaskAndTag(&mask, &tag);
2184 2198
2185 if (IsPowerOf2(mask)) { 2199 if (IsPowerOf2(mask)) {
2186 ASSERT((tag == 0) || (tag == mask)); 2200 ASSERT((tag == 0) || (tag == mask));
2187 // TODO(all): We might be able to use tbz/tbnz if we can guarantee that 2201 if (tag == 0) {
2188 // the deopt handler is reachable by a tbz instruction. 2202 DeoptimizeIfBitSet(scratch, MaskToBit(mask), instr->environment());
2189 __ Tst(scratch, mask); 2203 } else {
2190 DeoptimizeIf(tag == 0 ? ne : eq, instr->environment()); 2204 DeoptimizeIfBitClear(scratch, MaskToBit(mask), instr->environment());
2205 }
2191 } else { 2206 } else {
2192 if (tag == 0) { 2207 if (tag == 0) {
2193 __ Tst(scratch, mask); 2208 __ Tst(scratch, mask);
2194 } else { 2209 } else {
2195 __ And(scratch, scratch, mask); 2210 __ And(scratch, scratch, mask);
2196 __ Cmp(scratch, tag); 2211 __ Cmp(scratch, tag);
2197 } 2212 }
2198 DeoptimizeIf(ne, instr->environment()); 2213 DeoptimizeIf(ne, instr->environment());
2199 } 2214 }
2200 } 2215 }
(...skipping 3655 matching lines...) Expand 10 before | Expand all | Expand 10 after
5856 __ Bind(&out_of_object); 5871 __ Bind(&out_of_object);
5857 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset)); 5872 __ Ldr(result, FieldMemOperand(object, JSObject::kPropertiesOffset));
5858 // Index is equal to negated out of object property index plus 1. 5873 // Index is equal to negated out of object property index plus 1.
5859 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2)); 5874 __ Sub(result, result, Operand::UntagSmiAndScale(index, kPointerSizeLog2));
5860 __ Ldr(result, FieldMemOperand(result, 5875 __ Ldr(result, FieldMemOperand(result,
5861 FixedArray::kHeaderSize - kPointerSize)); 5876 FixedArray::kHeaderSize - kPointerSize));
5862 __ Bind(&done); 5877 __ Bind(&done);
5863 } 5878 }
5864 5879
5865 } } // namespace v8::internal 5880 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/arm64/lithium-codegen-arm64.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698