]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
s390: Fix tf_to_fprx2
authorStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Wed, 14 May 2025 07:22:00 +0000 (09:22 +0200)
committerStefan Schulze Frielinghaus <stefansf@gcc.gnu.org>
Mon, 26 May 2025 16:26:15 +0000 (18:26 +0200)
Insn tf_to_fprx2 moves a TF value into a floating-point register pair.
For alternative 0, the input is a vector register, however, in the else
case instruction ldr is emitted which expects floating-point register
operands only.  Thus, this works only for vector registers which overlap
with floating-point registers.  Replace ldr with vlr so that the
remaining vector registers are dealt with, too.  Emitting a vlr instead
of a ldr is fine since the destination register %v0 is part of a
floating-point register pair which means that the low half of %v0 is
ignored in the end anyway and therefore may be clobbered.

gcc/ChangeLog:

* config/s390/vector.md: Fix tf_to_fprx2 by using vlr instead of
ldr.

(cherry picked from commit 8519b8ba9dd9567a5f90966351c1e758dbf511a4)

gcc/config/s390/vector.md

index 35defb7043a4efd1f2c2baac5ed9acce478c8ea0..a79f21b05c73ada98a6a0af5595b5c82bb5f9145 100644 (file)
       else
        {
          reg_pair += 2;  // get rid of prefix %f
-         snprintf (buf, sizeof (buf), "ldr\t%%f0,%%f1;vpdi\t%%%%v%s,%%v1,%%%%v%s,5", reg_pair, reg_pair);
+         snprintf (buf, sizeof (buf), "vlr\t%%v0,%%v1;vpdi\t%%%%v%s,%%v1,%%%%v%s,5", reg_pair, reg_pair);
          output_asm_insn (buf, operands);
          return "";
        }