Ticket #3281: ffs_arch_x86_opt.patch
File ffs_arch_x86_opt.patch, 6.8 KB (added by , 15 years ago) |
---|
-
src/system/kernel/lib/arch/x86/arch_string.S
114 114 FUNCTION_END(memset_generic) 115 115 SYMBOL(memset_generic_end): 116 116 117 /* int *ffs(int value); */ 118 .align 4 119 FUNCTION(ffs_generic): 120 bsf 4(%esp), %eax 121 ret 122 FUNCTION_END(ffs_generic) 123 SYMBOL(ffs_generic_end): 117 124 118 125 #if !_BOOT_MODE 119 126 … … 126 133 jmp *(gOptimizedFunctions + X86_OPTIMIZED_FUNCTIONS_memset) 127 134 FUNCTION_END(memset) 128 135 136 FUNCTION(ffs): 137 jmp *(gOptimizedFunctions + X86_OPTIMIZED_FUNCTIONS_ffs) 138 FUNCTION_END(memset) 139 129 140 #endif // !_BOOT_MODE -
src/system/kernel/arch/x86/arch_cpu.cpp
93 93 extern int memcpy_generic_end; 94 94 extern "C" void memset_generic(void* dest, int value, size_t count); 95 95 extern int memset_generic_end; 96 extern "C" int ffs_generic(int value); 97 extern int ffs_generic_end; 96 98 99 97 100 x86_optimized_functions gOptimizedFunctions = { 98 101 memcpy_generic, 99 102 &memcpy_generic_end, 100 103 memset_generic, 101 &memset_generic_end 104 &memset_generic_end, 105 ffs_generic, 106 &ffs_generic_end 102 107 }; 103 108 104 109 … … 660 665 fill_commpage_entry(COMMPAGE_ENTRY_X86_MEMSET, 661 666 (const void*)gOptimizedFunctions.memset, memsetLen); 662 667 668 size_t ffsLen = (addr_t)gOptimizedFunctions.ffs_end 669 - (addr_t)gOptimizedFunctions.ffs; 670 fill_commpage_entry(COMMPAGE_ENTRY_X86_FFS, 671 (const void*)gOptimizedFunctions.ffs, ffsLen); 672 663 673 // add the functions to the commpage image 664 674 image_id image = get_commpage_image(); 665 675 elf_add_memory_image_symbol(image, "commpage_memcpy", … … 668 678 elf_add_memory_image_symbol(image, "commpage_memset", 669 679 ((addr_t*)USER_COMMPAGE_ADDR)[COMMPAGE_ENTRY_X86_MEMSET], memsetLen, 670 680 B_SYMBOL_TYPE_TEXT); 681 elf_add_memory_image_symbol(image, "commpage_ffs", 682 ((addr_t*)USER_COMMPAGE_ADDR)[COMMPAGE_ENTRY_X86_FFS], ffsLen, 683 B_SYMBOL_TYPE_TEXT); 671 684 672 685 return B_OK; 673 686 } 674 687 675 676 688 void 677 689 i386_set_tss_and_kstack(addr_t kstack) 678 690 { -
src/system/kernel/arch/x86/asm_offsets.cpp
59 59 memcpy); 60 60 DEFINE_OFFSET_MACRO(X86_OPTIMIZED_FUNCTIONS, x86_optimized_functions, 61 61 memset); 62 DEFINE_OFFSET_MACRO(X86_OPTIMIZED_FUNCTIONS, x86_optimized_functions, 63 ffs); 64 62 65 } -
src/system/libroot/posix/string/Jamfile
4 4 bcmp.c 5 5 bcopy.c 6 6 bzero.c 7 ffs.cpp8 7 memccpy.c 9 8 memchr.c 10 9 memcmp.c -
src/system/libroot/posix/string/arch/ppc/Jamfile
7 7 MergeObject posix_string_arch_$(TARGET_ARCH).o : 8 8 memcpy.c 9 9 memset.c 10 ffs.c 10 11 ; -
src/system/libroot/posix/string/arch/m68k/Jamfile
7 7 MergeObject posix_string_arch_$(TARGET_ARCH).o : 8 8 arch_string.S 9 9 memset.c 10 ffs.c 10 11 ; -
src/system/libroot/posix/string/arch/x86/arch_string.S
16 16 FUNCTION(memset): 17 17 jmp *(USER_COMMPAGE_ADDR + COMMPAGE_ENTRY_X86_MEMSET * 4) 18 18 FUNCTION_END(memset) 19 20 FUNCTION(ffs): 21 jmp *(USER_COMMPAGE_ADDR + COMMPAGE_ENTRY_X86_FFS * 4) 22 FUNCTION_END(ffs) -
src/system/libroot/posix/string/arch/generic/ffs.c
1 /* 2 * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net. 3 * Distributed under the terms of the MIT License. 4 */ 5 6 #include <strings.h> 7 8 #if !defined(ARCH_x86) 9 // find first (least significant) set bit 10 int 11 ffs(int value) 12 { 13 if (!value) 14 return 0; 15 16 // ToDo: This can certainly be optimized (e.g. by binary search). Or not 17 // unlikely there's a single assembler instruction... 18 for (int i = 1; i <= (int)sizeof(value) * 8; i++, value >>= 1) { 19 if (value & 1) 20 return i; 21 } 22 23 // never gets here 24 return 0; 25 } 26 #endif -
src/system/libroot/posix/string/ffs.cpp
1 /*2 * Copyright 2005, Ingo Weinhold, bonefish@users.sf.net.3 * Distributed under the terms of the MIT License.4 */5 6 #include <strings.h>7 8 // find first (least significant) set bit9 int10 ffs(int value)11 {12 if (!value)13 return 0;14 15 // ToDo: This can certainly be optimized (e.g. by binary search). Or not16 // unlikely there's a single assembler instruction...17 for (int i = 1; i <= (int)sizeof(value) * 8; i++, value >>= 1) {18 if (value & 1)19 return i;20 }21 22 // never gets here23 return 0;24 } -
headers/private/kernel/arch/x86/arch_cpu.h
107 107 void* memcpy_end; 108 108 void (*memset)(void* dest, int value, size_t count); 109 109 void* memset_end; 110 int (*ffs)(int value); 111 void* ffs_end; 110 112 } x86_optimized_functions; 111 113 112 114 typedef struct x86_cpu_module_info { -
headers/private/system/arch/x86/arch_commpage_defs.h
12 12 #define COMMPAGE_ENTRY_X86_SYSCALL (COMMPAGE_ENTRY_FIRST_ARCH_SPECIFIC + 0) 13 13 #define COMMPAGE_ENTRY_X86_MEMCPY (COMMPAGE_ENTRY_FIRST_ARCH_SPECIFIC + 1) 14 14 #define COMMPAGE_ENTRY_X86_MEMSET (COMMPAGE_ENTRY_FIRST_ARCH_SPECIFIC + 2) 15 #define COMMPAGE_ENTRY_X86_FFS (COMMPAGE_ENTRY_FIRST_ARCH_SPECIFIC + 3) 15 16 16 17 #define ARCH_USER_COMMPAGE_ADDR (0xffff0000) 17 18