add achitecture-dependent assembly to build, implement hardware byte-swapping
This commit is contained in:
parent
579f9281e0
commit
0b610097b4
4 changed files with 35 additions and 22 deletions
|
|
@ -1,5 +1,5 @@
|
||||||
cmake_minimum_required(VERSION 3.10)
|
cmake_minimum_required(VERSION 3.10)
|
||||||
project(cutil)
|
project(cutil C ASM)
|
||||||
|
|
||||||
set(HEADERS
|
set(HEADERS
|
||||||
cutypes.h
|
cutypes.h
|
||||||
|
|
@ -20,7 +20,9 @@ set(SOURCES
|
||||||
struct.c
|
struct.c
|
||||||
)
|
)
|
||||||
|
|
||||||
add_library(cutil STATIC ${SOURCES} ${HEADERS})
|
add_library(cutil STATIC ${SOURCES} ${HEADERS}
|
||||||
|
"arch/${CMAKE_SYSTEM_PROCESSOR}.S"
|
||||||
|
)
|
||||||
|
|
||||||
add_executable(test test.c)
|
add_executable(test test.c)
|
||||||
target_link_libraries(test cutil)
|
target_link_libraries(test cutil)
|
||||||
21
arch/x86_64.S
Normal file
21
arch/x86_64.S
Normal file
|
|
@ -0,0 +1,21 @@
|
||||||
|
.globl hw_bswap16
|
||||||
|
.globl hw_bswap32
|
||||||
|
.globl hw_bswap64
|
||||||
|
|
||||||
|
.text
|
||||||
|
|
||||||
|
hw_bswap16:
|
||||||
|
mov %edi, %eax
|
||||||
|
xchg %al, %ah
|
||||||
|
ret
|
||||||
|
|
||||||
|
hw_bswap32:
|
||||||
|
mov %edi, %eax
|
||||||
|
bswap %eax
|
||||||
|
ret
|
||||||
|
|
||||||
|
hw_bswap64:
|
||||||
|
mov %rdi, %rax
|
||||||
|
bswap %rax
|
||||||
|
ret
|
||||||
|
|
||||||
25
endian.c
25
endian.c
|
|
@ -46,29 +46,18 @@ static uint64_t sw_bswap64(uint64_t val)
|
||||||
}
|
}
|
||||||
|
|
||||||
#if (CU_ARCH == x86_32)
|
#if (CU_ARCH == x86_32)
|
||||||
static uint32_t hw_bswap32(uint32_t val)
|
extern uint16_t hw_bswap16(uint16_t val);
|
||||||
{
|
extern uint32_t hw_bswap32(uint32_t val);
|
||||||
__asm__ ("bswap %0" : "=r" (val) : "r" (val));
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
bswap16_t cu_bswap16 = sw_bswap16;
|
bswap16_t cu_bswap16 = hw_bswap16;
|
||||||
bswap32_t cu_bswap32 = hw_bswap32;
|
bswap32_t cu_bswap32 = hw_bswap32;
|
||||||
bswap64_t cu_bswap64 = sw_bswap64;
|
bswap64_t cu_bswap64 = sw_bswap64;
|
||||||
#elif (CU_ARCH == x86_64)
|
#elif (CU_ARCH == x86_64)
|
||||||
static uint32_t hw_bswap32(uint32_t val)
|
extern uint16_t hw_bswap16(uint16_t val);
|
||||||
{
|
extern uint32_t hw_bswap32(uint32_t val);
|
||||||
__asm__ ("bswap %0" : "=r" (val) : "r" (val));
|
extern uint64_t hw_bswap64(uint64_t val);
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static uint64_t hw_bswap64(uint64_t val)
|
bswap16_t cu_bswap16 = hw_bswap16;
|
||||||
{
|
|
||||||
__asm__ ("bswap %0" : "=r" (val) : "r" (val));
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
bswap16_t cu_bswap16 = sw_bswap16;
|
|
||||||
bswap32_t cu_bswap32 = hw_bswap32;
|
bswap32_t cu_bswap32 = hw_bswap32;
|
||||||
bswap64_t cu_bswap64 = hw_bswap64;
|
bswap64_t cu_bswap64 = hw_bswap64;
|
||||||
#else
|
#else
|
||||||
|
|
|
||||||
5
test.c
5
test.c
|
|
@ -111,8 +111,9 @@ int main()
|
||||||
|
|
||||||
printf("[endian]\n");
|
printf("[endian]\n");
|
||||||
printf("cutil_endian\t%u\n", cu_endian);
|
printf("cutil_endian\t%u\n", cu_endian);
|
||||||
printf("%x\t%x\n", 0x12345678, l32toh32(0x12345678));
|
printf("%x\t%x\n", 0x1234, cu_bswap16(0x1234));
|
||||||
printf("%lx\t%lx\n", 0x12345678abcd8765, h64ton64(0x12345678abcd8765));
|
printf("%x\t%x\n", 0x12345678, cu_bswap32(0x12345678));
|
||||||
|
printf("%lx\t%lx\n", 0x12345678abcd8765, cu_bswap64(0x12345678abcd8765));
|
||||||
|
|
||||||
printf("[struct]\n");
|
printf("[struct]\n");
|
||||||
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 4, &test));
|
printf("value_offset\t%u\n", value_offset(CU_STRUCT(test_s), 4, &test));
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue