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~