+2019-12-12 Vineet Gupta <vgupta@synopsys.com>
+
+ * config/arc/arc-modes.def (CC_FPUE): New Mode CC_FPUE which
+ helps codegen generate exceptions even for quiet NaN.
+ * config/arc/arc.c (arc_init_reg_tables): Handle New CC_FPUE mode.
+ (get_arc_condition_code): Likewise.
+ (arc_select_cc_mode): LT, LE, GT, GE to use the New CC_FPUE mode.
+ * config/arc/arc.h (REVERSE_CONDITION): Handle New CC_FPUE mode.
+ * config/arc/predicates.md (proper_comparison_operator): Likewise.
+ * config/arc/fpu.md (cmpsf_fpu_trap): New Pattern for CC_FPUE.
+ (cmpdf_fpu_trap): Likewise.
+
2019-12-12 Claudiu Zissulescu <claziss@synopsys.com>
* config/arc/arc.md (iterator SDF): Check TARGET_FP_DP_BASE.
/* FPU condition flags. */
CC_MODE (CC_FPU);
+CC_MODE (CC_FPUE);
CC_MODE (CC_FPU_UNEQ);
default : gcc_unreachable ();
}
case E_CC_FPUmode:
+ case E_CC_FPUEmode:
switch (GET_CODE (comparison))
{
case EQ : return ARC_CC_EQ;
case UNLE:
case UNGT:
case UNGE:
+ return CC_FPUmode;
+
case LT:
case LE:
case GT:
case GE:
- return CC_FPUmode;
+ return CC_FPUEmode;
case LTGT:
case UNEQ:
if (i == (int) CCmode || i == (int) CC_ZNmode || i == (int) CC_Zmode
|| i == (int) CC_Cmode
|| i == CC_FP_GTmode || i == CC_FP_GEmode || i == CC_FP_ORDmode
- || i == CC_FPUmode || i == CC_FPU_UNEQmode)
+ || i == CC_FPUmode || i == CC_FPUEmode || i == CC_FPU_UNEQmode)
arc_mode_class[i] = 1 << (int) C_MODE;
else
arc_mode_class[i] = 0;
/* Avoid FPU instructions. */
if ((GET_MODE (XEXP (XEXP (pc_target, 0), 0)) == CC_FPUmode)
+ || (GET_MODE (XEXP (XEXP (pc_target, 0), 0)) == CC_FPUEmode)
|| (GET_MODE (XEXP (XEXP (pc_target, 0), 0)) == CC_FPU_UNEQmode))
continue;
(((MODE) == CC_FP_GTmode || (MODE) == CC_FP_GEmode \
|| (MODE) == CC_FP_UNEQmode || (MODE) == CC_FP_ORDmode \
|| (MODE) == CC_FPXmode || (MODE) == CC_FPU_UNEQmode \
- || (MODE) == CC_FPUmode) \
+ || (MODE) == CC_FPUmode || (MODE) == CC_FPUEmode) \
? reverse_condition_maybe_unordered ((CODE)) \
: reverse_condition ((CODE)))
(set_attr "type" "fpu")
(set_attr "predicable" "yes")])
+(define_insn "*cmpsf_fpu_trap"
+ [(set (reg:CC_FPUE CC_REG)
+ (compare:CC_FPUE (match_operand:SF 0 "register_operand" "r, r,r")
+ (match_operand:SF 1 "nonmemory_operand" "r,CfZ,F")))]
+ "TARGET_FP_SP_BASE"
+ "fscmpf%?\\t%0,%1"
+ [(set_attr "length" "4,4,8")
+ (set_attr "iscompact" "false")
+ (set_attr "cond" "set")
+ (set_attr "type" "fpu")
+ (set_attr "predicable" "yes")])
+
(define_insn "*cmpsf_fpu_uneq"
[(set (reg:CC_FPU_UNEQ CC_REG)
(compare:CC_FPU_UNEQ
(set_attr "type" "fpu")
(set_attr "predicable" "yes")])
+(define_insn "*cmpdf_fpu_trap"
+ [(set (reg:CC_FPUE CC_REG)
+ (compare:CC_FPUE (match_operand:DF 0 "even_register_operand" "r")
+ (match_operand:DF 1 "even_register_operand" "r")))]
+ "TARGET_FP_DP_BASE"
+ "fdcmpf%? %0, %1"
+ [(set_attr "length" "4")
+ (set_attr "iscompact" "false")
+ (set_attr "cond" "set")
+ (set_attr "type" "fpu")
+ (set_attr "predicable" "yes")])
+
(define_insn "*cmpdf_fpu_uneq"
[(set (reg:CC_FPU_UNEQ CC_REG)
(compare:CC_FPU_UNEQ
|| code == ORDERED || code == UNORDERED);
case E_CC_FPUmode:
+ case E_CC_FPUEmode:
return 1;
case E_CC_FPU_UNEQmode:
return 1;