https://gcc.gnu.org/bugzilla/show_bug.cgi?id=125320

--- Comment #2 from Xi Ruoyao <xry111 at gcc dot gnu.org> ---
Tentative patch:

diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
index 869061e18ae..0207a37a0af 100644
--- a/gcc/config/riscv/riscv.md
+++ b/gcc/config/riscv/riscv.md
@@ -4481,7 +4481,15 @@ (define_insn "stack_protect_set_<mode>"
         UNSPEC_SSP_SET))
    (set (match_scratch:GPR 2 "=&r") (const_int 0))]
   ""
-  "<load>\t%2, %1\;<store>\t%2, %0\;li\t%2, 0"
+  {
+    for (auto [i, j]: (int[][2]){{2, 1}, {0, 2}})
+      {
+       rtx op[] = {operands[i], operands[j]};
+       output_asm_insn (riscv_output_move (op[0], op[1]), op);
+      }
+
+    return "li\t%2, 0";
+  }
   [(set_attr "type" "multi")
    (set_attr "length" "12")])

@@ -4521,7 +4529,15 @@ (define_insn "stack_protect_test_<mode>"
         UNSPEC_SSP_TEST))
    (clobber (match_scratch:GPR 3 "=&r"))]
   ""
-  "<load>\t%3, %1\;<load>\t%0, %2\;xor\t%0, %3, %0\;li\t%3, 0"
+  {
+    for (auto [i, j]: (int[][2]){{3, 1}, {0, 2}})
+      {
+       rtx op[] = {operands[i], operands[j]};
+       output_asm_insn (riscv_output_move (op[0], op[1]), op);
+      }
+
+    return "xor\t%0, %3, %0\;li\t%3, 0";
+  }
   [(set_attr "type" "multi")
    (set_attr "length" "12")])

Reply via email to