On Fri, Dec 18, 2015 at 8:15 AM, Kirill Yukhin <kirill.yuk...@gmail.com> wrote:
> Hello,
> Patch in the bottom introduces support Intel PKRU instructions:
> rdpkru and wrpkru.
> It is pretty straight-forward, so I hope it is still suitable for v6.
>
> Names for new intrinsics will appear shortly in new revision of SDM.
>
> Bootstrapped & regtested.
>
> Is it ok for trunk?

The patch mostly looks OK, but md patterns are written in the wrong
way. Please see comments bellow.

> gcc/
>         * common/config/i386/i386-common.c (OPTION_MASK_ISA_PKU_SET): New.
>         (OPTION_MASK_ISA_PKU_UNSET): Ditto.
>         (ix86_handle_option): Handle OPT_mpku.
>         * config.gcc: Add pkuintrin.h to i[34567]86-*-* and x86_64-*-*
>         targets.
>         * config/i386/cpuid.h (host_detect_local_cpu): Detect PKU feature.
>         * config/i386/i386-c.c (ix86_target_macros_internal): Handle PKU ISA
>         flag.
>         * config/i386/i386.c (ix86_target_string): Add "-mpku" to
>         ix86_target_opts.
>         (ix86_option_override_internal): Define PTA_PKU, mention new key
>         in skylake-avx512. Handle new ISA bits.
>         (ix86_valid_target_attribute_inner_p): Add "pku".
>         (enum ix86_builtins): Add IX86_BUILTIN_RDPKRU and IX86_BUILTIN_WRPKRU.
>         (builtin_description bdesc_special_args[]): Add new built-ins.
>         * config/i386/i386.h (define TARGET_PKU): New.
>         (define TARGET_PKU_P): Ditto.
>         * config/i386/i386.md (define_c_enum "unspec"): Add UNSPEC_PKU.
>         (define_c_enum "unspecv"): Add UNSPECV_PKU.
>         (define_expand "rdpkru"): New.
>         (define_insn "rdpkru_2"): Ditto.
>         (define_expand "wrpkru"): Ditto.
>         (define_insn "wrpkru_2"): Ditto.
>         * config/i386/i386.opt (mpku): Ditto.
>         * config/i386/pkuintrin.h: New file.
>         * config/i386/x86intrin.h: Include pkuintrin.h
>         * doc/extend.texi: Describe new built-ins.
>         * doc/invoke.texi: Describe new switches.
>
> gcc/testsuite/
>         * g++.dg/other/i386-2.C: Add -mpku.
>         * g++.dg/other/i386-3.C: Ditto.
>         * gcc.target/i386/rdpku-1.c: New test.
>         * gcc.target/i386/sse-12.c: Add -mpku.
>         * gcc.target/i386/sse-13.c: Ditto..
>         * gcc.target/i386/sse-22.c: Ditto..
>         * gcc.target/i386/sse-33.c: Ditto..
>         * gcc.target/i386/wrpku-1.c: New test.
>

> +(define_expand "rdpkru"
> +  [(set (match_operand:SI 0 "register_operand")
> +       (unspec:SI [(const_int 0)] UNSPEC_PKU))
> +   (set (reg:SI CX_REG)
> +       (const_int 0))
> +   (clobber (reg:SI DX_REG))]
> +  "TARGET_PKU"
> +{
> +  emit_move_insn (gen_rtx_REG (SImode, CX_REG), CONST0_RTX (SImode));
> +  emit_insn (gen_rdpkru_2 (operands[0]));
> +  DONE;
> +})

You should use "parallel" to emit insn with several parallel
expressions. So, in the preparation statements, you move const0 to a
pseudo, so the RA will later use correct register. And please leave to
the expander to emit the pattern.

> +(define_insn "rdpkru_2"
> +  [(set (match_operand:SI 0 "register_operand" "=a")
> +       (unspec:SI [(const_int 0)] UNSPEC_PKU))
> +   (clobber (reg:SI DX_REG))
> +   (use (reg:SI CX_REG))]
> +  "TARGET_PKU"
> +  "rdpkru"
> +  [(set_attr "type" "other")])

Please do not use explicit hard registers. There are appropriate
single-reg constraints available for use. Without seeing the
documentation, I think the above should look like:

(define_insn "*rdpkru"
  [(set (match_operand:SI 0 "register_operand" "=a")
       (unspec:SI [(match_operand:SI 1 "register_operand" "c")] UNSPEC_PKU))
   (clobber (rmatch_operand "register_operand "=d"))
  "TARGET_PKU"
  "rdpkru"
  [(set_attr "type" "other")])

> +(define_expand "wrpkru"
> +  [(unspec_volatile:SI [(match_operand:SI 0 "register_operand")] UNSPECV_PKU)
> +   (set (reg:SI CX_REG)
> +       (const_int 0))
> +   (set (reg:SI DX_REG)
> +       (const_int 0))]
> +  "TARGET_PKU"
> +{
> +  emit_move_insn (gen_rtx_REG (SImode, CX_REG), CONST0_RTX (SImode));
> +  emit_move_insn (gen_rtx_REG (SImode, DX_REG), CONST0_RTX (SImode));
> +  emit_insn (gen_wrpkru_2 (operands[0]));
> +  DONE;
> +})
> +
> +(define_insn "wrpkru_2"
> +  [(unspec_volatile:SI [(match_operand:SI 0 "register_operand" "a")] 
> UNSPECV_PKU)
> +   (use (reg:SI CX_REG))
> +   (use (reg:SI DX_REG))]
> +  "TARGET_PKU"
> +  "wrpkru"
> +  [(set_attr "type" "other")])
>
Please move all input operands to the insisde of the unspec, but it
looks that this pattern is missing clobber, as in the above rdpkru
pattern.

Uros.

Reply via email to