Hi Simon:

Good catch, those cache operations should take an address operand.



On Thu, May 26, 2022 at 7:58 PM Simon Cook <simon.c...@embecosm.com> wrote:
>
> Hi,
>
> I've just tried using these builtins now these have landed in trunk, and
> I have a question about the cbo builtins.
>
> Looking at the code being generated it looks like these builtins return
> an int and take no arguments, but reading the instructions these should
> instead take an int and return nothing. As an example using one of the
> tests,
>
> int foo1()
> {
>      return __builtin_riscv_zicbom_cbo_clean();
> }
>
> generates
>
> foo1:
>         addi    sp,sp,-16
>         sw      s0,12(sp)
>         addi    s0,sp,16
>         cbo.clean       0(a5)
>         mv      a0,a5
>         lw      s0,12(sp)
>         addi    sp,sp,16
>         jr      ra
>         .size   foo1, .-foo1
>
> This reads to me like GCC is expecting the cbo.clean to have placed a
> value in a5, which is then moved to a0 for returning.
>
> Is this a bug with these builtins, or have I misunderstood these
> instructions?
>
> Thanks,
> Simon
>
>
> On 10/05/2022 04:25, shiyul...@iscas.ac.cn wrote:
> > From: yulong <shiyul...@iscas.ac.cn>
> >
> > This commit adds 
> > cbo.clea,cbo.flush,cbo.inval,cbo.zero,prefetch.i,prefetch.r and prefetch.w 
> > instructions.
> > diff with the previous version:
> > We use unspec_volatile instead of unspec for those cache operations. We use 
> > UNSPECV instead of UNSPEC and move them to unspecv.
> >
> > gcc/ChangeLog:
> >
> >          * config/riscv/predicates.md (imm5_operand): Add a new operand 
> > type for prefetch instructions.
> >          * config/riscv/riscv-builtins.cc (AVAIL): Add new AVAILs for CMO 
> > ISA Extensions.
> >          (RISCV_ATYPE_SI): New.
> >          (RISCV_ATYPE_DI): New.
> >          * config/riscv/riscv-ftypes.def (0): New.
> >          (1): New.
> >          * config/riscv/riscv.md (riscv_clean_<mode>): New.
> >          (riscv_flush_<mode>): New.
> >          (riscv_inval_<mode>): New.
> >          (riscv_zero_<mode>): New.
> >          (prefetch): New.
> >          (riscv_prefetchi_<mode>): New.
> >          * config/riscv/riscv-cmo.def: New file.
> > ---
> >   gcc/config/riscv/predicates.md     |  4 +++
> >   gcc/config/riscv/riscv-builtins.cc | 16 ++++++++++
> >   gcc/config/riscv/riscv-cmo.def     | 17 ++++++++++
> >   gcc/config/riscv/riscv-ftypes.def  |  4 +++
> >   gcc/config/riscv/riscv.md          | 51 ++++++++++++++++++++++++++++++
> >   5 files changed, 92 insertions(+)
> >   create mode 100644 gcc/config/riscv/riscv-cmo.def
> >
> > diff --git a/gcc/config/riscv/predicates.md b/gcc/config/riscv/predicates.md
> > index 97cdbdf053b..3fb4d95ab08 100644
> > --- a/gcc/config/riscv/predicates.md
> > +++ b/gcc/config/riscv/predicates.md
> > @@ -239,3 +239,7 @@
> >   (define_predicate "const63_operand"
> >     (and (match_code "const_int")
> >          (match_test "INTVAL (op) == 63")))
> > +
> > +(define_predicate "imm5_operand"
> > +  (and (match_code "const_int")
> > +       (match_test "INTVAL (op) < 5")))
> > \ No newline at end of file
> > diff --git a/gcc/config/riscv/riscv-builtins.cc 
> > b/gcc/config/riscv/riscv-builtins.cc
> > index 0658f8d3047..795132a0c16 100644
> > --- a/gcc/config/riscv/riscv-builtins.cc
> > +++ b/gcc/config/riscv/riscv-builtins.cc
> > @@ -87,6 +87,18 @@ struct riscv_builtin_description {
> >
> >   AVAIL (hard_float, TARGET_HARD_FLOAT)
> >
> > +
> > +AVAIL (clean32, TARGET_ZICBOM && !TARGET_64BIT)
> > +AVAIL (clean64, TARGET_ZICBOM && TARGET_64BIT)
> > +AVAIL (flush32, TARGET_ZICBOM && !TARGET_64BIT)
> > +AVAIL (flush64, TARGET_ZICBOM && TARGET_64BIT)
> > +AVAIL (inval32, TARGET_ZICBOM && !TARGET_64BIT)
> > +AVAIL (inval64, TARGET_ZICBOM && TARGET_64BIT)
> > +AVAIL (zero32,  TARGET_ZICBOZ && !TARGET_64BIT)
> > +AVAIL (zero64,  TARGET_ZICBOZ && TARGET_64BIT)
> > +AVAIL (prefetchi32, TARGET_ZICBOP && !TARGET_64BIT)
> > +AVAIL (prefetchi64, TARGET_ZICBOP && TARGET_64BIT)
> > +
> >   /* Construct a riscv_builtin_description from the given arguments.
> >
> >      INSN is the name of the associated instruction pattern, without the
> > @@ -119,6 +131,8 @@ AVAIL (hard_float, TARGET_HARD_FLOAT)
> >   /* Argument types.  */
> >   #define RISCV_ATYPE_VOID void_type_node
> >   #define RISCV_ATYPE_USI unsigned_intSI_type_node
> > +#define RISCV_ATYPE_SI intSI_type_node
> > +#define RISCV_ATYPE_DI intDI_type_node
> >
> >   /* RISCV_FTYPE_ATYPESN takes N RISCV_FTYPES-like type codes and lists
> >      their associated RISCV_ATYPEs.  */
> > @@ -128,6 +142,8 @@ AVAIL (hard_float, TARGET_HARD_FLOAT)
> >     RISCV_ATYPE_##A, RISCV_ATYPE_##B
> >
> >   static const struct riscv_builtin_description riscv_builtins[] = {
> > +  #include "riscv-cmo.def"
> > +
> >     DIRECT_BUILTIN (frflags, RISCV_USI_FTYPE, hard_float),
> >     DIRECT_NO_TARGET_BUILTIN (fsflags, RISCV_VOID_FTYPE_USI, hard_float)
> >   };
> > diff --git a/gcc/config/riscv/riscv-cmo.def b/gcc/config/riscv/riscv-cmo.def
> > new file mode 100644
> > index 00000000000..01cbf6ad64f
> > --- /dev/null
> > +++ b/gcc/config/riscv/riscv-cmo.def
> > @@ -0,0 +1,17 @@
> > +// zicbom
> > +RISCV_BUILTIN (clean_si, "zicbom_cbo_clean", RISCV_BUILTIN_DIRECT, 
> > RISCV_SI_FTYPE, clean32),
> > +RISCV_BUILTIN (clean_di, "zicbom_cbo_clean", RISCV_BUILTIN_DIRECT, 
> > RISCV_DI_FTYPE, clean64),
> > +
> > +RISCV_BUILTIN (flush_si, "zicbom_cbo_flush", RISCV_BUILTIN_DIRECT, 
> > RISCV_SI_FTYPE, flush32),
> > +RISCV_BUILTIN (flush_di, "zicbom_cbo_flush", RISCV_BUILTIN_DIRECT, 
> > RISCV_DI_FTYPE, flush64),
> > +
> > +RISCV_BUILTIN (inval_si, "zicbom_cbo_inval", RISCV_BUILTIN_DIRECT, 
> > RISCV_SI_FTYPE, inval32),
> > +RISCV_BUILTIN (inval_di, "zicbom_cbo_inval", RISCV_BUILTIN_DIRECT, 
> > RISCV_DI_FTYPE, inval64),
> > +
> > +// zicboz
> > +RISCV_BUILTIN (zero_si, "zicboz_cbo_zero", RISCV_BUILTIN_DIRECT, 
> > RISCV_SI_FTYPE, zero32),
> > +RISCV_BUILTIN (zero_di, "zicboz_cbo_zero", RISCV_BUILTIN_DIRECT, 
> > RISCV_DI_FTYPE, zero64),
> > +
> > +// zicbop
> > +RISCV_BUILTIN (prefetchi_si, "zicbop_cbo_prefetchi", RISCV_BUILTIN_DIRECT, 
> > RISCV_SI_FTYPE_SI, prefetchi32),
> > +RISCV_BUILTIN (prefetchi_di, "zicbop_cbo_prefetchi", RISCV_BUILTIN_DIRECT, 
> > RISCV_DI_FTYPE_DI, prefetchi64),
> > \ No newline at end of file
> > diff --git a/gcc/config/riscv/riscv-ftypes.def 
> > b/gcc/config/riscv/riscv-ftypes.def
> > index 2214c496f9b..62421292ce7 100644
> > --- a/gcc/config/riscv/riscv-ftypes.def
> > +++ b/gcc/config/riscv/riscv-ftypes.def
> > @@ -28,3 +28,7 @@ along with GCC; see the file COPYING3.  If not see
> >
> >   DEF_RISCV_FTYPE (0, (USI))
> >   DEF_RISCV_FTYPE (1, (VOID, USI))
> > +DEF_RISCV_FTYPE (0, (SI))
> > +DEF_RISCV_FTYPE (0, (DI))
> > +DEF_RISCV_FTYPE (1, (SI, SI))
> > +DEF_RISCV_FTYPE (1, (DI, DI))
> > diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md
> > index b3c5bce842a..b96d0c30e59 100644
> > --- a/gcc/config/riscv/riscv.md
> > +++ b/gcc/config/riscv/riscv.md
> > @@ -69,6 +69,11 @@
> >     ;; Stack Smash Protector
> >     UNSPEC_SSP_SET
> >     UNSPEC_SSP_TEST
> > +  UNSPECV_CLEAN
> > +  UNSPECV_FLUSH
> > +  UNSPECV_INVAL
> > +  UNSPECV_ZERO
> > +  UNSPECV_PREI
> >   ])
> >
> >   (define_constants
> > @@ -2863,6 +2868,52 @@
> >     "<load>\t%3, %1\;<load>\t%0, %2\;xor\t%0, %3, %0\;li\t%3, 0"
> >     [(set_attr "length" "12")])
> >
> > +(define_insn "riscv_clean_<mode>"
> > +[(unspec_volatile:X [(match_operand:X 0 "register_operand" "r")] 
> > UNSPECV_CLEAN)]
> > +"TARGET_ZICBOM"
> > +"cbo.clean\t%a0"
> > +)
> > +
> > +(define_insn "riscv_flush_<mode>"
> > +[(unspec_volatile:X [(match_operand:X 0 "register_operand" "r")] 
> > UNSPECV_FLUSH)]
> > +"TARGET_ZICBOM"
> > +"cbo.flush\t%a0"
> > +)
> > +
> > +(define_insn "riscv_inval_<mode>"
> > +[(unspec_volatile:X [(match_operand:X 0 "register_operand" "r")] 
> > UNSPECV_INVAL)]
> > +"TARGET_ZICBOM"
> > +"cbo.inval\t%a0"
> > +)
> > +
> > +(define_insn "riscv_zero_<mode>"
> > +[(unspec_volatile:X [(match_operand:X 0 "register_operand" "r")] 
> > UNSPECV_ZERO)]
> > +"TARGET_ZICBOZ"
> > +"cbo.zero\t%a0"
> > +)
> > +
> > +(define_insn "prefetch"
> > +[(prefetch (match_operand 0 "address_operand" "p")
> > +           (match_operand 1 "imm5_operand" "i")
> > +           (match_operand 2 "const_int_operand" "n"))]
> > +"TARGET_ZICBOP"
> > +{
> > +  switch (INTVAL (operands[1]))
> > +  {
> > +    case 0: return "prefetch.r\t%a0";
> > +    case 1: return "prefetch.w\t%a0";
> > +    default: gcc_unreachable ();
> > +  }
> > +})
> > +
> > +(define_insn "riscv_prefetchi_<mode>"
> > +[(unspec_volatile:X [(match_operand:X 0 "address_operand" "p")
> > +            (match_operand:X 1 "imm5_operand" "i")]
> > +            UNSPECV_PREI)]
> > +"TARGET_ZICBOP"
> > +"prefetch.i\t%a0"
> > +)
> > +
> >   (include "bitmanip.md")
> >   (include "sync.md")
> >   (include "peephole.md")

Reply via email to