<div dir="ltr"><div class="markdown-here-wrapper" style=""><p style="margin:0px 0px 1.2em!important">Hello all,</p>
<p style="margin:0px 0px 1.2em!important">I am working on adding atomics support to the AVR backend.</p>
<p style="margin:0px 0px 1.2em!important">Because the target can only have one core, it is sufficient to:</p>
<ul style="margin:1.2em 0px;padding-left:2em">
<li style="margin:0.5em 0px">Save the status register</li>
<li style="margin:0.5em 0px">Disable interrupts</li>
<li style="margin:0.5em 0px">Do the nonatomic LOAD/STORE/SWAP/ADD</li>
<li style="margin:0.5em 0px">Restore the status register</li>
</ul>
<p style="margin:0px 0px 1.2em!important">I’d really like to be able to do this at the IR level. What I want to do is write a custom lowering hook to convert <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ISD::ATOMIC_LOAD</code> into a standard <code style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248)">ISD::LOAD</code> with the save/restore/interrupt nodes glued to it.</p>
<p style="margin:0px 0px 1.2em!important">Here’s what I have so far:</p>
<pre style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;font-size:1em;line-height:1.2em;margin:1.2em 0px"><code class="hljs language-cpp" style="font-size:0.85em;font-family:Consolas,Inconsolata,Courier,monospace;margin:0px 0.15em;padding:0px 0.3em;white-space:pre-wrap;border:1px solid rgb(234,234,234);border-radius:3px;display:inline;background-color:rgb(248,248,248);white-space:pre;overflow:auto;border-radius:3px;border:1px solid rgb(204,204,204);padding:0.5em 0.7em;display:block!important;display:block;overflow-x:auto;padding:0.5em;color:rgb(51,51,51);background:rgb(248,248,248)">  <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Store `SREG`</span>
  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">auto</span> Save = DAG.getCopyFromReg(DAG.getEntryNode(), DL, AVR::SREG, MVT::i8);

  <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Disable interrupts (`clr` is equivalent to `bclr 7`).</span>
  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">auto</span> ClearInterrupts = DAG.getNode(AVRISD::BCLR, DL, MVT::Glue, DAG.getConstant(<span class="hljs-number" style="color:rgb(0,128,128)">7</span>, DL, MVT::i8));

  <span class="hljs-comment" style="color:rgb(153,153,136);font-style:italic">// Perform the nonatomic load.</span>
  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">auto</span> *Node = cast<AtomicSDNode>(AtomicOp.getNode());
  SDValue Load =  DAG.getExtLoad(ISD::EXTLOAD, SDLoc(AtomicOp), AtomicOp.getValueType(),
                                 Node->getChain(), Node->getBasePtr(),
                                 Node->getMemoryVT(), Node->getMemOperand());

  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">auto</span> Restore = DAG.getCopyToReg(DAG.getEntryNode(), DL, AVR::SREG, Save);

  <span class="hljs-keyword" style="color:rgb(51,51,51);font-weight:bold">return</span> Load;
</code></pre>
<p style="margin:0px 0px 1.2em!important">I can’t figure out how I can glue all these nodes together and return the nonatomic load.</p>
<p style="margin:0px 0px 1.2em!important">How can I do this?</p>
<p style="margin:0px 0px 1.2em!important">Cheers,<br>Dylan</p>
<div title="MDH:SGVsbG8gYWxsLDxkaXY+PGJyPjwvZGl2PjxkaXY+SSBhbSB3b3JraW5nIG9uIGFkZGluZyBhdG9t
aWNzIHN1cHBvcnQgdG8gdGhlIEFWUiBiYWNrZW5kLjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+
QmVjYXVzZSB0aGUgdGFyZ2V0IGNhbiBvbmx5IGhhdmUgb25lIGNvcmUsIGl0IGlzIHN1ZmZpY2ll
bnQgdG86PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4qIFNhdmUgdGhlIHN0YXR1cyByZWdpc3Rl
cjwvZGl2PjxkaXY+KiBEaXNhYmxlIGludGVycnVwdHM8L2Rpdj48ZGl2PiogRG8gdGhlIG5vbmF0
b21pYyBMT0FEL1NUT1JFL1NXQVAvQUREPC9kaXY+PGRpdj4qIFJlc3RvcmUgdGhlIHN0YXR1cyBy
ZWdpc3RlcjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+SSdkIHJlYWxseSBsaWtlIHRvIGJlIGFi
bGUgdG8gZG8gdGhpcyBhdCB0aGUgSVIgbGV2ZWwuIFdoYXQgSSB3YW50IHRvIGRvIGlzIHdyaXRl
IGEgY3VzdG9tIGxvd2VyaW5nIGhvb2sgdG8gY29udmVydCBgSVNEOjpBVE9NSUNfTE9BRGAgaW50
byBhIHN0YW5kYXJkIGBJU0Q6OkxPQURgIHdpdGggdGhlIHNhdmUvcmVzdG9yZS9pbnRlcnJ1cHQg
bm9kZXMgZ2x1ZWQgdG8gaXQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5IZXJlJ3Mgd2hhdCBJ
IGhhdmUgc28gZmFyOjwvZGl2PjxkaXY+PGJyPjwvZGl2PjxkaXY+YGBgIGNwcDwvZGl2PjxkaXY+
PGRpdj4mbmJzcDsgLy8gU3RvcmUgYFNSRUdgPC9kaXY+PGRpdj4mbmJzcDsgYXV0byBTYXZlID0g
REFHLmdldENvcHlGcm9tUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgREwsIEFWUjo6U1JFRywgTVZU
OjppOCk7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mbmJzcDsgLy8gRGlzYWJsZSBpbnRlcnJ1
cHRzIChgY2xyYCBpcyBlcXVpdmFsZW50IHRvIGBiY2xyIDdgKS48L2Rpdj48ZGl2PiZuYnNwOyBh
dXRvIENsZWFySW50ZXJydXB0cyA9IERBRy5nZXROb2RlKEFWUklTRDo6QkNMUiwgREwsIE1WVDo6
R2x1ZSwgREFHLmdldENvbnN0YW50KDcsIERMLCBNVlQ6Omk4KSk7PC9kaXY+PGRpdj48YnI+PC9k
aXY+PGRpdj4mbmJzcDsgLy8gUGVyZm9ybSB0aGUgbm9uYXRvbWljIGxvYWQuPC9kaXY+PGRpdj4m
bmJzcDsgYXV0byAqTm9kZSA9IGNhc3QmbHQ7QXRvbWljU0ROb2RlJmd0OyhBdG9taWNPcC5nZXRO
b2RlKCkpOzwvZGl2PjxkaXY+Jm5ic3A7IFNEVmFsdWUgTG9hZCA9ICZuYnNwO0RBRy5nZXRFeHRM
b2FkKElTRDo6RVhUTE9BRCwgU0RMb2MoQXRvbWljT3ApLCBBdG9taWNPcC5nZXRWYWx1ZVR5cGUo
KSw8L2Rpdj48ZGl2PiZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5i
c3A7ICZuYnNwOyAmbmJzcDtOb2RlLSZndDtnZXRDaGFpbigpLCBOb2RlLSZndDtnZXRCYXNlUHRy
KCksPC9kaXY+PGRpdj4mbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAm
bmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZuYnNwOyAmbmJzcDsgJm5ic3A7ICZu
YnNwOyAmbmJzcDsgJm5ic3A7Tm9kZS0mZ3Q7Z2V0TWVtb3J5VlQoKSwgTm9kZS0mZ3Q7Z2V0TWVt
T3BlcmFuZCgpKTs8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PiZuYnNwOyBhdXRvIFJlc3RvcmUg
PSBEQUcuZ2V0Q29weVRvUmVnKERBRy5nZXRFbnRyeU5vZGUoKSwgREwsIEFWUjo6U1JFRywgU2F2
ZSk7PC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj4mbmJzcDsgcmV0dXJuIExvYWQ7PC9kaXY+PC9k
aXY+PGRpdj5gYGA8L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkkgY2FuJ3QgZmlndXJlIG91dCBo
b3cgSSBjYW4gZ2x1ZSBhbGwgdGhlc2Ugbm9kZXMgdG9nZXRoZXIgYW5kIHJldHVybiB0aGUgbm9u
YXRvbWljIGxvYWQuPC9kaXY+PGRpdj48YnI+PC9kaXY+PGRpdj5Ib3cgY2FuIEkgZG8gdGhpcz88
L2Rpdj48ZGl2Pjxicj48L2Rpdj48ZGl2PkNoZWVycyw8L2Rpdj48ZGl2PkR5bGFuPC9kaXY+" style="height:0;width:0;max-height:0;max-width:0;overflow:hidden;font-size:0em;padding:0;margin:0">​</div></div></div>