problem on modifying gcc backend for riscv
Faisal Riyaz
faisalriyaz011@gmail.com
Fri Jul 12 14:08:00 GMT 2019
Thanks for the replies.
I tried what Segher's approach:
(define_expand "mul<mode>3"
[(match_operand:ANYF 0 "register_operand" "=f")
(match_operand:ANYF 1 "register_operand" " f")
(match_operand:ANYF 2 "register_operand" " f")]
"TARGET_HARD_FLOAT"
{
rtx reg = gen_reg_rtx (SImode);
emit_insn(gen_modfloatmul_insn(SFmode, operands[0], operands[1],
operands[2]));
if( fpexception == 3)
{ emit_insn(gen_riscv_frflags(reg));}
DONE;
})
(define_insn "@mod<mode>floatmul_insn"
[(set (match_operand:ANYF 0 "register_operand" "=f")
(mult:ANYF (match_operand:ANYF 1 "register_operand" " f")
(match_operand:ANYF 2 "register_operand" " f")))]
"TARGET_HARD_FLOAT"
"fmul.<fmt>\t%0,%1,%2"
)
Build fails with messsage:
In file included from ../../../riscv-gcc/gcc/target.h:51:0,
from ../../../riscv-gcc/gcc/attribs.c:23:
./insn-codes.h:19:12: error: stray ‘@’ in program
CODE_FOR_@modsffloatmul_insn = 17,
^
./insn-codes.h:20:12: error: stray ‘@’ in program
CODE_FOR_@moddffloatmul_insn = 18,
^
In file included from ./tm.h:25:0,
from ../../../riscv-gcc/gcc/target.h:52,
from ../../../riscv-gcc/gcc/attribs.c:23:
./insn-flags.h:17:14: warning: missing whitespace after the macro name
#define HAVE_@modsffloatmul_insn (TARGET_HARD_FLOAT)
^
./insn-flags.h:18:14: warning: missing whitespace after the macro name
#define HAVE_@moddffloatmul_insn ((TARGET_HARD_FLOAT) &&
(TARGET_DOUBLE_FLOAT))
^
./insn-flags.h:18:0: warning: "HAVE_" redefined
#define HAVE_@moddffloatmul_insn ((TARGET_HARD_FLOAT) &&
(TARGET_DOUBLE_FLOAT))
^
./insn-flags.h:17:0: note: this is the location of the previous definition
#define HAVE_@modsffloatmul_insn (TARGET_HARD_FLOAT)
^
In file included from ./tm.h:25:0,
from ../../../riscv-gcc/gcc/target.h:52,
from ../../../riscv-gcc/gcc/attribs.c:23:
./insn-flags.h:232:23: error: stray ‘@’ in program
extern rtx gen_@modsffloatmul_insn (rtx, rtx, rtx);
^
./insn-flags.h:233:23: error: stray ‘@’ in program
extern rtx gen_@moddffloatmul_insn (rtx, rtx, rtx);
^
In file included from ../../../riscv-gcc/gcc/target.h:51:0,
from ../../../riscv-gcc/gcc/attribs.c:23:
./insn-codes.h:19:13: error: expected ‘}’ before ‘modsffloatmul_insn’
CODE_FOR_@modsffloatmul_insn = 17,
^
./insn-codes.h:19:34: error: invalid conversion from ‘int’ to ‘insn_code’
[-fpermissive]
CODE_FOR_@modsffloatmul_insn = 17,
^
./insn-codes.h:20:13: error: expected initializer before
‘moddffloatmul_insn’
CODE_FOR_@moddffloatmul_insn = 18,
^
./insn-codes.h:224:1: error: expected declaration before ‘}’ token
};
^
make[2]: *** [attribs.o] Error 1
make[1]: *** [all-gcc] Error 2
make: *** [stamps/build-gcc-newlib-stage1] Error 2
Note:
I know mul<mode>3 is a defined expansion pattern but for some reason, i
want to generate multiple RTL statements.. For that reason, i am using,
define_expand.
The original mul<mode>3 is now defined as mod<mode>floatmul_insn (as
advised). In my new mul<mode>3, i generate this RTL using
emit_insn(gen_riscv_frflags(reg)).
On Fri, Jul 12, 2019 at 7:04 PM Segher Boessenkool <
segher@kernel.crashing.org> wrote:
> On Fri, Jul 12, 2019 at 12:36:47PM +0000, Richard Earnshaw wrote:
> >
> >
> > On 12/07/2019 12:23, Segher Boessenkool wrote:
> > > So you'll have something like
> > >
> > > (define_insn "*mul<mode>3"
> > > ...
> >
> > Well mul<mode>3 for standard modes is a defined expansion pattern for
> > generating RTL from tree. So I think you don't want the * in this case.
>
> Faisal added a new
>
> > >> (define_expand "mul<mode>3"
>
> so you cannot name the define_insn (that does a different thing, btw)
> the same.
>
>
> Segher
>
More information about the Gcc-help
mailing list