| Index: runtime/vm/intrinsifier_arm.cc
|
| ===================================================================
|
| --- runtime/vm/intrinsifier_arm.cc (revision 39210)
|
| +++ runtime/vm/intrinsifier_arm.cc (working copy)
|
| @@ -476,6 +476,9 @@
|
|
|
|
|
| void Intrinsifier::Float64Array_getIndexed(Assembler* assembler) {
|
| + if (!TargetCPUFeatures::vfp_supported()) {
|
| + return;
|
| + }
|
| Label fall_through;
|
| __ ldr(R0, Address(SP, + 0 * kWordSize)); // Index.
|
| __ ldr(R1, Address(SP, + 1 * kWordSize)); // Array.
|
| @@ -511,6 +514,9 @@
|
|
|
|
|
| void Intrinsifier::Float64Array_setIndexed(Assembler* assembler) {
|
| + if (!TargetCPUFeatures::vfp_supported()) {
|
| + return;
|
| + }
|
| Label fall_through;
|
| __ ldr(R0, Address(SP, + 1 * kWordSize)); // Index.
|
| __ ldr(R1, Address(SP, + 2 * kWordSize)); // Array.
|
| @@ -623,22 +629,23 @@
|
|
|
|
|
| void Intrinsifier::Integer_mulFromInteger(Assembler* assembler) {
|
| - Label fall_through;
|
| -
|
| - TestBothArgumentsSmis(assembler, &fall_through); // checks two smis
|
| - __ SmiUntag(R0); // Untags R6. We only want result shifted by one.
|
| -
|
| if (TargetCPUFeatures::arm_version() == ARMv7) {
|
| + Label fall_through;
|
| + TestBothArgumentsSmis(assembler, &fall_through); // checks two smis
|
| + __ SmiUntag(R0); // Untags R6. We only want result shifted by one.
|
| __ smull(R0, IP, R0, R1); // IP:R0 <- R0 * R1.
|
| __ cmp(IP, Operand(R0, ASR, 31));
|
| __ bx(LR, EQ);
|
| - } else {
|
| + __ Bind(&fall_through); // Fall through on overflow.
|
| + } else if (TargetCPUFeatures::can_divide()) {
|
| + Label fall_through;
|
| + TestBothArgumentsSmis(assembler, &fall_through); // checks two smis
|
| + __ SmiUntag(R0); // Untags R6. We only want result shifted by one.
|
| __ CheckMultSignedOverflow(R0, R1, IP, D0, D1, &fall_through);
|
| __ mul(R0, R0, R1);
|
| __ Ret();
|
| + __ Bind(&fall_through); // Fall through on overflow.
|
| }
|
| -
|
| - __ Bind(&fall_through); // Fall through on overflow.
|
| }
|
|
|
|
|
| @@ -704,6 +711,9 @@
|
| // }
|
| // }
|
| void Intrinsifier::Integer_moduloFromInteger(Assembler* assembler) {
|
| + if (!TargetCPUFeatures::can_divide()) {
|
| + return;
|
| + }
|
| // Check to see if we have integer division
|
| Label fall_through;
|
| __ ldr(R1, Address(SP, + 0 * kWordSize));
|
| @@ -735,6 +745,9 @@
|
|
|
|
|
| void Intrinsifier::Integer_truncDivide(Assembler* assembler) {
|
| + if (!TargetCPUFeatures::can_divide()) {
|
| + return;
|
| + }
|
| // Check to see if we have integer division
|
| Label fall_through;
|
|
|
|
|