This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
Re: having trouble with define_split
- From: "Denis Chertykov" <chertykov at gmail dot com>
- To: "Sean D'Epagnier" <geckosenator at gmail dot com>
- Cc: gcc at gcc dot gnu dot org
- Date: Sat, 10 Jan 2009 13:00:30 +0300
- Subject: Re: having trouble with define_split
- References: <b9d4feda0901082259j7847c802maf2e4ed566545cda@mail.gmail.com>
2009/1/9 Sean D'Epagnier <geckosenator@gmail.com>:
> Hi,
>
> I am currently working on adding native fixed-point support to the avr
> backend. A lot of stuff is working, but there are a few things left,
> one of them is conversions from fixed point to floating point.
>
> I have conversions between all integer and fixed point types working
> as well as SA to SF conversion.
>
> I want to convert the fixed point types smaller than SA to float by
> using define_split to convert to SA then to SF. I am first trying to
> get QQ->SF working, one of the things I tried is:
>
> (define_expand "fractqqsf2"
> [(set (match_operand:SF 0 "register_operand" "")
> (fract_convert:SF (match_operand:QQ 1 "register_operand" "")))
> (clobber (match_operand:SA 2 "register_operand" ""))]
> ""
> "")
Wrong expand.
- (clobber (match_operand:SA 2 "register_operand" ""))]
+ (clobber (match_scratch:SA 2 ""))]
>
> (define_split
> [(set (match_operand:SF 0 "register_operand" "")
> (fract_convert:SF (match_operand:QQ 1 "register_operand" "")))
> (clobber (match_operand:SA 2 "register_operand" ""))]
> ""
> [(set (match_dup 2) (fract_convert:SA (match_dup 1)))
> (set (match_dup 0) (fract_convert:SF (match_dup 2)))]
> "")
(define_split
[(set (match_operand:SF 0 "register_operand" "")
(fract_convert:SF (match_operand:QQ 1 "register_operand" "")))
(clobber (match_scratch:SA 2 "=r"))]]
"reload_completed"
[(set (match_dup 2) (fract_convert:SA (match_dup 1)))
(set (match_dup 0) (fract_convert:SF (match_dup 2)))]
"")
>
> This causes the compiler to crash with a segmentation fault. I have
> tried a bunch of other strategies, and usually the compiler complains
> about unrecognized instruction. I'm not sure what I'm doing wrong,
> but I don't have a good reference example for this. I can implement
> these routines in a library, that might end up being better in terms
> of space, but I would like to know what I am doing wrong and how to
> use define_split correctly.
May be better to define expand like this:
(define_expand "fractqqsf2"
[(set (match_dup 2) (fract_convert:SA (match_operand:QQ 1
"register_operand" "")))
(set (match_operand:SF 0 "register_operand" "") (fract_convert:SF
(match_dup 2)))]
""
"
operands[2] = gen_reg_rtx (SAmode);
")
Denis.