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