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
>>>>>>>
>>>>>>