Thanks Fengyang
On Saturday, October 8, 2016 at 12:39:42 AM UTC-3, Fengyang Wang wrote: > > As Jussi Piitulainen noted, the ^ operator is backwards, so you need to > wrap it around a function. > > On Friday, October 7, 2016 at 10:05:34 AM UTC-4, Kevin Liu wrote: >> >> *julia> **@code_native(b^a)* >> >> .section __TEXT,__text,regular,pure_instructions >> >> Filename: bool.jl >> >> Source line: 39 >> >> pushq %rbp >> >> movq %rsp, %rbp >> >> Source line: 39 >> >> xorb $1, %sil >> >> orb %dil, %sil >> >> movb %sil, %al >> >> popq %rbp >> >> ret >> >> *julia> **@code_native(a<=b)* >> >> .section __TEXT,__text,regular,pure_instructions >> >> Filename: bool.jl >> >> Source line: 29 >> >> pushq %rbp >> >> movq %rsp, %rbp >> >> Source line: 29 >> >> xorb $1, %dil >> >> orb %sil, %dil >> >> movb %dil, %al >> >> popq %rbp >> >> ret >> >> *julia> **@code_native(ifelse(a,b,true))* >> >> .section __TEXT,__text,regular,pure_instructions >> >> Filename: operators.jl >> >> Source line: 48 >> >> pushq %rbp >> >> movq %rsp, %rbp >> >> testb $1, %dil >> >> Source line: 48 >> >> jne L17 >> >> movb %dl, %sil >> >> L17: movb %sil, %al >> >> popq %rbp >> >> ret >> >> >> >> On Friday, October 7, 2016 at 10:58:34 AM UTC-3, Kevin Liu wrote: >>> >>> *julia> **@code_llvm(b^a)* >>> >>> >>> define i1 @"julia_^_21646"(i1, i1) { >>> >>> top: >>> >>> %2 = xor i1 %1, true >>> >>> %3 = or i1 %0, %2 >>> >>> ret i1 %3 >>> >>> } >>> >>> On Friday, October 7, 2016 at 10:56:26 AM UTC-3, Kevin Liu wrote: >>>> >>>> Sorry, no need, I got this >>>> >>>> *julia> **@code_llvm(a<=b)* >>>> >>>> >>>> define i1 @"julia_<=_21637"(i1, i1) { >>>> >>>> top: >>>> >>>> %2 = xor i1 %0, true >>>> >>>> %3 = or i1 %1, %2 >>>> >>>> ret i1 %3 >>>> >>>> } >>>> >>>> >>>> *julia> **@code_llvm(ifelse(a,b,true))* >>>> >>>> >>>> define i1 @julia_ifelse_21636(i1, i1, i1) { >>>> >>>> top: >>>> >>>> %3 = select i1 %0, i1 %1, i1 %2 >>>> >>>> ret i1 %3 >>>> >>>> } >>>> >>>> >>>> How do you read this output? >>>> >>>> On Friday, October 7, 2016 at 10:50:57 AM UTC-3, Kevin Liu wrote: >>>>> >>>>> Jeffrey, can you show the expression you put inside @code_llvm() and >>>>> @code_native() for evaluation? >>>>> >>>>> On Friday, October 7, 2016 at 2:26:56 AM UTC-3, Jeffrey Sarnoff wrote: >>>>>> >>>>>> Hi Jussi, >>>>>> >>>>>> Your version compiles down more neatly than the ifelse version. On my >>>>>> system, BenchmarkTools gives nearly identical results; I don't know why, >>>>>> but the ifelse version is consistently a smidge faster (~%2, relative >>>>>> speed). Here is the llvm code and local native code for each, your >>>>>> version >>>>>> looks more tidy. >>>>>> >>>>>> >>>>>> ``` >>>>>> implies(p::Bool, q::Bool) = (p <= q) implies(p::Bool, >>>>>> q::Bool) = ifelse( p, q, true ) >>>>>> >>>>>> # llvm >>>>>> >>>>>> %2 = xor i8 %0, 1 %2 = and i8 %0, 1 >>>>>> %3 = or i8 %2, %1 %3 = icmp eq i8 >>>>>> %2, 0 >>>>>> ret i8 %3 %4 = select i1 %3, >>>>>> i8 1, i8 %1 >>>>>> ret i8 %3 >>>>>> >>>>>> # native with some common code removed >>>>>> >>>>>> xorb $1, %dil testb $1, %dil >>>>>> orb %sil, %dil movb $1, %al >>>>>> movb %dil, %al je L15 >>>>>> popq %rbp movb %sil, %al >>>>>> retq L15: popq %rbp >>>>>> retq >>>>>> ``` >>>>>> >>>>>> >>>>>> >>>>>> >>>>>> On Friday, October 7, 2016 at 12:22:23 AM UTC-4, Jussi Piitulainen >>>>>> wrote: >>>>>>> >>>>>>> >>>>>>> implies(p::Bool, q::Bool) = p <= q >>>>>>> >>>>>>> >>>>>>> >>>>>>> torstai 6. lokakuuta 2016 19.10.51 UTC+3 Kevin Liu kirjoitti: >>>>>>>> >>>>>>>> How is an implication represented in Julia? >>>>>>>> >>>>>>>> >>>>>>>> https://en.wikipedia.org/wiki/Material_conditional#Definitions_of_the_material_conditional >>>>>>>> >>>>>>>