make && ./main
见cmpui.S
*.o | |
main |
#include <inttypes.h> | |
int | |
lt_u64_i64(uint64_t u, int64_t i) { | |
return u < i; | |
} | |
int | |
lt_i64_u64(int64_t i, uint64_t u) { | |
return i < u; | |
} | |
int | |
lt_i64_i64(int64_t i1, int64_t i2) { | |
return i1 < i2; | |
} | |
int | |
lt_u64_u64(uint64_t u1, uint64_t u2) { | |
return u1 < u2; | |
} |
.file "cmpui.c" | |
.text | |
.p2align 4,,15 | |
.globl lt_u64_i64 | |
.type lt_u64_i64, @function | |
lt_u64_i64: | |
.LFB4: | |
.cfi_startproc | |
xorl %eax, %eax | |
cmpq %rdi, %rsi | |
seta %al | |
ret | |
.cfi_endproc | |
.LFE4: | |
.size lt_u64_i64, .-lt_u64_i64 | |
.p2align 4,,15 | |
.globl lt_i64_u64 | |
.type lt_i64_u64, @function | |
lt_i64_u64: | |
.LFB5: | |
.cfi_startproc | |
xorl %eax, %eax | |
cmpq %rsi, %rdi | |
setb %al | |
ret | |
.cfi_endproc | |
.LFE5: | |
.size lt_i64_u64, .-lt_i64_u64 | |
.p2align 4,,15 | |
.globl lt_i64_i64 | |
.type lt_i64_i64, @function | |
lt_i64_i64: | |
.LFB6: | |
.cfi_startproc | |
xorl %eax, %eax | |
cmpq %rsi, %rdi | |
setl %al | |
ret | |
.cfi_endproc | |
.LFE6: | |
.size lt_i64_i64, .-lt_i64_i64 | |
.p2align 4,,15 | |
.globl lt_u64_u64 | |
.type lt_u64_u64, @function | |
lt_u64_u64: | |
.LFB7: | |
.cfi_startproc | |
xorl %eax, %eax | |
cmpq %rsi, %rdi | |
setb %al | |
ret | |
.cfi_endproc | |
.LFE7: | |
.size lt_u64_u64, .-lt_u64_u64 | |
.ident "GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3" | |
.section .note.GNU-stack,"",@progbits |
#include <stdio.h> | |
#include <inttypes.h> | |
extern int lt_u64_i64(uint64_t u, int64_t i); | |
extern int lt_i64_u64(int64_t i, uint64_t u); | |
extern int lt_i64_i64(int64_t i1, int64_t i2); | |
extern int lt_u64_u64(uint64_t u1, uint64_t u2); | |
#define PRN_BIN_OP(func, lhs, rhs, fmt) \ | |
printf(#func "(" #lhs "," #rhs ") = " fmt "\n", func(lhs, rhs)) | |
int | |
main() { | |
PRN_BIN_OP(lt_u64_i64, 123, -123, "%d"); | |
PRN_BIN_OP(lt_i64_u64, -1, 123, "%d"); | |
PRN_BIN_OP(lt_i64_i64, -1, -2, "%d"); | |
PRN_BIN_OP(lt_u64_u64, 1, 2, "%d"); | |
return 0; | |
} | |
all : main cmpui.S | |
main : main.o cmpui.o | |
%.S : %.c | |
$(CC) -c -S $< -O2 -o $@ |
在cmpui.S:11:lt_u64_i64,这里用的是seta,即为set above,是unsigned comparison。
在cmpui.S:37:lt_i64_i64,这里用的是setl,即为set less than,是signed comparison。
更多的解释见c-faq。