]> 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>
Wed, 14 May 2025 07:22:00 +0000 (09:22 +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.

gcc/config/s390/vector.md

index 160e42a300580c3a962391504d02d6e44d22ea6b..cdd55b69a8b065fc0ee71bfb0a768ce224d23b26 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 "";
        }