S390: [turbofan] Prevent storing signalling NaNs into holey double arrays.
Port 6470ddadf9
Original commit message:
This introduces SilenceNaN operator, which makes sure that we only
store quiet NaNs into holey arrays. We omit the NaN silencing code
at instruction selection time if the input is an operation that
cannot possibly produce signalling NaNs.
R=jarin@chromium.org, joransiu@ca.ibm.com, jyan@ca.ibm.com, michael_dawson@ca.ibm.com, mbrandy@us.ibm.com, bjaideep@ca.ibm.com
BUG=
LOG=N
Review-Url: https://codereview.chromium.org/2070583002
Cr-Commit-Position: refs/heads/master@{#37012}
This commit is contained in:
parent
c5e3c9bf56
commit
2dedf2154e
@ -396,7 +396,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
||||
0, 1); \
|
||||
/* Move the result in the double result register. */ \
|
||||
__ MovFromFloatResult(i.OutputDoubleRegister()); \
|
||||
DCHECK_EQ(LeaveRC, i.OutputRCBit()); \
|
||||
} while (0)
|
||||
|
||||
#define ASSEMBLE_IEEE754_BINOP(name) \
|
||||
@ -411,7 +410,6 @@ Condition FlagsConditionToCondition(FlagsCondition condition, ArchOpcode op) {
|
||||
0, 2); \
|
||||
/* Move the result in the double result register. */ \
|
||||
__ MovFromFloatResult(i.OutputDoubleRegister()); \
|
||||
DCHECK_EQ(LeaveRC, i.OutputRCBit()); \
|
||||
} while (0)
|
||||
|
||||
#define ASSEMBLE_FLOAT_MAX(double_scratch_reg, general_scratch_reg) \
|
||||
@ -1345,6 +1343,12 @@ CodeGenerator::CodeGenResult CodeGenerator::AssembleArchInstruction(
|
||||
}
|
||||
break;
|
||||
#endif
|
||||
case kS390_Float64SilenceNaN: {
|
||||
DoubleRegister value = i.InputDoubleRegister(0);
|
||||
DoubleRegister result = i.OutputDoubleRegister();
|
||||
__ CanonicalizeNaN(result, value);
|
||||
break;
|
||||
}
|
||||
case kS390_Push:
|
||||
if (instr->InputAt(0)->IsFPRegister()) {
|
||||
__ lay(sp, MemOperand(sp, -kDoubleSize));
|
||||
|
@ -107,6 +107,7 @@ namespace compiler {
|
||||
V(S390_Float32ToInt32) \
|
||||
V(S390_Float32ToUint32) \
|
||||
V(S390_Float32ToDouble) \
|
||||
V(S390_Float64SilenceNaN) \
|
||||
V(S390_DoubleToInt32) \
|
||||
V(S390_DoubleToUint32) \
|
||||
V(S390_DoubleToInt64) \
|
||||
|
@ -104,6 +104,7 @@ int InstructionScheduler::GetTargetInstructionFlags(
|
||||
case kS390_Float32ToUint32:
|
||||
case kS390_Float32ToUint64:
|
||||
case kS390_Float32ToDouble:
|
||||
case kS390_Float64SilenceNaN:
|
||||
case kS390_DoubleToInt32:
|
||||
case kS390_DoubleToUint32:
|
||||
case kS390_Float32ToInt64:
|
||||
|
@ -1179,6 +1179,10 @@ void InstructionSelector::VisitFloat32Max(Node* node) { UNREACHABLE(); }
|
||||
|
||||
void InstructionSelector::VisitFloat64Max(Node* node) { UNREACHABLE(); }
|
||||
|
||||
void InstructionSelector::VisitFloat64SilenceNaN(Node* node) {
|
||||
VisitRR(this, kS390_Float64SilenceNaN, node);
|
||||
}
|
||||
|
||||
void InstructionSelector::VisitFloat32Min(Node* node) { UNREACHABLE(); }
|
||||
|
||||
void InstructionSelector::VisitFloat64Min(Node* node) { UNREACHABLE(); }
|
||||
|
Loading…
Reference in New Issue
Block a user