On 09/16/2009 03:00 PM, Jean Christophe Beyler wrote:
Sorry to bring this back to the conversation. Is there any reason why
this would not work with floating-point constraints ?

Not that I can think of.  Did you provide all of the secondary reload
stuff that you need?  Probably not.

(define_memory_constraint "R"
   "R is for memory references which take 1 word for the instruction"
   (and (match_code "mem")
        (match_test "simple_memory_operand (op)")))

I have :
(define_insn "movdf_internal"
   [(set (match_operand:DF 0 "nonimmediate_operand" "=r,r,r,R")
         (match_operand:DF 1 "general_operand"      " r,F,R,r"))]
   "check_move (operands[0], operands[1])"
    "@
     mov\\t%0,%1
     lid\\t%0,%1
     ldd\\t%0,%1
     std\\t%1,%0"
   [(set_attr "type"     "move,arith,load,store")
    (set_attr "mode"     "DF,DF,DF,DF")
    (set_attr "length"   "1,1,1,1")])

However, on a relatively complex bit of code, I get :
error: unrecognizable insn:
(set (mem/s:DF (const:DI (plus:DI (symbol_ref:DI ("st")<var_decl
0x2a957d7aa0 st>)
                     (const_int 48 [0x30]))) [14 st+48 S8 A64])
         (reg:DF 10 r10)) -1 (nil))

(My architecture cannot allow const as addresses to the store, it must
go through a register).

You'll do much better by rejecting these addresses earlier.
Probably by some combination of custom predicates that allow
only simple_memory_operand + registers + constants, or by
simply defining this kind of memory address illegal for DFmode.



r~

Reply via email to