Hi!

Am 09.01.2008 um 23:54 schrieb Ian Lance Taylor:

Boris Boesler <[EMAIL PROTECTED]> writes:

  I'm trying to allocate a scratch register: write immediate constant
into scratch register r, write register r into memory
...
  What is wrong with the code above?

There is nothing wrong with that code, but nothing is going to make
the compiler use it.  Moves are special.

Yes, I can remember that constraints in a mov-insn can not be resolved by other/additional mov-insns.

Ok, I rewrote my insns; there was a "mov<mode>"-insn with mode \in {QI, HI, SI}:

(define_insn_and_split "movqi"
  [(set (match_operand:QI 0 "reg_mem_operand" "=mr")
        (match_operand:QI 1 "rim_operand"     " mir"))
  (clobber (match_scratch:QI 2 "=r"))
 ]
  ""
  "#"
  "&& reload_completed"
  [(set (match_dup 2) (match_dup 1))
   (set (match_dup 0) (match_dup 2))]
  "")

;; help insns
(define_insn "mov<mode>_reg_by_store"
  [(set (match_operand:I8I16 0 "memory_operand"   "=  m")
        (match_operand:I8I16 1 "register_operand" " rAx"))]
  ""
  "bla bla bla")

(define_insn "mov<mode>_reg_imm"
  [(set (match_operand:I8I16 0 "register_operand"   "=rAx, rAx, rAx")
        (match_operand:I8I16 1 "immediate_operand"  "   I,   i, rAx"))]
  ""
  "some other bla bla bla")

These insns handle byte-accesses as expected. But now a previous tests fail for something like ashift:SI(reg:SI, const_int:QI 5):
p.c:36: error: unrecognizable insn:
(insn 114 18 115 (set (scratch:QI)
        (const_int 5 [0x5])) -1 (nil)
    (nil))

I do not understand why this happens does not happen in my byte- access example. So I added the two insns (I8I16 = {QI, HI}):

(define_insn "mov<mode>_to_scratch"
  [(set (match_scratch:I8I16 0                   "=r,r")
        (match_operand:I8I16 1 "reg_imm_operand" " r,i"))]
  ""
  "again bla bla bla")

(define_insn "mov<mode>_from_scratch"
  [(set (match_operand:I8I16 0 "register_operand" "=r")
        (match_scratch:I8I16 1                    " r"))]
  ""
  "even more bla bla bla")

 But now the compiler says:
p.c:36: error: insn does not satisfy its constraints:
(insn 114 18 115 (set (scratch:QI)
        (const_int 5 [0x5])) 79 {movqi_to_scratch} (nil)
    (nil))
p.c:36: internal compiler error: in final_scan_insn, at final.c:2382

 The two insns in the dump file .shorten are:

(insn 114 18 115 (set (scratch:QI)
        (const_int 5 [0x5])) 79 {movqi_to_scratch} (nil)
    (nil))

(insn 115 114 19 (set (reg:QI 31 R31)
        (scratch:QI)) 81 {movqi_from_scratch} (nil)
    (nil))

I can't see what's wrong. I guess I don't understand that scratch- stuff in gcc?

Thanks,
Boris

Reply via email to