arch/hexagon/lib/memcpy.S

Source file repositories/reference/linux-study-clean/arch/hexagon/lib/memcpy.S

File Facts

System
Linux kernel
Corpus path
arch/hexagon/lib/memcpy.S
Extension
.S
Size
15374 bytes
Lines
530
Domain
Architecture Layer
Bucket
arch/hexagon
Inferred role
Architecture Layer: arch/hexagon
Status
atlas-only

Why This File Exists

CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.

Dependency Surface

Detected Declarations

Annotated Snippet

* void * memcpy(char * ptr_out, char * ptr_in, int length) {
 *   int i;
 *   if(length) for(i=0; i < length; i++) { ptr_out[i] = ptr_in[i]; }
 *   return(ptr_out);
 * }
 *
 * Optimized memcpy function
 * =========================
 * void * memcpy(char * ptr_out, char * ptr_in, int len) {
 *   int i, prolog, kernel, epilog, mask;
 *   u8 offset;
 *   s64 data0, dataF8, data70;
 *
 *   s64 * ptr8_in;
 *   s64 * ptr8_out;
 *   s32 * ptr4;
 *   s16 * ptr2;
 *
 *   offset = ((int) ptr_in) & 7;
 *   ptr8_in = (s64 *) &ptr_in[-offset];   //read in the aligned pointers
 *
 *   data70 = *ptr8_in++;
 *   dataF8 = *ptr8_in++;
 *
 *   data0 = HEXAGON_P_valignb_PPp(dataF8, data70, offset);
 *
 *   prolog = 32 - ((int) ptr_out);
 *   mask  = 0x7fffffff >> HEXAGON_R_cl0_R(len);
 *   prolog = prolog & mask;
 *   kernel = len - prolog;
 *   epilog = kernel & 0x1F;
 *   kernel = kernel>>5;
 *
 *   if (prolog & 1) { ptr_out[0] = (u8) data0; data0 >>= 8; ptr_out += 1;}
 *   ptr2 = (s16 *) &ptr_out[0];
 *   if (prolog & 2) { ptr2[0] = (u16) data0;  data0 >>= 16; ptr_out += 2;}
 *   ptr4 = (s32 *) &ptr_out[0];
 *   if (prolog & 4) { ptr4[0] = (u32) data0;  data0 >>= 32; ptr_out += 4;}
 *
 *   offset = offset + (prolog & 7);
 *   if (offset >= 8) {
 *     data70 = dataF8;
 *     dataF8 = *ptr8_in++;
 *   }
 *   offset = offset & 0x7;
 *
 *   prolog = prolog >> 3;
 *   if (prolog) for (i=0; i < prolog; i++) {
 *       data0 = HEXAGON_P_valignb_PPp(dataF8, data70, offset);
 *       ptr8_out = (s64 *) &ptr_out[0]; *ptr8_out = data0; ptr_out += 8;
 *       data70 = dataF8;
 *       dataF8 = *ptr8_in++;
 *   }
 *   if(kernel) { kernel -= 1; epilog += 32; }
 *   if(kernel) for(i=0; i < kernel; i++) {
 *       data0 = HEXAGON_P_valignb_PPp(dataF8, data70, offset);
 *       ptr8_out = (s64 *) &ptr_out[0]; *ptr8_out = data0; ptr_out += 8;
 *       data70 = *ptr8_in++;
 *
 *       data0 = HEXAGON_P_valignb_PPp(data70, dataF8, offset);
 *       ptr8_out = (s64 *) &ptr_out[0]; *ptr8_out = data0; ptr_out += 8;
 *       dataF8 = *ptr8_in++;
 *
 *       data0 = HEXAGON_P_valignb_PPp(dataF8, data70, offset);
 *       ptr8_out = (s64 *) &ptr_out[0]; *ptr8_out = data0; ptr_out += 8;
 *       data70 = *ptr8_in++;
 *
 *       data0 = HEXAGON_P_valignb_PPp(data70, dataF8, offset);
 *       ptr8_out = (s64 *) &ptr_out[0]; *ptr8_out = data0; ptr_out += 8;
 *       dataF8 = *ptr8_in++;

Annotation

Implementation Notes