Heikki Linnakangas <hlinn...@iki.fi> writes: > On 08/31/2016 02:38 PM, Tom Lane wrote: >> I wonder whether there is a compiler-dependent way of avoiding the union >> trick ... or maybe gcc is already smart enough that it doesn't matter?
> It seems to compile into a single instruction, so it can't get any > better from a performance point of view. Yeah, confirmed here. On my not-real-new gcc (version 4.4.7, which ships with RHEL6), these test functions: Datum compare_int8(PG_FUNCTION_ARGS) { int64 x = PG_GETARG_INT64(0); int64 y = PG_GETARG_INT64(1); PG_RETURN_BOOL(x < y); } Datum compare_float8(PG_FUNCTION_ARGS) { double x = PG_GETARG_FLOAT8(0); double y = PG_GETARG_FLOAT8(1); PG_RETURN_BOOL(x < y); } compile into this (at -O2): compare_int8: .cfi_startproc movq 40(%rdi), %rax cmpq %rax, 32(%rdi) setl %al movzbl %al, %eax ret .cfi_endproc compare_float8: .cfi_startproc movsd 40(%rdi), %xmm0 xorl %eax, %eax ucomisd 32(%rdi), %xmm0 seta %al ret .cfi_endproc (Not sure why the compiler does the widening of the comparison result differently, but it doesn't look like it matters.) Before this patch, that looked like: compare_float8: .cfi_startproc pushq %rbx .cfi_def_cfa_offset 16 .cfi_offset 3, -16 movq %rdi, %rbx subq $16, %rsp .cfi_def_cfa_offset 32 movq 32(%rdi), %rdi call DatumGetFloat8 movq 40(%rbx), %rdi movsd %xmm0, 8(%rsp) call DatumGetFloat8 xorl %eax, %eax ucomisd 8(%rsp), %xmm0 seta %al addq $16, %rsp .cfi_def_cfa_offset 16 popq %rbx .cfi_def_cfa_offset 8 ret .cfi_endproc Nice. regards, tom lane -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers