<commit_before>// prefetch optimized for Cortex-A9 (cache line is 32 bytes, while A15 is 64 bytes)
void kernel_dgemm_pp_nt_4x4_vfpv3_lib4(int kmax, double *A, double *B, double *C, int bs, int alg)
	{
	
	if(kmax<=0)
		return;
	
	__builtin_prefetch( A );
	__builtin_prefetch( B );
	__builtin_prefetch( A+4 );
	__builtin_prefetch( B+4 );

	int k_iter = kmax/4;
	int k_left = kmax%4;
	
//	printf("\n%d %d %d\n", kmax, k_iter, k_left);

	__asm__ volatile
	(
		"                                \n\t"
//		"ldr    r0, %2                   \n\t" // load address of A
//		"ldr    r1, %3                   \n\t" // load address of B
		"mov    r0, %2                   \n\t" // load address of A
		"mov    r1, %3                   \n\t" // load address of B
		"                                \n\t"
		"                                \n\t"
//		"ldr    r3, %0                   \n\t" // k_iter
		"mov    r3, %0                   \n\t" // k_iter
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #64]                \n\t"
		"pld    [r1, #64]                \n\t"
		"pld    [r0, #96]                \n\t"
		"pld    [r1, #96]                \n\t"
		"                                \n\t"
		"                                \n\t"
//		"ldr    r2, %4                   \n\t" // load address of C
		"mov    r2, %4                   \n\t" // load address of C
		"                                \n\t"
		"                                \n\t"
		"fldd   d16, [r0, #0]            \n\t" // prefetch A_even
		"fldd   d17, [r0, #8]            \n\t"
		"fldd   d18, [r0, #16]           \n\t"
		"fldd   d19, [r0, #24]           \n\t"
		"                                \n\t"
		"fldd   d20, [r1, #0]            \n\t" // prefetch B_even
		"fldd   d21, [r1, #8]            \n\t"
		"fldd   d22, [r1, #16]           \n\t"
		"fldd   d23, [r1, #24]           \n\t"
		"                                \n\t"
		"cmp    r3, #0                   \n\t"
		"                                \n\t"
		"fldd   d24, [r0, #32]           \n\t" // prefetch A_odd
		"fldd   d25, [r0, #40]           \n\t"
		"fldd   d26, [r0, #48]           \n\t"
		"fldd   d27, [r0, #56]           \n\t"
		"                                \n\t"
		"fldd   d28, [r1, #32]           \n\t" // prefetch B_odd
		"fldd   d29, [r1, #40]           \n\t"
		"fldd   d30, [r1, #48]           \n\t"
		"fldd   d31, [r1, #56]           \n\t"
		"                                \n\t"
		"                                \n\t"
		"                                \n\t"
		"fldd   d0, .DOUBLEZERO          \n\t" // load zero double
		"fcpyd  d1, d0                   \n\t"
		"fcpyd  d2, d0                   \n\t"
		"fcpyd  d3, d0                   \n\t"
		"fcpyd  d4, d0                   \n\t"
		"fcpyd  d5, d0                   \n\t"
		"fcpyd  d6, d0                   \n\t"
		"fcpyd  d7, d0                   \n\t"
		"fcpyd  d8, d0                   \n\t"
		"fcpyd  d9, d0                   \n\t"
		"fcpyd  d10, d0                  \n\t"
		"fcpyd  d11, d0                  \n\t"
		"fcpyd  d12, d0                  \n\t"
		"fcpyd  d13, d0                  \n\t"
		"fcpyd  d14, d0                  \n\t"
		"fcpyd  d15, d0                  \n\t"
		"                                \n\t"
		"                                \n\t"
		"ble    .DCONSIDERLEFT           \n\t"
		"                                \n\t"
		"                                \n\t"
		".DLOOPKITER:                    \n\t" // main loop
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #128]               \n\t"
		"pld    [r1, #128]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d16, d20             \n\t"
		"fmacd  d1, d17, d20             \n\t"
		"fmacd  d2, d18, d20             \n\t"
		"fmacd  d3, d19, d20             \n\t"
		"fldd   d20, [r1, #64]           \n\t" // prefetch B_even
		"                                \n\t"
		"fmacd  d4, d16, d21             \n\t"
		"fmacd  d5, d17, d21             \n\t"
		"fmacd  d6, d18, d21             \n\t"
		"fmacd  d7, d19, d21             \n\t"
		"fldd   d21, [r1, #72]           \n\t"
		"                                \n\t"
		"fmacd  d8, d16, d22             \n\t"
		"fmacd  d9, d17, d22             \n\t"
		"fmacd  d10, d18, d22            \n\t"
		"fmacd  d11, d19, d22            \n\t"
		"fldd   d22, [r1, #80]           \n\t"
		"                                \n\t"
		"fmacd  d12, d16, d23            \n\t"
		"fldd   d16, [r0, #64]           \n\t" // prefetch A_even
		"fmacd  d13, d17, d23            \n\t"
		"fldd   d17, [r0, #72]           \n\t"
		"fmacd  d14, d18, d23            \n\t"
		"fldd   d18, [r0, #80]           \n\t"
		"fmacd  d15, d19, d23            \n\t"
		"fldd   d23, [r1, #88]           \n\t"
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #192]               \n\t"
		"pld    [r1, #192]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d24, d28             \n\t"
		"fldd   d19, [r0, #88]           \n\t"
		"fmacd  d1, d25, d28             \n\t"
		"sub    r3, r3, #1               \n\t" // iter++
		"fmacd  d2, d26, d28             \n\t"
		"fmacd  d3, d27, d28             \n\t"
		"fldd   d28, [r1, #96]           \n\t" // prefetch B_odd
		"                                \n\t"
		"fmacd  d4, d24, d29             \n\t"
		"fmacd  d5, d25, d29             \n\t"
		"fmacd  d6, d26, d29             \n\t"
		"fmacd  d7, d27, d29             \n\t"
		"fldd   d29, [r1, #104]          \n\t"
		"                                \n\t"
		"fmacd  d8, d24, d30             \n\t"
		"fmacd  d9, d25, d30             \n\t"
		"fmacd  d10, d26, d30            \n\t"
		"fmacd  d11, d27, d30            \n\t"
		"fldd   d30, [r1, #112]          \n\t"
		"                                \n\t"
		"fmacd  d12, d24, d31            \n\t"
		"fldd   d24, [r0, #96]           \n\t" // prefetch A_odd
		"fmacd  d13, d25, d31            \n\t"
		"fldd   d25, [r0, #104]          \n\t"
		"fmacd  d14, d26, d31            \n\t"
		"fldd   d26, [r0, #112]          \n\t"
		"fmacd  d15, d27, d31            \n\t"
		"fldd   d31, [r1, #120]          \n\t"
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #256]               \n\t"
		"pld    [r1, #256]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d16, d20             \n\t"
		"fldd   d27, [r0, #120]          \n\t"
		"fmacd  d1, d17, d20             \n\t"
		"cmp    r3, #0                   \n\t" // next iter?
		"fmacd  d2, d18, d20             \n\t"
		"fmacd  d3, d19, d20             \n\t"
		"fldd   d20, [r1, #128]          \n\t" // prefetch B_even
		"                                \n\t"
		"fmacd  d4, d16, d21             \n\t"
		"fmacd  d5, d17, d21             \n\t"
		"fmacd  d6, d18, d21             \n\t"
		"fmacd  d7, d19, d21             \n\t"
		"fldd   d21, [r1, #136]          \n\t"
		"                                \n\t"
		"fmacd  d8, d16, d22             \n\t"
		"fmacd  d9, d17, d22             \n\t"
		"fmacd  d10, d18, d22            \n\t"
		"fmacd  d11, d19, d22            \n\t"
		"fldd   d22, [r1, #144]          \n\t"
		"                                \n\t"
		"fmacd  d12, d16, d23            \n\t"
		"fldd   d16, [r0, #128]          \n\t" // prefetch A_even
		"fmacd  d13, d17, d23            \n\t"
		"fldd   d17, [r0, #136]          \n\t"
		"fmacd  d14, d18, d23            \n\t"
		"fldd   d18, [r0, #144]          \n\t"
		"fmacd  d15, d19, d23            \n\t"
		"fldd   d19, [r0, #152]          \n\t"
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #384]               \n\t"
		"pld    [r1, #384]               \n\t"
		"                                \n\t"
		"                                \n\t"<commit_msg>fixed bug prefetch<commit_after>// prefetch optimized for Cortex-A9 (cache line is 32 bytes, while A15 is 64 bytes)
void kernel_dgemm_pp_nt_4x4_vfpv3_lib4(int kmax, double *A, double *B, double *C, int bs, int alg)
	{
	
	if(kmax<=0)
		return;
	
	__builtin_prefetch( A );
	__builtin_prefetch( B );
	__builtin_prefetch( A+4 );
	__builtin_prefetch( B+4 );

	int k_iter = kmax/4;
	int k_left = kmax%4;
	
//	printf("\n%d %d %d\n", kmax, k_iter, k_left);

	__asm__ volatile
	(
		"                                \n\t"
//		"ldr    r0, %2                   \n\t" // load address of A
//		"ldr    r1, %3                   \n\t" // load address of B
		"mov    r0, %2                   \n\t" // load address of A
		"mov    r1, %3                   \n\t" // load address of B
		"                                \n\t"
		"                                \n\t"
//		"ldr    r3, %0                   \n\t" // k_iter
		"mov    r3, %0                   \n\t" // k_iter
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #64]                \n\t"
		"pld    [r1, #64]                \n\t"
		"pld    [r0, #96]                \n\t"
		"pld    [r1, #96]                \n\t"
		"                                \n\t"
		"                                \n\t"
//		"ldr    r2, %4                   \n\t" // load address of C
		"mov    r2, %4                   \n\t" // load address of C
		"                                \n\t"
		"                                \n\t"
		"fldd   d16, [r0, #0]            \n\t" // prefetch A_even
		"fldd   d17, [r0, #8]            \n\t"
		"fldd   d18, [r0, #16]           \n\t"
		"fldd   d19, [r0, #24]           \n\t"
		"                                \n\t"
		"fldd   d20, [r1, #0]            \n\t" // prefetch B_even
		"fldd   d21, [r1, #8]            \n\t"
		"fldd   d22, [r1, #16]           \n\t"
		"fldd   d23, [r1, #24]           \n\t"
		"                                \n\t"
		"cmp    r3, #0                   \n\t"
		"                                \n\t"
		"fldd   d24, [r0, #32]           \n\t" // prefetch A_odd
		"fldd   d25, [r0, #40]           \n\t"
		"fldd   d26, [r0, #48]           \n\t"
		"fldd   d27, [r0, #56]           \n\t"
		"                                \n\t"
		"fldd   d28, [r1, #32]           \n\t" // prefetch B_odd
		"fldd   d29, [r1, #40]           \n\t"
		"fldd   d30, [r1, #48]           \n\t"
		"fldd   d31, [r1, #56]           \n\t"
		"                                \n\t"
		"                                \n\t"
		"                                \n\t"
		"fldd   d0, .DOUBLEZERO          \n\t" // load zero double
		"fcpyd  d1, d0                   \n\t"
		"fcpyd  d2, d0                   \n\t"
		"fcpyd  d3, d0                   \n\t"
		"fcpyd  d4, d0                   \n\t"
		"fcpyd  d5, d0                   \n\t"
		"fcpyd  d6, d0                   \n\t"
		"fcpyd  d7, d0                   \n\t"
		"fcpyd  d8, d0                   \n\t"
		"fcpyd  d9, d0                   \n\t"
		"fcpyd  d10, d0                  \n\t"
		"fcpyd  d11, d0                  \n\t"
		"fcpyd  d12, d0                  \n\t"
		"fcpyd  d13, d0                  \n\t"
		"fcpyd  d14, d0                  \n\t"
		"fcpyd  d15, d0                  \n\t"
		"                                \n\t"
		"                                \n\t"
		"ble    .DCONSIDERLEFT           \n\t"
		"                                \n\t"
		"                                \n\t"
		".DLOOPKITER:                    \n\t" // main loop
		"                                \n\t"
		"                                \n\t"
		"pld    [r0, #128]               \n\t"
		"pld    [r1, #128]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d16, d20             \n\t"
		"fmacd  d1, d17, d20             \n\t"
		"fmacd  d2, d18, d20             \n\t"
		"fmacd  d3, d19, d20             \n\t"
		"fldd   d20, [r1, #64]           \n\t" // prefetch B_even
		"                                \n\t"
		"fmacd  d4, d16, d21             \n\t"
		"fmacd  d5, d17, d21             \n\t"
		"fmacd  d6, d18, d21             \n\t"
		"fmacd  d7, d19, d21             \n\t"
		"fldd   d21, [r1, #72]           \n\t"
		"                                \n\t"
		"fmacd  d8, d16, d22             \n\t"
		"fmacd  d9, d17, d22             \n\t"
		"fmacd  d10, d18, d22            \n\t"
		"fmacd  d11, d19, d22            \n\t"
		"fldd   d22, [r1, #80]           \n\t"
		"                                \n\t"
		"fmacd  d12, d16, d23            \n\t"
		"fldd   d16, [r0, #64]           \n\t" // prefetch A_even
		"fmacd  d13, d17, d23            \n\t"
		"fldd   d17, [r0, #72]           \n\t"
		"fmacd  d14, d18, d23            \n\t"
		"fldd   d18, [r0, #80]           \n\t"
		"fmacd  d15, d19, d23            \n\t"
		"fldd   d23, [r1, #88]           \n\t"
		"                                \n\t"
		"                                \n\t"
/*		"pld    [r0, #192]               \n\t"*/
/*		"pld    [r1, #192]               \n\t"*/
		"pld    [r0, #160]               \n\t"
		"pld    [r1, #160]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d24, d28             \n\t"
		"fldd   d19, [r0, #88]           \n\t"
		"fmacd  d1, d25, d28             \n\t"
		"sub    r3, r3, #1               \n\t" // iter++
		"fmacd  d2, d26, d28             \n\t"
		"fmacd  d3, d27, d28             \n\t"
		"fldd   d28, [r1, #96]           \n\t" // prefetch B_odd
		"                                \n\t"
		"fmacd  d4, d24, d29             \n\t"
		"fmacd  d5, d25, d29             \n\t"
		"fmacd  d6, d26, d29             \n\t"
		"fmacd  d7, d27, d29             \n\t"
		"fldd   d29, [r1, #104]          \n\t"
		"                                \n\t"
		"fmacd  d8, d24, d30             \n\t"
		"fmacd  d9, d25, d30             \n\t"
		"fmacd  d10, d26, d30            \n\t"
		"fmacd  d11, d27, d30            \n\t"
		"fldd   d30, [r1, #112]          \n\t"
		"                                \n\t"
		"fmacd  d12, d24, d31            \n\t"
		"fldd   d24, [r0, #96]           \n\t" // prefetch A_odd
		"fmacd  d13, d25, d31            \n\t"
		"fldd   d25, [r0, #104]          \n\t"
		"fmacd  d14, d26, d31            \n\t"
		"fldd   d26, [r0, #112]          \n\t"
		"fmacd  d15, d27, d31            \n\t"
		"fldd   d31, [r1, #120]          \n\t"
		"                                \n\t"
		"                                \n\t"
/*		"pld    [r0, #256]               \n\t"*/
/*		"pld    [r1, #256]               \n\t"*/
		"pld    [r0, #192]               \n\t"
		"pld    [r1, #192]               \n\t"
		"                                \n\t"
		"                                \n\t"
		"fmacd  d0, d16, d20             \n\t"
		"fldd   d27, [r0, #120]          \n\t"
		"fmacd  d1, d17, d20             \n\t"
		"cmp    r3, #0                   \n\t" // next iter?
		"fmacd  d2, d18, d20             \n\t"
		"fmacd  d3, d19, d20             \n\t"
		"fldd   d20, [r1, #128]          \n\t" // prefetch B_even
		"                                \n\t"
		"fmacd  d4, d16, d21             \n\t"
		"fmacd  d5, d17, d21             \n\t"
		"fmacd  d6, d18, d21             \n\t"
		"fmacd  d7, d19, d21             \n\t"
		"fldd   d21, [r1, #136]          \n\t"
		"                                \n\t"
		"fmacd  d8, d16, d22             \n\t"
		"fmacd  d9, d17, d22             \n\t"
		"fmacd  d10, d18, d22            \n\t"
		"fmacd  d11, d19, d22            \n\t"
		"fldd   d22, [r1, #144]          \n\t"
		"                                \n\t"
		"fmacd  d12, d16, d23            \n\t"
		"fldd   d16, [r0, #128]          \n\t" // prefetch A_even
		"fmacd  d13, d17, d23            \n\t"
		"fldd   d17, [r0, #136]          \n\t"
		"fmacd  d14, d18, d23            \n\t"
		"fldd   d18, [r0, #144]          \n\t"
		"fmacd  d15, d19, d23            \n\t"
		"fldd   d19, [r0, #152]          \n\t"
		"                                \n\t"
		"                                \n\t"
/*		"pld    [r0, #384]               \n\t"*/
/*		"pld    [r1, #384]               \n\t"*/
		"pld    [r0, #224]               \n\t"
		"pld    [r1, #224]               \n\t"
		"                                \n\t"
		"                                \n\t"
{'fraction_non_alphanumeric': 0.15149830089589125, 'fraction_numerical': 0.07340129749768304, 'mean_word_length': 0.652475752935171, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 3, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '903954', 'n_tokens_mistral': 7932, 'n_tokens_neox': 6957, 'n_words': 1521}