<html><head></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; "><br><div><div>On Feb 22, 2012, at 1:22 PM, Chandler Carruth wrote:</div><br class="Apple-interchange-newline"><blockquote type="cite"><div class="gmail_quote">On Wed, Feb 22, 2012 at 1:11 PM, Talin <span dir="ltr"><<a href="mailto:viridia@gmail.com">viridia@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0.8ex; border-left-width: 1px; border-left-color: rgb(204, 204, 204); border-left-style: solid; padding-left: 1ex; position: static; z-index: auto; ">
So if we're going to be using memcpy</blockquote></div><br><div>Don't misunderstand -- there will be no actual memcpy in the generated code. This is a mechanism for reading underlying storage with well defined behavior, it'll disappear in the optimizer.</div></blockquote><div><br></div><div><div>$ cat ur.c </div><div>unsigned unaligned_read(const void *p) {</div><div>  unsigned x;</div><div>  memcpy(&x, p, sizeof(x));</div><div>  return x;</div><div>}</div><div><div><br></div><div>$ clang -w -O ur.c -S -emit-llvm -o-</div><div>define i32 @unaligned_read(i8* nocapture %p) nounwind uwtable readonly ssp {</div><div>entry:</div><div>  %0 = bitcast i8* %p to i32*</div><div>  %srcval = load i32* %0, align 1</div><div>  ret i32 %srcval</div><div>}</div></div><div><br></div><div>The backends will know what to do with the unaligned load:</div><div><br></div><div><div>$ clang -w -O ur.c -S -o- -arch armv7</div><div>_unaligned_read:</div><div><span class="Apple-tab-span" style="white-space:pre">      </span>ldr<span class="Apple-tab-span" style="white-space:pre"> </span>r0, [r0]</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>bx<span class="Apple-tab-span" style="white-space:pre">  </span>lr</div></div><div><br></div><div><div>$ clang -w -O ur.c -S -o- -arch armv5</div><div>_unaligned_read:</div><div><span class="Apple-tab-span" style="white-space:pre">        </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r1, [r0]</div><div><span class="Apple-tab-span" style="white-space:pre">     </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r2, [r0, #1]</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r3, [r0, #2]</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>ldrb<span class="Apple-tab-span" style="white-space:pre">        </span>r0, [r0, #3]</div><div><span class="Apple-tab-span" style="white-space:pre"> </span>orr<span class="Apple-tab-span" style="white-space:pre"> </span>r0, r3, r0, lsl #8</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>orr<span class="Apple-tab-span" style="white-space:pre"> </span>r1, r1, r2, lsl #8</div><div><span class="Apple-tab-span" style="white-space:pre">   </span>orr<span class="Apple-tab-span" style="white-space:pre"> </span>r0, r1, r0, lsl #16</div><div><span class="Apple-tab-span" style="white-space:pre">  </span>bx<span class="Apple-tab-span" style="white-space:pre">  </span>lr</div></div><div><br></div><div>/jakob</div><div><br></div></div></div></body></html>