| Index: src/compiler/x64/code-generator-x64.cc
|
| diff --git a/src/compiler/x64/code-generator-x64.cc b/src/compiler/x64/code-generator-x64.cc
|
| index c86f4f22eef5babbd2fa271389bf2e20330ff41e..bb2902e2fb816c690a0bb3517a90969f6f5fe047 100644
|
| --- a/src/compiler/x64/code-generator-x64.cc
|
| +++ b/src/compiler/x64/code-generator-x64.cc
|
| @@ -1068,6 +1068,19 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| }
|
| break;
|
| case kSSEFloat32ToUint64: {
|
| + Label done;
|
| + Label success;
|
| + if (instr->OutputCount() > 1) {
|
| + __ Set(i.OutputRegister(1), 0);
|
| + __ xorps(kScratchDoubleReg, kScratchDoubleReg);
|
| +
|
| + if (instr->InputAt(0)->IsDoubleRegister()) {
|
| + __ Ucomiss(kScratchDoubleReg, i.InputDoubleRegister(0));
|
| + } else {
|
| + __ Ucomiss(kScratchDoubleReg, i.InputOperand(0));
|
| + }
|
| + __ j(above, &done);
|
| + }
|
| // There does not exist a Float32ToUint64 instruction, so we have to use
|
| // the Float32ToInt64 instruction.
|
| if (instr->InputAt(0)->IsDoubleRegister()) {
|
| @@ -1078,8 +1091,7 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| // Check if the result of the Float32ToInt64 conversion is positive, we
|
| // are already done.
|
| __ testq(i.OutputRegister(), i.OutputRegister());
|
| - Label done;
|
| - __ j(positive, &done);
|
| + __ j(positive, &success);
|
| // The result of the first conversion was negative, which means that the
|
| // input value was not within the positive int64 range. We subtract 2^64
|
| // and convert it again to see if it is within the uint64 range.
|
| @@ -1099,10 +1111,27 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| // earlier.
|
| __ Set(kScratchRegister, 0x8000000000000000);
|
| __ orq(i.OutputRegister(), kScratchRegister);
|
| + __ bind(&success);
|
| + if (instr->OutputCount() > 1) {
|
| + __ Set(i.OutputRegister(1), 1);
|
| + }
|
| __ bind(&done);
|
| break;
|
| }
|
| case kSSEFloat64ToUint64: {
|
| + Label done;
|
| + Label success;
|
| + if (instr->OutputCount() > 1) {
|
| + __ Set(i.OutputRegister(1), 0);
|
| + __ xorps(kScratchDoubleReg, kScratchDoubleReg);
|
| +
|
| + if (instr->InputAt(0)->IsDoubleRegister()) {
|
| + __ Ucomisd(kScratchDoubleReg, i.InputDoubleRegister(0));
|
| + } else {
|
| + __ Ucomisd(kScratchDoubleReg, i.InputOperand(0));
|
| + }
|
| + __ j(above, &done);
|
| + }
|
| // There does not exist a Float64ToUint64 instruction, so we have to use
|
| // the Float64ToInt64 instruction.
|
| if (instr->InputAt(0)->IsDoubleRegister()) {
|
| @@ -1110,14 +1139,9 @@ void CodeGenerator::AssembleArchInstruction(Instruction* instr) {
|
| } else {
|
| __ Cvttsd2siq(i.OutputRegister(), i.InputOperand(0));
|
| }
|
| - if (instr->OutputCount() > 1) {
|
| - __ Set(i.OutputRegister(1), 0);
|
| - }
|
| // Check if the result of the Float64ToInt64 conversion is positive, we
|
| // are already done.
|
| __ testq(i.OutputRegister(), i.OutputRegister());
|
| - Label done;
|
| - Label success;
|
| __ j(positive, &success);
|
| // The result of the first conversion was negative, which means that the
|
| // input value was not within the positive int64 range. We subtract 2^64
|
|
|