diff options
Diffstat (limited to 'gcc/config/s390/s390.md')
-rw-r--r-- | gcc/config/s390/s390.md | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 185a3f8511b..5a9f1c8a606 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -4847,12 +4847,22 @@ ; trunctddd2 and truncddsd2 instruction pattern(s). ; -(define_insn "trunctddd2" + +(define_expand "trunctddd2" + [(parallel + [(set (match_operand:DD 0 "register_operand" "") + (float_truncate:DD (match_operand:TD 1 "register_operand" ""))) + (unspec:DI [(const_int DFP_RND_CURRENT)] UNSPEC_ROUND) + (clobber (scratch:TD))])] + "TARGET_HARD_DFP") + +(define_insn "*trunctddd2" [(set (match_operand:DD 0 "register_operand" "=f") (float_truncate:DD (match_operand:TD 1 "register_operand" "f"))) - (clobber (match_scratch:TD 2 "=f"))] + (unspec:DI [(match_operand:DI 2 "const_mask_operand" "I")] UNSPEC_ROUND) + (clobber (match_scratch:TD 3 "=f"))] "TARGET_HARD_DFP" - "ldxtr\t%2,0,%1,0\;ldr\t%0,%2" + "ldxtr\t%3,%2,%1,0\;ldr\t%0,%3" [(set_attr "length" "6") (set_attr "type" "ftruncdd")]) @@ -4868,6 +4878,7 @@ [(parallel [(set (match_dup 3) (float_truncate:DD (match_operand:TD 1 "register_operand" ""))) + (unspec:DI [(const_int DFP_RND_PREP_FOR_SHORT_PREC)] UNSPEC_ROUND) (clobber (match_scratch:TD 2 ""))]) (set (match_operand:SD 0 "register_operand" "") (float_truncate:SD (match_dup 3)))] |