3.61 Conditional Data Transfer

★★

In Section 3.6.6, we examined the following code as candidate for the use of conditional data transfer:

long cread(long *xp) {
    return (xp ? *xp : 0);
}

We showed a trial implementation using a conditional move instruction but argued that it was not valid, since it could attempt to read from a null address.

Write a C function cread_alt that has the same behavior as cread, except that it can be complied to use conditional data transfer. When complied, the generated code should use a conditional move instruction rather than one of the jump instructions.

Code:

long cread_alt(long *xp) {
    return (!xp ? 0 : *xp);
}

Assembly code:

cread_alt:
    movl     $0, %eax
    testq    %rdi, %rdi
    cmovne   (%rdi), %rax

Last updated