Skip to content

Instantly share code, notes, and snippets.

@overminder
Last active December 14, 2015 02:18
Show Gist options
  • Save overminder/5012090 to your computer and use it in GitHub Desktop.
Save overminder/5012090 to your computer and use it in GitHub Desktop.
signed/unsigned comparison

Run demo

make && ./main

Explaination

见cmpui.S

#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 $@
@overminder
Copy link
Author

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

@daizuozhuo
Copy link

老衲要嘿嘿了

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment