Andrea Corallo <[email protected]> writes:
> +/* Initialize all builtins in the AARCH64_BUILTIN_GENERAL group. */
> +
> +void
> +aarch64_general_init_builtins (void)
> +{
> +
Excess blank line here.
> + aarch64_init_fpsr_fpcr_builtins ();
> +
> aarch64_init_fp16_types ();
>
> aarch64_init_bf16_types ();
> @@ -1876,6 +1913,14 @@ aarch64_expand_builtin_memtag (int fcode, tree exp,
> rtx target)
> return target;
> }
>
> +static void
> +aarch64_expand_fpsr_fpcr_setter (int unspec, machine_mode mode, tree exp)
Should have a function comment here, even though the function is tiny.
> +{
> + tree arg = CALL_EXPR_ARG (exp, 0);
> + rtx op = force_reg (mode, expand_normal (arg));
> + emit_insn (gen_aarch64_set (unspec, mode, op));
> +}
> +
> /* Expand an expression EXP that calls built-in function FCODE,
> with result going to TARGET if that's convenient. IGNORE is true
> if the result of the builtin is ignored. */
> […]
> diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md
> index deca0004fedc..75f9e9e97e8b 100644
> --- a/gcc/config/aarch64/aarch64.md
> +++ b/gcc/config/aarch64/aarch64.md
> @@ -7230,37 +7230,21 @@
> [(set_attr "length" "12")
> (set_attr "type" "multiple")])
>
> -;; Write Floating-point Control Register.
> -(define_insn "set_fpcr"
> - [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")]
> UNSPECV_SET_FPCR)]
> +;; Write into Floating-point Status Register.
“Status or Control”. IMO reads better with “the” added.
> +(define_insn "@aarch64_set_<fpscr_name><GPI:mode>"
> + [(unspec_volatile [(match_operand:GPI 0 "register_operand" "r")]
> SET_FPSCR)]
> ""
> - "msr\\tfpcr, %0"
> + "msr\\t<fpscr_name>, %0"
> [(set_attr "type" "mrs")])
>
> ;; Read Floating-point Control Register.
Same here.
> -(define_insn "get_fpcr"
> - [(set (match_operand:SI 0 "register_operand" "=r")
> - (unspec_volatile:SI [(const_int 0)] UNSPECV_GET_FPCR))]
> - ""
> - "mrs\\t%0, fpcr"
> - [(set_attr "type" "mrs")])
> -
> -;; Write Floating-point Status Register.
> -(define_insn "set_fpsr"
> - [(unspec_volatile [(match_operand:SI 0 "register_operand" "r")]
> UNSPECV_SET_FPSR)]
> - ""
> - "msr\\tfpsr, %0"
> - [(set_attr "type" "mrs")])
> -
> -;; Read Floating-point Status Register.
> -(define_insn "get_fpsr"
> - [(set (match_operand:SI 0 "register_operand" "=r")
> - (unspec_volatile:SI [(const_int 0)] UNSPECV_GET_FPSR))]
> +(define_insn "@aarch64_get_<fpscr_name><GPI:mode>"
> + [(set (match_operand:GPI 0 "register_operand" "=r")
> + (unspec_volatile:GPI [(const_int 0)] GET_FPSCR))]
> ""
> - "mrs\\t%0, fpsr"
> + "mrs\\t%0, <fpscr_name>"
> [(set_attr "type" "mrs")])
>
> -
> ;; Define the subtract-one-and-jump insns so loop.c
> ;; knows what to generate.
> (define_expand "doloop_end"
> diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md
> index a568cf21b99d..9a5191689634 100644
> --- a/gcc/config/aarch64/iterators.md
> +++ b/gcc/config/aarch64/iterators.md
> @@ -3453,3 +3453,17 @@
>
> (define_int_attr unspec [(UNSPEC_WHILERW "UNSPEC_WHILERW")
> (UNSPEC_WHILEWR "UNSPEC_WHILEWR")])
> +
> +;; Iterators and attributes for fpcr fpsr getter setters
> +
> +(define_int_iterator GET_FPSCR
> + [UNSPECV_GET_FPSR UNSPECV_GET_FPCR])
> +
> +(define_int_iterator SET_FPSCR
> + [UNSPECV_SET_FPSR UNSPECV_SET_FPCR])
> +
> +(define_int_attr fpscr_name
> + [(UNSPECV_GET_FPSR "fpsr")
> + (UNSPECV_SET_FPSR "fpsr")
> + (UNSPECV_GET_FPCR "fpcr")
> + (UNSPECV_SET_FPCR "fpcr")])
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
> index 10dc32e6d2d4..29a6635ad134 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -13880,6 +13880,12 @@ unsigned int __builtin_aarch64_get_fpcr ()
> void __builtin_aarch64_set_fpcr (unsigned int)
> unsigned int __builtin_aarch64_get_fpsr ()
> void __builtin_aarch64_set_fpsr (unsigned int)
> +
> +unsigned long long __builtin_aarch64_get_fpcr64 ()
> +void __builtin_aarch64_set_fpcr64 (unsigned long long)
> +unsigned long long __builtin_aarch64_get_fpsr64 ()
> +void __builtin_aarch64_set_fpsr64 (unsigned long long)
> +
Excess blank line.
> @end smallexample
>
> @node Alpha Built-in Functions
> diff --git a/gcc/testsuite/gcc.target/aarch64/get_fpcr64.c
> b/gcc/testsuite/gcc.target/aarch64/get_fpcr64.c
Very minor, but it's probably more future-proof to add _1 to the filenames
of the tests.
> new file mode 100644
> index 000000000000..9fed91fe2053
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/aarch64/get_fpcr64.c
> @@ -0,0 +1,10 @@
> +/* { dg-do compile } */
> +/* { dg-options "-O2" } */
> +
> +long long unsigned
> +get_fpcr64 ()
> +{
> + return __builtin_aarch64_get_fpcr64 ();
> +}
> +
> +/* { dg-final { scan-assembler-times "mrs.*fpcr" 1 } } */
Probably safer as: {\tmrs\t[^\n]*fpcr}
(“.” matches newlines in this context.)
Although since the test is running at -O2, we should be able to rely on
x0 being chosen, so I think we should just use: {\tmrs\tx0, fpcr\n}
Same idea for the other tests.
OK with those changes, thanks.
Richard