---
description: ★★
---

# 3.61 Conditional Data Transfer

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

```c
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:

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

Assembly code:

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

