Hi!
This is something I've noticed in a s390 change I'll post soon (where it was
even completely unnecessary), but it applies to i386 backend too.
Seems we have lots of .bss global state, 66x 64-byte and 61x 128-byte long
static buffers. Instead of doing
static char buf[128];
...
s{,n}printf (buf, ...);
...
return buf;
in the insn templates we can do:
char buf[128];
...
s{,n}printf (buf, ...);
...
output_asm_insn (buf, operands);
return "";
and avoid that way the global state. The only problem with that is
that final.c does something in between:
1) if return from the template is NULL, not this case
2) if return from the template is "#", not this case
3) if (targetm.asm_out.unwind_emit_before_insn
&& targetm.asm_out.unwind_emit)
targetm.asm_out.unwind_emit (asm_out_file, insn);
while cygming.h has
#define TARGET_ASM_UNWIND_EMIT i386_pe_seh_unwind_emit
#define TARGET_ASM_UNWIND_EMIT_BEFORE_INSN false
it is ok too (and other i386 subtargets don't do either,
so unwind_emit_before_insn is true (the default) and unwind_emit
NULL
4) rtx_call_insn *call_insn = dyn_cast <rtx_call_insn *> (insn);
if (call_insn != NULL)
that is for calls only, the patch doesn't change any calls
Those 4 spots are in between get_insn_template and
output_asm_insn (templ, recog_data.operand);
which starts with:
/* An insn may return a null string template
in a case where no assembler code is needed. */
if (*templ == 0)
return;
so I think the patch doesn't make it more costly, there is just
one output_asm_insn extra call and the old one will return immediately.
Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
2019-02-16 Jakub Jelinek <[email protected]>
* config/i386/i386.md (*movqi_internal): Remove static from
buf variable. Use output_asm_insn (buf, operands); return "";
instead of return buf;.
* config/i386/sse.md (<sse>_andnot<mode>3<mask_name>,
*<code><mode>3<mask_name>, *andnot<mode>3, *andnottf3, *<code><mode>3,
*<code>tf3, <mask_codefor><code><mode>3<mask_name>): Likewise.
--- gcc/config/i386/i386.md.jj 2019-02-12 21:48:53.183072497 +0100
+++ gcc/config/i386/i386.md 2019-02-15 23:25:36.198589133 +0100
@@ -2531,7 +2531,7 @@ (define_insn "*movqi_internal"
"Q ,R,r,n,m,q,rn, m,qn,r,k,k,k,m,C,BC"))]
"!(MEM_P (operands[0]) && MEM_P (operands[1]))"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix;
@@ -2564,7 +2564,8 @@ (define_insn "*movqi_internal"
suffix = (get_attr_mode (insn) == MODE_HI) ? "w" : "b";
snprintf (buf, sizeof (buf), ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
case TYPE_MSKLOG:
if (operands[1] == const0_rtx)
--- gcc/config/i386/sse.md.jj 2019-02-14 08:06:39.446519415 +0100
+++ gcc/config/i386/sse.md 2019-02-15 23:28:54.305366640 +0100
@@ -3198,7 +3198,7 @@ (define_insn "<sse>_andnot<mode>3<mask_n
(match_operand:VF_128_256 2 "vector_operand" "xBm,xm,vm,vm")))]
"TARGET_SSE && <mask_avx512vl_condition>"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix;
@@ -3233,7 +3233,8 @@ (define_insn "<sse>_andnot<mode>3<mask_n
}
snprintf (buf, sizeof (buf), ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512dq,avx512f")
(set_attr "type" "sselog")
@@ -3264,7 +3265,7 @@ (define_insn "<sse>_andnot<mode>3<mask_n
(match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
"TARGET_AVX512F"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix;
@@ -3281,7 +3282,8 @@ (define_insn "<sse>_andnot<mode>3<mask_n
snprintf (buf, sizeof (buf),
"v%sandn%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>,
%%1, %%2}",
ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "type" "sselog")
(set_attr "prefix" "evex")
@@ -3314,7 +3316,7 @@ (define_insn "*<code><mode>3<mask_name>"
"TARGET_SSE && <mask_avx512vl_condition>
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix;
@@ -3349,7 +3351,8 @@ (define_insn "*<code><mode>3<mask_name>"
}
snprintf (buf, sizeof (buf), ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512dq,avx512f")
(set_attr "type" "sselog")
@@ -3378,7 +3381,7 @@ (define_insn "*<code><mode>3<mask_name>"
(match_operand:VF_512 2 "nonimmediate_operand" "vm")))]
"TARGET_AVX512F && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix;
@@ -3395,7 +3398,8 @@ (define_insn "*<code><mode>3<mask_name>"
snprintf (buf, sizeof (buf),
"v%s<logic>%s\t{%%2, %%1, %%0<mask_operand3_1>|%%0<mask_operand3_1>,
%%1, %%2}",
ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "type" "sselog")
(set_attr "prefix" "evex")
@@ -3449,7 +3453,7 @@ (define_insn "*andnot<mode>3"
(match_operand:MODEF 2 "register_operand" "x,x,v,v")))]
"SSE_FLOAT_MODE_P (<MODE>mode)"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix
= (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
@@ -3485,7 +3489,8 @@ (define_insn "*andnot<mode>3"
}
snprintf (buf, sizeof (buf), ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512vl,avx512f")
(set_attr "type" "sselog")
@@ -3516,7 +3521,7 @@ (define_insn "*andnottf3"
(match_operand:TF 2 "vector_operand" "xBm,xm,vm,v")))]
"TARGET_SSE"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *tmp
= (which_alternative >= 2 ? "pandnq"
@@ -3539,7 +3544,8 @@ (define_insn "*andnottf3"
}
snprintf (buf, sizeof (buf), ops, tmp);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512vl,avx512f")
(set_attr "type" "sselog")
@@ -3572,7 +3578,7 @@ (define_insn "*<code><mode>3"
(match_operand:MODEF 2 "register_operand" "x,x,v,v")))]
"SSE_FLOAT_MODE_P (<MODE>mode)"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *suffix
= (get_attr_mode (insn) == MODE_V4SF) ? "ps" : "<ssevecmodesuffix>";
@@ -3607,7 +3613,8 @@ (define_insn "*<code><mode>3"
}
snprintf (buf, sizeof (buf), ops, suffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512vl,avx512f")
(set_attr "type" "sselog")
@@ -3646,7 +3653,7 @@ (define_insn "*<code>tf3"
(match_operand:TF 2 "vector_operand" "xBm,xm,vm,v")))]
"TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
- static char buf[128];
+ char buf[128];
const char *ops;
const char *tmp
= (which_alternative >= 2 ? "p<logic>q"
@@ -3669,7 +3676,8 @@ (define_insn "*<code>tf3"
}
snprintf (buf, sizeof (buf), ops, tmp);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx512vl,avx512f")
(set_attr "type" "sselog")
@@ -12066,7 +12074,7 @@ (define_insn "*andnot<mode>3"
(match_operand:VI 2 "vector_operand" "xBm,xm,vm")))]
"TARGET_SSE"
{
- static char buf[64];
+ char buf[64];
const char *ops;
const char *tmp;
const char *ssesuffix;
@@ -12136,7 +12144,8 @@ (define_insn "*andnot<mode>3"
}
snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx")
(set_attr "type" "sselog")
@@ -12211,7 +12220,7 @@ (define_insn "<mask_codefor><code><mode>
"TARGET_SSE && <mask_mode512bit_condition>
&& !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
- static char buf[64];
+ char buf[64];
const char *ops;
const char *tmp;
const char *ssesuffix;
@@ -12276,7 +12285,8 @@ (define_insn "<mask_codefor><code><mode>
}
snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx")
(set_attr "type" "sselog")
@@ -12311,7 +12321,7 @@ (define_insn "*<code><mode>3"
(match_operand:VI12_AVX_AVX512F 2 "vector_operand" "xBm,xm,vm")))]
"TARGET_SSE && !(MEM_P (operands[1]) && MEM_P (operands[2]))"
{
- static char buf[64];
+ char buf[64];
const char *ops;
const char *tmp;
const char *ssesuffix;
@@ -12371,7 +12381,8 @@ (define_insn "*<code><mode>3"
}
snprintf (buf, sizeof (buf), ops, tmp, ssesuffix);
- return buf;
+ output_asm_insn (buf, operands);
+ return "";
}
[(set_attr "isa" "noavx,avx,avx")
(set_attr "type" "sselog")
Jakub