; Miscellaneous P9 functions
[power9]
- signed long long __builtin_darn ();
- DARN darn {}
+ signed long __builtin_darn ();
+ DARN darn_64_di {32bit}
- signed int __builtin_darn_32 ();
- DARN_32 darn_32 {}
+ signed long __builtin_darn_32 ();
+ DARN_32 darn_32_di {32bit}
- signed long long __builtin_darn_raw ();
- DARN_RAW darn_raw {}
+ signed long __builtin_darn_raw ();
+ DARN_RAW darn_raw_di {32bit}
const signed int __builtin_dtstsfi_eq_dd (const int<6>, _Decimal64);
TSTSFI_EQ_DD dfptstsfi_eq_dd {}
icode = CODE_FOR_rs6000_mftb_si;
else if (fcode == RS6000_BIF_BPERMD)
icode = CODE_FOR_bpermd_si;
+ else if (fcode == RS6000_BIF_DARN)
+ icode = CODE_FOR_darn_64_si;
+ else if (fcode == RS6000_BIF_DARN_32)
+ icode = CODE_FOR_darn_32_si;
+ else if (fcode == RS6000_BIF_DARN_RAW)
+ icode = CODE_FOR_darn_raw_si;
else
gcc_unreachable ();
}
UNSPECV_EH_RR ; eh_reg_restore
UNSPECV_ISYNC ; isync instruction
UNSPECV_MFTB ; move from time base
- UNSPECV_DARN ; darn 1 (deliver a random number)
- UNSPECV_DARN_32 ; darn 2
- UNSPECV_DARN_RAW ; darn 0
+ UNSPECV_DARN ; darn (deliver a random number)
UNSPECV_NLGR ; non-local goto receiver
UNSPECV_MFFS ; Move from FPSCR
UNSPECV_MFFSL ; Move from FPSCR light instruction version
\f
;; Miscellaneous ISA 3.0 (power9) instructions
-(define_insn "darn_32"
- [(set (match_operand:SI 0 "register_operand" "=r")
- (unspec_volatile:SI [(const_int 0)] UNSPECV_DARN_32))]
+(define_expand "darn_32_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
"TARGET_P9_MISC"
- "darn %0,0"
- [(set_attr "type" "integer")])
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const0_rtx));
+ DONE;
+})
-(define_insn "darn_raw"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN_RAW))]
- "TARGET_P9_MISC && TARGET_64BIT"
- "darn %0,2"
- [(set_attr "type" "integer")])
+(define_expand "darn_64_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
+ "TARGET_P9_MISC"
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const1_rtx));
+ DONE;
+})
-(define_insn "darn"
- [(set (match_operand:DI 0 "register_operand" "=r")
- (unspec_volatile:DI [(const_int 0)] UNSPECV_DARN))]
- "TARGET_P9_MISC && TARGET_64BIT"
- "darn %0,1"
+(define_expand "darn_raw_<mode>"
+ [(use (match_operand:GPR 0 "register_operand"))]
+ "TARGET_P9_MISC"
+{
+ emit_insn (gen_darn (<MODE>mode, operands[0], const2_rtx));
+ DONE;
+})
+
+(define_insn "@darn<mode>"
+ [(set (match_operand:GPR 0 "register_operand" "=r")
+ (unspec_volatile:GPR [(match_operand 1 "const_int_operand" "n")]
+ UNSPECV_DARN))]
+ "TARGET_P9_MISC"
+ "darn %0,%1"
[(set_attr "type" "integer")])
;; Test byte within range.