<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Aug 19, 2016, at 6:22 PM, Slava Pestov via swift-dev <<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Aug 19, 2016, at 2:04 PM, Jordan Rose via swift-dev <<a href="mailto:swift-dev@swift.org" class="">swift-dev@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">We have an old Radar about this, <a href="rdar://problem/16754935" class="">rdar://problem/16754935</a>. It's probably just a case we're missing in enum layout. My guess is that it's because we don't have a whole spare bit in a RawPointer, but we should be able to pick some up either from alignment or from ABI knowledge.</div><div class=""><br class=""></div><div class="">Jordan</div></div></div></blockquote><div class=""><br class=""></div><div class="">Hi Jordan,</div><div class=""><br class=""></div><div class="">I asked about a related issue, which is that RawPointer only has 1 extra inhabitant instead of 4096. You guys said you wanted non-zero integers to round-trip through RawPointer. It seems that declaring the high bits of a RawPointer as spare bits would cause the same problem as allowing more extra inhabitants.</div><div class=""><br class=""></div><div class="">Also I don’t think alignment is the answer here, RawPointer should be able to represent a char *, where you have no low spare bits.</div></div></div></div></blockquote><br class=""></div><div>On 64-bit systems, you can steal the top bits of pointers for other uses (but the value needs to be sign extended or masked out) since virtual address space is more limited than full 64-bits.</div><div><br class=""></div><div>ARM64 even has a hardware feature for this, called “top byte ignored” (TBI) which means you don’t even have to do the masking.</div><div><br class=""></div><div>-Chris</div><br class=""></body></html>