> For the complete documentation index, see [llms.txt](https://valineliu.gitbook.io/deuterium-wiki/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://valineliu.gitbook.io/deuterium-wiki/reading/cs-jing-dian-shu-ji/csapp-3e-homework-solution/3.-machine-level-representation-of-programs/3.61-conditional-data-transfer.md).

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