Hi! On Wed, Oct 16, 2019 at 09:47:41AM -0400, Michael Meissner wrote: > This patch fixes the stack protection insns to support stacks larger than > 16-bits on the 'future' system using prefixed loads and stores.
> +;; We can't use the prefixed attribute here because there are two memory > +;; instructions. We can't split the insn due to the fact that this operation > +;; needs to be done in one piece. > (define_insn "stack_protect_setdi" > [(set (match_operand:DI 0 "memory_operand" "=Y") > (unspec:DI [(match_operand:DI 1 "memory_operand" "Y")] UNSPEC_SP_SET)) > (set (match_scratch:DI 2 "=&r") (const_int 0))] > "TARGET_64BIT" > - "ld%U1%X1 %2,%1\;std%U0%X0 %2,%0\;li %2,0" > +{ > + if (prefixed_memory (operands[1], DImode)) > + output_asm_insn ("pld %2,%1", operands); > + else > + output_asm_insn ("ld%U1%X1 %2,%1", operands); > + > + if (prefixed_memory (operands[0], DImode)) > + output_asm_insn ("pstd %2,%0", operands); > + else > + output_asm_insn ("std%U0%X0 %2,%0", operands); We could make %pN mean 'p' for prefixed, for memory as operands[N]? Are there more places than this that could use that? How about inline asm? > + (set (attr "length") > + (cond [(and (match_operand 0 "prefixed_memory") > + (match_operand 1 "prefixed_memory")) > + (const_string "24") > + > + (ior (match_operand 0 "prefixed_memory") > + (match_operand 1 "prefixed_memory")) > + (const_string "20")] > + > + (const_string "12")))]) You can use const_int instead of const_string here, I think? Please do that if it works. Quite a simple expression, phew :-) > + if (which_alternative == 0) > + output_asm_insn ("xor. %3,%3,%4", operands); > + else > + output_asm_insn ("cmpld %0,%3,%4\;li %3,0", operands); That doesn't work: the backslash is treated like the escape character, in a C block. I think doubling it will work? Check the generated insn-output.c, it should be translated to \t\n in there. Okay for trunk with those things taken care of. Thanks! Segher