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
Was this helpful?