ÿþ<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta http-equiv=Content-Type content="text/html; charset=unicode"> <meta name=ProgId content=Word.Document> <meta name=Generator content="Microsoft Word 11"> <meta name=Originator content="Microsoft Word 11"> <link rel=File-List href="lec6%20-%20Control%20Flow_files/filelist.xml"> <link rel=Edit-Time-Data href="lec6%20-%20Control%20Flow_files/editdata.mso"> <!--[if !mso]> <style> v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VML);} .shape {behavior:url(#default#VML);} </style> <![endif]--> <title>Lecture 2</title> <!--[if gte mso 9]><xml> <o:DocumentProperties> <o:Author>Name</o:Author> <o:LastAuthor>Owner</o:LastAuthor> <o:Revision>142</o:Revision> <o:TotalTime>394</o:TotalTime> <o:Created>2005-01-01T01:34:00Z</o:Created> <o:LastSaved>2009-03-04T16:55:00Z</o:LastSaved> <o:Pages>2</o:Pages> <o:Words>1374</o:Words> <o:Characters>7836</o:Characters> <o:Company>Organization</o:Company> <o:Lines>65</o:Lines> <o:Paragraphs>18</o:Paragraphs> <o:CharactersWithSpaces>9192</o:CharactersWithSpaces> <o:Version>11.9999</o:Version> </o:DocumentProperties> </xml><![endif]--><!--[if gte mso 9]><xml> <w:WordDocument> <w:Zoom>BestFit</w:Zoom> <w:SpellingState>Clean</w:SpellingState> <w:GrammarState>Clean</w:GrammarState> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> </w:Compatibility> <w:BrowserLevel>MicrosoftInternetExplorer4</w:BrowserLevel> </w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" LatentStyleCount="156"> </w:LatentStyles> </xml><![endif]--> <style> <!-- /* Font Definitions */ @font-face {font-family:Wingdings; panose-1:5 0 0 0 0 0 0 0 0 0; mso-font-charset:2; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:0 268435456 0 0 -2147483648 0;} @font-face {font-family:Batang; panose-1:2 3 6 0 0 1 1 1 1 1; mso-font-alt:¼ÕÐ; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} @font-face {font-family:"\@Batang"; panose-1:0 0 0 0 0 0 0 0 0 0; mso-font-charset:129; mso-generic-font-family:auto; mso-font-format:other; mso-font-pitch:fixed; mso-font-signature:1 151388160 16 0 524288 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0pt; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:Batang;} p.MsoPlainText, li.MsoPlainText, div.MsoPlainText {margin:0pt; margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Courier New"; mso-fareast-font-family:Batang;} span.SpellE {mso-style-name:""; mso-spl-e:yes;} span.GramE {mso-style-name:""; mso-gram-e:yes;} @page Section1 {size:612.0pt 792.0pt; margin:72.0pt 65.95pt 72.0pt 65.95pt; mso-header-margin:36.0pt; mso-footer-margin:36.0pt; mso-paper-source:0;} div.Section1 {page:Section1;} --> </style> <!--[if gte mso 10]> <style> /* Style Definitions */ table.MsoNormalTable {mso-style-name:"Table Normal"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; mso-style-noshow:yes; mso-style-parent:""; mso-padding-alt:0pt 5.4pt 0pt 5.4pt; mso-para-margin:0pt; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} table.MsoTableGrid {mso-style-name:"Table Grid"; mso-tstyle-rowband-size:0; mso-tstyle-colband-size:0; border:solid windowtext 1.0pt; mso-border-alt:solid windowtext .5pt; mso-padding-alt:0pt 5.4pt 0pt 5.4pt; mso-border-insideh:.5pt solid windowtext; mso-border-insidev:.5pt solid windowtext; mso-para-margin:0pt; mso-para-margin-bottom:.0001pt; mso-pagination:widow-orphan; font-size:10.0pt; font-family:"Times New Roman"; mso-ansi-language:#0400; mso-fareast-language:#0400; mso-bidi-language:#0400;} </style> <![endif]--><!--[if gte mso 9]><xml> <o:shapedefaults v:ext="edit" spidmax="12290"> <o:colormenu v:ext="edit" strokecolor="none"/> </o:shapedefaults></xml><![endif]--><!--[if gte mso 9]><xml> <o:shapelayout v:ext="edit"> <o:idmap v:ext="edit" data="1"/> </o:shapelayout></xml><![endif]--> </head> <body lang=EN-US style='tab-interval:36.0pt'> <div class=Section1> <p class=MsoNormal>Lecture 6</p> <p class=MsoNormal>Andreas <span class=SpellE>Moshovos</span></p> <p class=MsoNormal>Spring 2007</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>Simple Control Flow<o:p></o:p></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><o:p>&nbsp;</o:p></b></p> <p class=MsoNormal>We have seen how  straight-line instruction sequencing works. Let s us now see how the processor can implement simple control-flow (instruction sequencing) structures such as the if-then-else. Let s use the following pseudo-C code as a starting point:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoPlainText>unsigned <span class=SpellE>int</span> a = 0x00000000;</p> <p class=MsoPlainText>unsigned <span class=SpellE>int</span> b = 0x11223344;</p> <p class=MsoPlainText>unsigned <span class=SpellE>int</span> c = 0x22334455;</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText>if (b == 0) </p> <p class=MsoPlainText>then a = b + c;</p> <p class=MsoPlainText>else a = b  c;</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText>An implementation of this program in assembly is as follows:</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>.section .data</p> <p class=MsoPlainText><span class=SpellE>va</span>:<span style='mso-tab-count: 1'>   </span>.long 0x0</p> <p class=MsoPlainText><span class=SpellE>vb</span>:<span style='mso-tab-count: 1'>   </span>.long 0x11223344</p> <p class=MsoPlainText><span class=SpellE>vc</span>:<span style='mso-tab-count: 1'>   </span>.long 0x55667788</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>.section .text</p> <p class=MsoPlainText>main:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>movia</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r9, r0, then<o:p></o:p></b></p> <p class=MsoPlainText>else:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'> r10, 8(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='color:maroon;mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span style='color:maroon'>sub<span style='mso-tab-count:1'>   </span>r8, r9, r10<o:p></o:p></span></b></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>stwio</span></span><span lang=FR style='mso-ansi-language:FR'> r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r0, r0, after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'> r10, 8(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='color:maroon;mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span style='color:maroon'>add<span style='mso-tab-count:1'>   </span>r8, r9, r10<o:p></o:p></span></b></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, 0(r11)</p> <p class=MsoPlainText><span style='mso-spacerun:yes'> </span>after:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>There are <span class=GramE>a two</span> new instructions here. SUB is for subtraction. The other is  <span class=SpellE>beq</span> which has the general form:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span><span class=SpellE>beq</span> <span class=SpellE>rX</span>, <span class=SpellE>rY</span>, label</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>B is for branch and <span class=SpellE>eq</span> is the  equals condition. This instruction changes the execution flow depending on whether the condition is met.</p> <p class=MsoNormal>It operation <span class=GramE>is:</span> <span style='mso-tab-count:1'>            </span><i style='mso-bidi-font-style:normal'>Compare the values of registers <span class=SpellE>rX</span> and <span class=SpellE>rY</span> and if the condition is TRUE then PC = Destination. </i>When the branch changes the PC we call it a <i style='mso-bidi-font-style:normal'>taken </i>branch, otherwise we call it a <i style='mso-bidi-font-style:normal'>non-taken </i>branch. Non-taken branches <i style='mso-bidi-font-style:normal'>fall-through </i>to the next instruction in memory. In the case of NIOS II, this amounts to updating PC with PC + 4. This is because all NIOS II instructions are four byte long.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Returning to our previous example<span class=GramE>,<span style='mso-spacerun:yes'>  </span>the</span> following flow diagram shows the various control flow sequences possible:</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoNormal><!--[if mso & !supportInlineShapes & supportFields]><span style='mso-element:field-begin;mso-field-lock:yes'></span><span style='mso-spacerun:yes'> </span>SHAPE <span style='mso-spacerun:yes'> </span>\* MERGEFORMAT <span style='mso-element:field-separator'></span><![endif]--><!--[if gte vml 1]><v:group id="_x0000_s1085" editas="canvas" style='width:480.1pt;height:288.05pt; mso-position-horizontal-relative:char;mso-position-vertical-relative:line' coordorigin="3052,4117" coordsize="7200,4320"> <o:lock v:ext="edit" aspectratio="t"/> <v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"> <v:stroke joinstyle="miter"/> <v:formulas> <v:f eqn="if lineDrawn pixelLineWidth 0"/> <v:f eqn="sum @0 1 0"/> <v:f eqn="sum 0 0 @1"/> <v:f eqn="prod @2 1 2"/> <v:f eqn="prod @3 21600 pixelWidth"/> <v:f eqn="prod @3 21600 pixelHeight"/> <v:f eqn="sum @0 0 1"/> <v:f eqn="prod @6 1 2"/> <v:f eqn="prod @7 21600 pixelWidth"/> <v:f eqn="sum @8 21600 0"/> <v:f eqn="prod @7 21600 pixelHeight"/> <v:f eqn="sum @10 21600 0"/> </v:formulas> <v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"/> <o:lock v:ext="edit" aspectratio="t"/> </v:shapetype><v:shape id="_x0000_s1086" type="#_x0000_t75" style='position:absolute; left:3052;top:4117;width:7200;height:4320' o:preferrelative="f"> <v:fill o:detectmouseclick="t"/> <v:path o:extrusionok="t" o:connecttype="none"/> </v:shape><v:rect id="_x0000_s1087" style='position:absolute;left:5009;top:4376; width:3386;height:708'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>movhi</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r11, %hiadj(va)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, %lo(va)+4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r9, r0, then<o:p></o:p></b></p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1088" style='position:absolute;left:5009;top:5298; width:3386;height:979'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText>else:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span> r10, %<span class=GramE>lo(</span>va)+8(r11)</p> <p class=MsoPlainText><span style='color:maroon'><span style='mso-tab-count: 1'>      </span>sub<span style='mso-tab-count:1'>   </span>r8, r9, r10<o:p></o:p></span></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, %<span class=GramE>lo(</span>va)(r11)</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r0, r0, after<o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1089" style='position:absolute;left:5009;top:6513; width:3386;height:862'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span> r10, %<span class=GramE>lo(</span>va)+8(r11)</p> <p class=MsoPlainText><span style='color:maroon'><span style='mso-tab-count: 1'>      </span>add<span style='mso-tab-count:1'>   </span>r8, r9, r10<o:p></o:p></span></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, %<span class=GramE>lo(</span>va)(r11)</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1090" style='position:absolute;left:5009;top:7692; width:2497;height:508'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText>after</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:line id="_x0000_s1091" style='position:absolute' from="6224,5084" to="6224,5298"> <v:stroke endarrow="block"/> </v:line><v:line id="_x0000_s1092" style='position:absolute;flip:x' from="4694,5186" to="6224,5186"/> <v:line id="_x0000_s1093" style='position:absolute' from="4694,5186" to="4695,6378"/> <v:line id="_x0000_s1094" style='position:absolute' from="6293,7375" to="6303,7692"> <v:stroke endarrow="block"/> </v:line><v:line id="_x0000_s1095" style='position:absolute' from="6224,6277" to="6224,6378"/> <v:line id="_x0000_s1096" style='position:absolute' from="6224,6378" to="9059,6379"/> <v:line id="_x0000_s1097" style='position:absolute' from="9058,6378" to="9059,7503"/> <v:line id="_x0000_s1098" style='position:absolute;flip:x' from="6314,7503" to="9058,7504"/> <v:line id="_x0000_s1099" style='position:absolute' from="4694,6378" to="6033,6378"/> <v:line id="_x0000_s1100" style='position:absolute' from="6033,6378" to="6033,6513"> <v:stroke endarrow="block"/> </v:line><v:shapetype id="_x0000_t202" coordsize="21600,21600" o:spt="202" path="m,l,21600r21600,l21600,xe"> <v:stroke joinstyle="miter"/> <v:path gradientshapeok="t" o:connecttype="rect"/> </v:shapetype><v:shape id="_x0000_s1101" type="#_x0000_t202" style='position:absolute; left:4694;top:4667;width:428;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>A<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1102" type="#_x0000_t202" style='position:absolute; left:4695;top:5611;width:427;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>B<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1103" type="#_x0000_t202" style='position:absolute; left:4638;top:6724;width:427;height:340' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>C<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1104" type="#_x0000_t202" style='position:absolute; left:4695;top:7692;width:427;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>D<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><w:wrap type="none"/> <w:anchorlock/> </v:group><![endif]--><![if !vml]><img width=640 height=384 src="lec6%20-%20Control%20Flow_files/image001.gif" v:shapes="_x0000_s1085 _x0000_s1086 _x0000_s1087 _x0000_s1088 _x0000_s1089 _x0000_s1090 _x0000_s1091 _x0000_s1092 _x0000_s1093 _x0000_s1094 _x0000_s1095 _x0000_s1096 _x0000_s1097 _x0000_s1098 _x0000_s1099 _x0000_s1100 _x0000_s1101 _x0000_s1102 _x0000_s1103 _x0000_s1104"><![endif]><!--[if mso & !supportInlineShapes & supportFields]><v:shape id="_x0000_i1025" type="#_x0000_t75" style='width:480.1pt;height:288.05pt'> <v:imagedata croptop="-65520f" cropbottom="65520f"/> </v:shape><span style='mso-element:field-end'></span><![endif]--></p> <p class=MsoNormal>There are two possible paths through the code:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=GramE>ABD and ACD.</span> The first correspond to executing the ELSE part while the second to executing the THEN part.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>Other Branches:<o:p></o:p></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><o:p>&nbsp;</o:p></b></p> <p class=MsoNormal>There are other branches that test for different conditions. For example  <span class=SpellE>blt</span> r9, r10, label tests whether r9 s value is <i style='mso-bidi-font-style:normal'>less than</i> r10 s. The instructions take the form:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal style='text-indent:36.0pt'><span class=SpellE>Bcondition</span> <span class=SpellE>rX</span>, <span class=SpellE>rY</span>, label</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Where condition is the condition we are testing. Here are all the branches:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=SpellE>br</span> <span style='font-family:Wingdings; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch always / unconditional</p> <p class=MsoNormal><span class=SpellE>blt</span> <span style='font-family:Wingdings; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE>rX</span> &lt; <span class=SpellE>rY</span> treating the numbers as signed. For example, 0xFFFFFFFF (-1) is less than 0x7FFFFFFFF (2^31 -1)</p> <p class=MsoNormal><span class=SpellE>bge</span> <span style='font-family:Wingdings; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE>rX</span> &gt;= <span class=SpellE>rY</span> treating the numbers as signed. For example, 0xFFFFFFFF (-1) is greater than 0xFFFFFFFE (-2)</p> <p class=MsoNormal><span style='mso-spacerun:yes'> </span><span class=SpellE>bne</span> <span style='font-family:Wingdings;mso-ascii-font-family:"Times New Roman"; mso-hansi-font-family:"Times New Roman";mso-char-type:symbol;mso-symbol-font-family: Wingdings'><span style='mso-char-type:symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE><span class=GramE>rX</span></span><span class=GramE> !</span>= <span class=SpellE>rY</span> (the values are different)</p> <p class=MsoNormal><span class=SpellE>beq</span> <span style='font-family:Wingdings; mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE>rX</span> == <span class=SpellE>rY</span></p> <p class=MsoNormal><span class=SpellE>bltu</span> <span style='font-family: Wingdings;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE>rX</span> &lt; <span class=SpellE>rY</span> treating the numbers as unsigned. For example, 0x7FFFFFFF (2^31 -1) is less than 0xFFFFFFFF (2^32-1). </p> <p class=MsoNormal><span class=SpellE>bgeu</span> <span style='font-family: Wingdings;mso-ascii-font-family:"Times New Roman";mso-hansi-font-family:"Times New Roman"; mso-char-type:symbol;mso-symbol-font-family:Wingdings'><span style='mso-char-type: symbol;mso-symbol-font-family:Wingdings'>à</span></span> branch if <span class=SpellE>rX</span> &gt;= <span class=SpellE>rY</span> treating the numbers as unsigned. For example, 0xFFFFFFFF (2^32-1) is greater <span class=GramE>than<span style='mso-spacerun:yes'>  </span>0x7FFFFFFFF</span> (2^31-1).</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>The NIOS II assembler provides a set of pseudo-instructions that test for other conditions also. These get translated into other instructions by the assembler. Here they are:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1027" type="#_x0000_t75" style='width:434.25pt;height:115.5pt'> <v:imagedata src="lec6%20-%20Control%20Flow_files/image002.emz" o:title=""/> </v:shape><![endif]--><![if !vml]><img width=579 height=154 src="lec6%20-%20Control%20Flow_files/image003.gif" v:shapes="_x0000_i1027"><![endif]></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>All aforementioned branches except for  <span class=SpellE>br</span> are also called <i style='mso-bidi-font-style:normal'>conditional branches </i>as they test as condition and change the PC only if this condition is true.  <span class=SpellE>br</span> is an <i style='mso-bidi-font-style:normal'>unconditional </i>branch. Note that  <span class=SpellE>beq</span> r0, r0, label and  <span class=SpellE>br</span> label have the same effect on PC. If you take the computer architecture course you will understand that  <span class=SpellE>br</span> is preferable from an implementation point of view since it does not read any registers. Just by looking at the instruction we know that the PC will change. </p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>Comparison instructions:<o:p></o:p></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><o:p>&nbsp;</o:p></b></p> <p class=MsoNormal>NIOS II has also a set of comparison instructions that take the form:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=SpellE>cmpCONDITION</span> <span class=SpellE>rZ</span>, <span class=SpellE>rX</span>, <span class=SpellE>rY</span></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>They compare the values of <span class=SpellE>rX</span> with <span class=SpellE>rY</span> testing for the CONDITION. <span class=SpellE>rZ</span> is set to zero if the condition is not met and to <span class=GramE>1</span> otherwise.</p> <p class=MsoNormal>For example, <span class=SpellE>cmpeq</span> r9, r10, r11 will set r9 to 1 if r10 and r11 have the same value, otherwise r9 will be set to 1.</p> <p class=MsoNormal>For each conditional branch there is also a corresponding <span class=SpellE>cmp</span> instruction:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=SpellE><span class=GramE>cmplt</span></span><span class=GramE>, <span class=SpellE>cmpge</span>, <span class=SpellE>cmpne</span>, <span class=SpellE>cmpeq</span>, <span class=SpellE>cmpltu</span>, <span class=SpellE>cmpgeu</span>.</span></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>there are also corresponding pseudo-instructions:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=SpellE><span class=GramE>cmpgt</span></span><span class=GramE>, <span class=SpellE>cmpgtu</span>, <span class=SpellE>cmple</span>, <span class=SpellE>cmpleu</span>.</span></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Finally, there are variants of compare where the second source register is replaced by a 16-bit immediate. Please check the NIOS II reference manual for a complete list.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>If-Then-Else Revisited.<o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Returning to our if-then-else example we can equivalently write:</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>.section .data</p> <p class=MsoPlainText><span class=SpellE>va</span>:<span style='mso-tab-count: 1'>   </span>.long 0x0</p> <p class=MsoPlainText><span class=SpellE>vb</span>:<span style='mso-tab-count: 1'>   </span>.long 0x11223344</p> <p class=MsoPlainText><span class=SpellE>vc</span>:<span style='mso-tab-count: 1'>   </span>.long 0x55667788</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>.section .text</p> <p class=MsoPlainText>main:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, <span class=SpellE>va</span></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, 4(r11)</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>bne</span><span style='mso-tab-count:1'>   </span>r9, r0, else<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'> r10, 8(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span>sub<span style='mso-tab-count:1'>   </span>r8, r9, r10</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, 0(r11)</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>br</span><span style='mso-tab-count:1'>    </span>after</p> <p class=MsoPlainText>else:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span> r10, 8(r11)</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>add<span style='mso-tab-count:1'>   </span>r8, r9, r10</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, 0(r11)</p> <p class=MsoPlainText><span style='mso-spacerun:yes'> </span>after:</p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Here we reversed the order of the THEN and ELSE code sections and hence we also reversed the condition in our first <span class=SpellE>brach</span>. That is, we replaced the  BEQ r9, r0, then with a  BNE r9, r0, else which tests whether the result of the previous operation was non-zero. Hence the first branch diverts execution to address  else only when the value read from <span class=SpellE>vb</span> is non-zero. If the value read from <span class=SpellE>vb</span> is zero then the instruction following the branch is executed (the one at label then).</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>The following flow diagram shows the various control flow sequences possible:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><!--[if mso & !supportInlineShapes & supportFields]><span style='mso-element:field-begin;mso-field-lock:yes'></span><span style='mso-spacerun:yes'> </span>SHAPE <span style='mso-spacerun:yes'> </span>\* MERGEFORMAT <span style='mso-element:field-separator'></span><![endif]--><!--[if gte vml 1]><v:group id="_x0000_s1107" editas="canvas" style='width:480.1pt;height:288.05pt; mso-position-horizontal-relative:char;mso-position-vertical-relative:line' coordorigin="3052,4117" coordsize="7200,4320"> <o:lock v:ext="edit" aspectratio="t"/> <v:shape id="_x0000_s1108" type="#_x0000_t75" style='position:absolute;left:3052; top:4117;width:7200;height:4320' o:preferrelative="f"> <v:fill o:detectmouseclick="t"/> <v:path o:extrusionok="t" o:connecttype="none"/> </v:shape><v:rect id="_x0000_s1109" style='position:absolute;left:5009;top:4376; width:3386;height:708'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>movhi</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r11, %hiadj(va)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, %lo(va)+4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>bne</span><span style='mso-tab-count:1'>   </span>r9, r0, else<o:p></o:p></b></p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1110" style='position:absolute;left:5009;top:5298; width:3386;height:979'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span> r10, %<span class=GramE>lo(</span>va)+8(r11)</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>sub<span style='mso-tab-count:1'>   </span>r8, r9, r10</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, %<span class=GramE>lo(</span>va)(r11)</p> <p class=MsoPlainText style='text-indent:36.0pt'><span class=SpellE><b style='mso-bidi-font-weight:normal'>beq</b></span><b style='mso-bidi-font-weight: normal'><span style='mso-tab-count:1'>   </span>r0, r0, after<o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1111" style='position:absolute;left:5009;top:6513; width:3386;height:862'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><span style='font-size:10.0pt;font-family:"Courier New"'>else:<o:p></o:p></span></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'> r10, %lo(va)+8(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span>add<span style='mso-tab-count: 1'>   </span>r8, r9, r10</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE>stwio</span> r8, %<span class=GramE>lo(</span>va)(r11)</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:rect id="_x0000_s1112" style='position:absolute;left:5009;top:7692; width:2497;height:508'> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoPlainText>after</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:rect><v:line id="_x0000_s1113" style='position:absolute' from="6224,5084" to="6224,5298"> <v:stroke endarrow="block"/> </v:line><v:line id="_x0000_s1114" style='position:absolute;flip:x' from="4694,5186" to="6224,5186"/> <v:line id="_x0000_s1115" style='position:absolute' from="4694,5186" to="4695,6378"/> <v:line id="_x0000_s1116" style='position:absolute' from="6293,7375" to="6303,7692"> <v:stroke endarrow="block"/> </v:line><v:line id="_x0000_s1117" style='position:absolute' from="6224,6277" to="6224,6378"/> <v:line id="_x0000_s1118" style='position:absolute' from="6224,6378" to="9059,6379"/> <v:line id="_x0000_s1119" style='position:absolute' from="9058,6378" to="9059,7503"/> <v:line id="_x0000_s1120" style='position:absolute;flip:x' from="6314,7503" to="9058,7504"/> <v:line id="_x0000_s1121" style='position:absolute' from="4694,6378" to="6033,6378"/> <v:line id="_x0000_s1122" style='position:absolute' from="6033,6378" to="6033,6513"> <v:stroke endarrow="block"/> </v:line><v:shape id="_x0000_s1123" type="#_x0000_t202" style='position:absolute; left:4694;top:4667;width:428;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>A<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1124" type="#_x0000_t202" style='position:absolute; left:4695;top:5611;width:427;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>B<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1125" type="#_x0000_t202" style='position:absolute; left:4638;top:6724;width:427;height:340' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>C<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><v:shape id="_x0000_s1126" type="#_x0000_t202" style='position:absolute; left:4695;top:7692;width:427;height:339' filled="f" stroked="f"> <v:textbox> <![if !mso]> <table cellpadding=0 cellspacing=0 width="100%"> <tr> <td><![endif]> <div> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><span style='font-size:14.0pt;font-family:Arial'>D<o:p></o:p></span></b></p> </div> <![if !mso]></td> </tr> </table> <![endif]></v:textbox> </v:shape><w:wrap type="none"/> <w:anchorlock/> </v:group><![endif]--><![if !vml]><img width=640 height=384 src="lec6%20-%20Control%20Flow_files/image004.gif" v:shapes="_x0000_s1107 _x0000_s1108 _x0000_s1109 _x0000_s1110 _x0000_s1111 _x0000_s1112 _x0000_s1113 _x0000_s1114 _x0000_s1115 _x0000_s1116 _x0000_s1117 _x0000_s1118 _x0000_s1119 _x0000_s1120 _x0000_s1121 _x0000_s1122 _x0000_s1123 _x0000_s1124 _x0000_s1125 _x0000_s1126"><![endif]><!--[if mso & !supportInlineShapes & supportFields]><v:shape id="_x0000_i1026" type="#_x0000_t75" style='width:480.1pt;height:288.05pt'> <v:imagedata croptop="-65520f" cropbottom="65520f"/> </v:shape><span style='mso-element:field-end'></span><![endif]--></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>There are two possible paths through the code:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span class=GramE>ABD and ACD.</span> The first correspond to executing the then part while the second to executing the else part.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>Encoding  Limitations <o:p></o:p></b></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'><o:p>&nbsp;</o:p></b></p> <p class=MsoNormal>While in assembly branch instructions a label as the last argument in the actual machine the destination is encoded relatively to the location of the instruction. A 16-bit displacement constant is used. That is the destination is calculated as <b style='mso-bidi-font-weight:normal'>[PC] + 4 + displacement</b> where PC is the address where the branch instruction is placed in memory<span class=GramE>..</span> The displacement is a 16-bit signed constant and thus can take values from -32768 to +32767. The new PC can be at most -32764 bytes before the current PC or +32772 bytes ahead. The displacement must be divisible by four since all instructions are four bytes long and must appear at aligned memory addresses. The assembler and/or the linker will complaint if a branch is impossible to implement.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>The encoding of branch instructions is as follows (this shows <span class=SpellE>beq</span>):</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><!--[if gte vml 1]><v:shape id="_x0000_i1028" type="#_x0000_t75" style='width:581.25pt;height:54pt'> <v:imagedata src="lec6%20-%20Control%20Flow_files/image005.emz" o:title=""/> </v:shape><![endif]--><![if !vml]><img width=775 height=72 src="lec6%20-%20Control%20Flow_files/image006.gif" v:shapes="_x0000_i1028"><![endif]></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Where A and B are register names (<span class=GramE>that s</span> why they are 5 bits long each), Imm16 is the displacement and 0x26 is a unique number per branch type. 0x26 is for <span class=SpellE>beq</span>. That number is 0x0e for <span class=SpellE>bge</span>, for example.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><b style='mso-bidi-font-weight:normal'>Examples of other conditions being tested:<o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Let us now look at various examples of C conditions and how they can be implemented in 68k assembly:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal style='text-indent:36.0pt'><b style='mso-bidi-font-weight: normal'>if (a == b) then & <o:p></o:p></b></p> <p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r8, r9, then<o:p></o:p></b></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>br</span><span style='mso-tab-count:1'>    </span>after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span>...<o:p></o:p></span></p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>The above code goes through two branch instructions to execute the then part (<span class=SpellE>beq</span> and <span class=SpellE>br</span>). There is a more efficient implementation. It relies on testing the opposite condition:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>bne</span><span style='mso-tab-count:1'>   </span>r8, r9, after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><span style='font-family:"Courier New"'><o:p>&nbsp;</o:p></span></p> <p class=MsoNormal>Here s another example where we compare two different memory variables.<br style='mso-special-character:line-break'> <![if !supportLineBreakNewLine]><br style='mso-special-character:line-break'> <![endif]></p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span><b style='mso-bidi-font-weight:normal'>if (a &gt; b) then & <o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>ldwio</span><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>ble</span><span style='mso-tab-count:1'>   </span>r8, r9, after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span></p> <p class=MsoNormal>Note that in the previous example we used a signed condition. Note that we also used the reverse condition in the branch instruction since we want to execute the instruction that follows (the then part) if <span class=GramE>a is</span> greater than b. Thus we test for the opposite condition which is less or equal.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span><span class=GramE><b style='mso-bidi-font-weight:normal'>if (<span class=SpellE>va</span> == 3) then & </b></span><b style='mso-bidi-font-weight:normal'><o:p></o:p></b></p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>cmpeqi</span> r9, r8, 0x3</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r9, r0, after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span></p> <p class=MsoNormal>Note that we use the <span class=SpellE>cmpeqi</span> = compare if equal with immediate instruction. This instruction compares r8 with the constant 1 and sets the value of r9 to 1 if the two values are equal (r8 contains the value 3) or to 0 otherwise. It does not access memory. The immediate argument to compare is a 16-bit immediate.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>We then test if r9 holds the value zero, If it does, then r8 did not contain <span class=GramE>3</span> and hence we branch over then.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>The following implementation is equivalent (but r9 at the end contains 3 and not 0 or 1):</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>addi</span> r9, r0, 0x3</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span>r8, r9, after<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Let s now look at a combined condition (&amp;&amp; = AND):</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span><b style='mso-bidi-font-weight:normal'>if (<span class=SpellE>va</span> == <span class=GramE>1</span> &amp;&amp; <span class=SpellE>vb</span> == 2) then & else & <o:p></o:p></b></p> <p class=MsoNormal>&nbsp;</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, 0(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>cmpeqi</span> r10, r8, 0x1</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span> r10, r0, else<o:p></o:p></b></p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>cmpeqi</span> r10, r9, 0x2</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span><span style='color:red'>r10</span>, r0, else<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>br</span> after<o:p></o:p></b></p> <p class=MsoPlainText>else:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span></p> <p class=MsoNormal>Since all conditions must be met for the then part to get executed we test the opposite condition and branch to the else part as soon as one of these opposite conditions is met. Only if none of the opposite conditions is met we reach the then part.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Let s now look at a combined condition (|| = OR):</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal><span style='mso-tab-count:1'>            </span><b style='mso-bidi-font-weight:normal'>if (<span class=SpellE>va</span> == <span class=GramE>1</span> || <span class=SpellE>vb</span> == 2) then & else & <o:p></o:p></b></p> <p class=MsoNormal>&nbsp;</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span lang=FR style='mso-ansi-language:FR'>.section .<span class=SpellE>text</span><o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'>main:<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span><span class=SpellE>movia</span><span style='mso-tab-count:1'> </span>r11, va<o:p></o:p></span></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><o:p>&nbsp;</o:p></span></b></p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span></b><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r8, </span>0<span lang=FR style='mso-ansi-language:FR'>(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>cmpeqi</span> r10, r8, 0x1</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>bne</span> r10, r0, then<o:p></o:p></b></p> <p class=MsoPlainText><o:p>&nbsp;</o:p></p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span><span class=SpellE><span lang=FR style='mso-ansi-language:FR'>ldwio</span></span><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'> </span>r9, 4(r11)<o:p></o:p></span></p> <p class=MsoPlainText><span lang=FR style='mso-ansi-language:FR'><span style='mso-tab-count:1'>      </span></span><span class=SpellE>cmpeqi</span> r10, r9, 0x2</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>beq</span><span style='mso-tab-count:1'>   </span><span style='color:red'>r10</span>, r0, else<o:p></o:p></b></p> <p class=MsoPlainText>then:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText><b style='mso-bidi-font-weight:normal'><span style='mso-tab-count:1'>      </span><span class=SpellE>br</span> after<o:p></o:p></b></p> <p class=MsoPlainText>else:</p> <p class=MsoPlainText><span style='mso-tab-count:1'>      </span>...</p> <p class=MsoPlainText>after:</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> <p class=MsoNormal>Since the then part is executed as long as at least one condition is met, we first test for the condition as specified (not the opposite) and branch to then part if this is met. If not we proceed to test the opposite of the second condition and branch to the else part if it is met.</p> <p class=MsoNormal><o:p>&nbsp;</o:p></p> </div> </body> </html>