]> 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 14:21:06 +0000 (16:21 +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 8cf39e0cd4b67d5a42cf19bb121e0f0c687a859d..b65b3ee88d14b126fdea6e89de38c20622cc490e 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 "";
        }