Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/compiler/change-lowering.h" | 5 #include "src/compiler/change-lowering.h" |
| 6 | 6 |
| 7 #include "src/code-factory.h" | 7 #include "src/code-factory.h" |
| 8 #include "src/compiler/js-graph.h" | 8 #include "src/compiler/js-graph.h" |
| 9 #include "src/compiler/linkage.h" | 9 #include "src/compiler/linkage.h" |
| 10 #include "src/compiler/machine-operator.h" | 10 #include "src/compiler/machine-operator.h" |
| (...skipping 133 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 144 } | 144 } |
| 145 | 145 |
| 146 | 146 |
| 147 Reduction ChangeLowering::ChangeBoolToBit(Node* value) { | 147 Reduction ChangeLowering::ChangeBoolToBit(Node* value) { |
| 148 return Replace(graph()->NewNode(machine()->WordEqual(), value, | 148 return Replace(graph()->NewNode(machine()->WordEqual(), value, |
| 149 jsgraph()->TrueConstant())); | 149 jsgraph()->TrueConstant())); |
| 150 } | 150 } |
| 151 | 151 |
| 152 | 152 |
| 153 Reduction ChangeLowering::ChangeFloat64ToTagged(Node* value, Node* control) { | 153 Reduction ChangeLowering::ChangeFloat64ToTagged(Node* value, Node* control) { |
| 154 return Replace(AllocateHeapNumberWithValue(value, control)); | 154 Type* const value_type = NodeProperties::GetType(value); |
| 155 Node* const value32 = graph()->NewNode( | |
| 156 machine()->TruncateFloat64ToInt32(TruncationMode::kRoundToZero), value); | |
| 157 // TODO(bmeurer): This fast case must be disabled until we kill the asm.js | |
| 158 // support in the generic JavaScript pipeline, because LoadBuffer is lying | |
| 159 // about its result. | |
| 160 // if (value_type->Is(Type::Signed32())) { | |
| 161 // return ChangeInt32ToTagged(value32, control); | |
| 162 // } | |
| 163 Node* check_same = graph()->NewNode( | |
| 164 machine()->Float64Equal(), value, | |
| 165 graph()->NewNode(machine()->ChangeInt32ToFloat64(), value32)); | |
| 166 Node* branch_same = graph()->NewNode(common()->Branch(), check_same, control); | |
| 167 | |
| 168 Node* if_smi = graph()->NewNode(common()->IfTrue(), branch_same); | |
| 169 Node* vsmi; | |
| 170 Node* if_box = graph()->NewNode(common()->IfFalse(), branch_same); | |
| 171 Node* vbox; | |
| 172 | |
| 173 // We only need to check for -0 if the {value} can potentially contain -0. | |
| 174 if (value_type->Maybe(Type::MinusZero())) { | |
| 175 Node* check_zero = graph()->NewNode(machine()->Word32Equal(), value32, | |
| 176 jsgraph()->Int32Constant(0)); | |
| 177 Node* branch_zero = graph()->NewNode(common()->Branch(BranchHint::kFalse), | |
| 178 check_zero, if_smi); | |
| 179 | |
| 180 Node* if_zero = graph()->NewNode(common()->IfTrue(), branch_zero); | |
| 181 Node* if_notzero = graph()->NewNode(common()->IfFalse(), branch_zero); | |
| 182 | |
| 183 // In case of 0, we need to check the high bits for the IEEE -0 pattern. | |
| 184 Node* check_negative = graph()->NewNode( | |
| 185 machine()->Int32LessThan(), | |
| 186 graph()->NewNode(machine()->Float64ExtractHighWord32(), value), | |
| 187 jsgraph()->Int32Constant(0)); | |
| 188 Node* branch_negative = graph()->NewNode( | |
| 189 common()->Branch(BranchHint::kFalse), check_negative, if_zero); | |
| 190 | |
| 191 Node* if_negative = graph()->NewNode(common()->IfTrue(), branch_negative); | |
| 192 Node* if_notnegative = | |
| 193 graph()->NewNode(common()->IfFalse(), branch_negative); | |
| 194 | |
| 195 // We need to create a box for negative 0. | |
| 196 if_smi = graph()->NewNode(common()->Merge(2), if_notzero, if_notnegative); | |
| 197 if_box = graph()->NewNode(common()->Merge(2), if_box, if_negative); | |
| 198 } | |
| 199 | |
| 200 // On 64-bit machines we can just wrap the 32-bit integer in a smi, for 32-bit | |
| 201 // machines we need to deal with potential overflow and fallback to boxing. | |
| 202 if (machine()->Is64() || value_type->Is(Type::SignedSmall())) { | |
| 203 vsmi = ChangeInt32ToSmi(value32); | |
| 204 } else { | |
| 205 Node* smi_tag = | |
| 206 graph()->NewNode(machine()->Int32AddWithOverflow(), value32, value32); | |
| 207 | |
| 208 Node* check_ovf = graph()->NewNode(common()->Projection(1), smi_tag); | |
| 209 Node* branch_ovf = graph()->NewNode(common()->Branch(BranchHint::kFalse), | |
| 210 check_ovf, if_smi); | |
| 211 | |
| 212 Node* if_ovf = graph()->NewNode(common()->IfTrue(), branch_ovf); | |
| 213 if_box = graph()->NewNode(common()->Merge(2), if_ovf, if_box); | |
| 214 | |
| 215 if_smi = graph()->NewNode(common()->IfFalse(), branch_ovf); | |
| 216 vsmi = graph()->NewNode(common()->Projection(0), smi_tag); | |
| 217 } | |
| 218 | |
| 219 // Allocate the box for the {value}. | |
| 220 vbox = AllocateHeapNumberWithValue(value, if_box); | |
| 221 | |
| 222 control = graph()->NewNode(common()->Merge(2), if_smi, if_box); | |
| 223 value = | |
| 224 graph()->NewNode(common()->Phi(kMachAnyTagged, 2), vsmi, vbox, control); | |
| 225 return Replace(value); | |
|
Jarin
2015/10/27 15:17:03
Just wondering - is there a reason to not use sele
Benedikt Meurer
2015/10/27 16:16:18
Allocate requires a control input.
| |
| 155 } | 226 } |
| 156 | 227 |
| 157 | 228 |
| 158 Reduction ChangeLowering::ChangeInt32ToTagged(Node* value, Node* control) { | 229 Reduction ChangeLowering::ChangeInt32ToTagged(Node* value, Node* control) { |
| 159 if (machine()->Is64() || | 230 if (machine()->Is64() || |
| 160 NodeProperties::GetType(value)->Is(Type::SignedSmall())) { | 231 NodeProperties::GetType(value)->Is(Type::SignedSmall())) { |
| 161 return Replace(ChangeInt32ToSmi(value)); | 232 return Replace(ChangeInt32ToSmi(value)); |
| 162 } | 233 } |
| 163 | 234 |
| 164 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); | 235 Node* add = graph()->NewNode(machine()->Int32AddWithOverflow(), value, value); |
| (...skipping 182 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 347 } | 418 } |
| 348 | 419 |
| 349 | 420 |
| 350 MachineOperatorBuilder* ChangeLowering::machine() const { | 421 MachineOperatorBuilder* ChangeLowering::machine() const { |
| 351 return jsgraph()->machine(); | 422 return jsgraph()->machine(); |
| 352 } | 423 } |
| 353 | 424 |
| 354 } // namespace compiler | 425 } // namespace compiler |
| 355 } // namespace internal | 426 } // namespace internal |
| 356 } // namespace v8 | 427 } // namespace v8 |
| OLD | NEW |