Hi All,
Good day there.

We are porting the gcc 4.8.1 and defined the  calling conventions like
                If(sizeof(arg) < = 2)
                                Pass with reg.
                Else
                                Pass by stack.

The problem is that  the code is bloated for the datatype where
sizeof(datatype) > 2 .i.e

We see  the sequences of load from  the stack (for local)  and store
to stack(outgoiing args) like

ld reg,(fp-d-1)
ld (sp+d),reg
ld reg,(fp-d-2)
ld (sp+d+1),reg
ld reg,(fp-d-3)
ld (sp+d+2),reg
ld reg,(fp-d-4)
ld (sp+d+3),reg
……………….
and goes on for large type size …..

So we thought of having blkcopy intrinsic function which takes the
address of src and dst  along size and the  alignment info.

Se we defined the  some of the gcc macros like

#defined MOVE_MAX  2
#define MOVE_BY_PIECES_P(SIZE, ALIGN)         \
          ( (SIZE) == 1 || (SIZE) == 2  )

And define movmemhi pattern( word size is 2 byte) as

;; Argument 0 is the destination
;; Argument 1 is the source
;; Argument 2 is the length
;; Argument 3 is the alignment

(define_expand "movmemhi"
  [(match_operand 0 "general_operand" "")
   (match_operand 1 "general_operand" "")
   (match_operand 2 "register_operand" "")
   (match_operand 3 "" "")
   ]
  ""
        {
                rtx libfunc = init_one_libfunc ("blkcopy ");
                emit_library_call_value (libfunc,NULL_RTX, LCT_NORMAL, VOIDmode,
                                               2, operands[0],
HImode,operands[1], HImode);
                DONE;
        }

  )

After all this ,we still see the sequences of load from  the stack
(for local)  and store to stack(outgoiing args) and backend is not
able to emit the libcall for the blockcopy.

We are debugging the issue and the  meanwhile appreciate any help from
the group .


Thank you and waiting for a any reply
~Umesh

Reply via email to