
In clang there are two options `-f[no]cx-limited-range` and `-f[no]cx-fortran-rules` that control the range of complex multiplication and division. However, it is unclear how these options interact with one another. For instance, what should happen when the users compile with `-fcx-fortran-rules -fno-cx-limited-range` or `-fcx-limited-range -fno-cx-fortran-rules`? In this patch we are introducing a new option to solve the issue and give a greater flexibility to the user to control the behavior of the compiler when performing multiplication and division of complex floating-point values. `-fcomplex-arihmetic=[full|improved|promoted|basic]` `full`: Implementation of complex division and multiplication using a call to runtime library functions (generally the case, but the BE might sometimes replace the library call if it knows enough about the potential range of the inputs). Overflow and non-finite values are handled by the library implementation. For the case of multiplication overflow will occur in accordance with normal floating-point rules. This is the default value. `improved`: Implementation of complex division using the Smith algorithm at source precision. Smith's algorithm for complex division. See SMITH, R. L. Algorithm 116: Complex division. Commun. ACM 5, 8 (1962). This value offers improved handling for overflow in intermediate calculations, but overflow may occur. NaN and infinite values are not handled in some cases. `promoted`: Implementation of complex division using algebraic formulas at higher precision. Overflow is handled. Non-finite values are handled in some cases. If the target does not have native support for a higher precision data type, the implementation for the complex operation using the Smith algorithm will be used. Overflow may still occur in some cases. NaN and infinite values are not handled. `basic`: Implementation of complex division and multiplication using algebraic formulas at source precision. No special handling to avoid overflow. NaN and infinite values are not handled. `fcx-limited-range` will alias `-fcomplex-arithmetic=basic` `-fcx-fortran-rules` will alias `-fcomplex-arithmetic=improved` `-fno-cx-limited-range` and `-fno-cx-fortran-rules` will alias `-fcomplex-arithmetic=full` The complex division and multiplication will be implemented as follows depending on the option used. <html xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40"> <head> <meta name=ProgId content=Word.Document> <meta name=Generator content="Microsoft Word 15"> <meta name=Originator content="Microsoft Word 15"> <link rel=File-List href="file:///C:/Users/zahiraam/AppData/Local/Temp/msohtmlclip1/01/clip_filelist.xml"> <!--[if gte mso 9]><xml> <o:OfficeDocumentSettings> <o:AllowPNG/> </o:OfficeDocumentSettings> </xml><![endif]--> <link rel=themeData href="file:///C:/Users/zahiraam/AppData/Local/Temp/msohtmlclip1/01/clip_themedata.thmx"> <link rel=colorSchemeMapping href="file:///C:/Users/zahiraam/AppData/Local/Temp/msohtmlclip1/01/clip_colorschememapping.xml"> <!--[if gte mso 9]><xml> <w:WordDocument> <w:View>Normal</w:View> <w:Zoom>0</w:Zoom> <w:TrackMoves/> <w:TrackFormatting/> <w:PunctuationKerning/> <w:ValidateAgainstSchemas/> <w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid> <w:IgnoreMixedContent>false</w:IgnoreMixedContent> <w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText> <w:DoNotPromoteQF/> <w:LidThemeOther>EN-US</w:LidThemeOther> <w:LidThemeAsian>X-NONE</w:LidThemeAsian> <w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript> <w:Compatibility> <w:BreakWrappedTables/> <w:SnapToGridInCell/> <w:WrapTextWithPunct/> <w:UseAsianBreakRules/> <w:DontGrowAutofit/> <w:SplitPgBreakAndParaMark/> <w:EnableOpenTypeKerning/> <w:DontFlipMirrorIndents/> <w:OverrideTableStyleHps/> </w:Compatibility> <m:mathPr> <m:mathFont m:val="Cambria Math"/> <m:brkBin m:val="before"/> <m:brkBinSub m:val="--"/> <m:smallFrac m:val="off"/> <m:dispDef/> <m:lMargin m:val="0"/> <m:rMargin m:val="0"/> <m:defJc m:val="centerGroup"/> <m:wrapIndent m:val="1440"/> <m:intLim m:val="subSup"/> <m:naryLim m:val="undOvr"/> </m:mathPr></w:WordDocument> </xml><![endif]--><!--[if gte mso 9]><xml> <w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false" DefSemiHidden="false" DefQFormat="false" DefPriority="99" LatentStyleCount="376"> <w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/> <w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 2"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 3"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 4"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 5"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 6"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 7"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 8"/> <w:LsdException Locked="false" Priority="9" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="heading 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index 9"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 1"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 2"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 3"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 4"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 5"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 6"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 7"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 8"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" Name="toc 9"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="header"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footer"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="index heading"/> <w:LsdException Locked="false" Priority="35" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="caption"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of figures"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="envelope return"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="footnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="line number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="page number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote reference"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="endnote text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="table of authorities"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="macro"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="toa heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Bullet 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Number 5"/> <w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Closing"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Signature"/> <w:LsdException Locked="false" Priority="1" SemiHidden="true" UnhideWhenUsed="true" Name="Default Paragraph Font"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="List Continue 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Message Header"/> <w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Salutation"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Date"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text First Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Note Heading"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Body Text Indent 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Block Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="FollowedHyperlink"/> <w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/> <w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Document Map"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Plain Text"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="E-mail Signature"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Top of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Bottom of Form"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal (Web)"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Acronym"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Address"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Cite"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Code"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Definition"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Keyboard"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Preformatted"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Sample"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Typewriter"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="HTML Variable"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Normal Table"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="annotation subject"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="No List"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Outline List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Simple 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Classic 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Colorful 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Columns 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Grid 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 4"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 5"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 7"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table List 8"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table 3D effects 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Contemporary"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Elegant"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Professional"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Subtle 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 1"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 2"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Web 3"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Balloon Text"/> <w:LsdException Locked="false" Priority="39" Name="Table Grid"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Table Theme"/> <w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/> <w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading"/> <w:LsdException Locked="false" Priority="61" Name="Light List"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/> <w:LsdException Locked="false" SemiHidden="true" Name="Revision"/> <w:LsdException Locked="false" Priority="34" QFormat="true" Name="List Paragraph"/> <w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/> <w:LsdException Locked="false" Priority="30" QFormat="true" Name="Intense Quote"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/> <w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/> <w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/> <w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/> <w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/> <w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/> <w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/> <w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/> <w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/> <w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/> <w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/> <w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/> <w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/> <w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/> <w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/> <w:LsdException Locked="false" Priority="19" QFormat="true" Name="Subtle Emphasis"/> <w:LsdException Locked="false" Priority="21" QFormat="true" Name="Intense Emphasis"/> <w:LsdException Locked="false" Priority="31" QFormat="true" Name="Subtle Reference"/> <w:LsdException Locked="false" Priority="32" QFormat="true" Name="Intense Reference"/> <w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/> <w:LsdException Locked="false" Priority="37" SemiHidden="true" UnhideWhenUsed="true" Name="Bibliography"/> <w:LsdException Locked="false" Priority="39" SemiHidden="true" UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/> <w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/> <w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/> <w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/> <w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/> <w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/> <w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 1"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 1"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 2"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 2"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 3"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 3"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 4"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 4"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 5"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 5"/> <w:LsdException Locked="false" Priority="46" Name="List Table 1 Light Accent 6"/> <w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/> <w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/> <w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/> <w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/> <w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful Accent 6"/> <w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful Accent 6"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Hyperlink"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Hashtag"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Unresolved Mention"/> <w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true" Name="Smart Link"/> </w:LatentStyles> </xml><![endif]--> <style> <!-- /* Font Definitions */ @font-face {font-family:"Cambria Math"; panose-1:2 4 5 3 5 4 6 3 2 4; mso-font-charset:0; mso-generic-font-family:roman; mso-font-pitch:variable; mso-font-signature:-536869121 1107305727 33554432 0 415 0;} @font-face {font-family:Calibri; panose-1:2 15 5 2 2 2 4 3 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-pitch:variable; mso-font-signature:-469750017 -1040178053 9 0 511 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-unhide:no; mso-style-qformat:yes; mso-style-parent:""; margin-top:0in; margin-right:0in; margin-bottom:8.0pt; margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual;} .MsoChpDefault {mso-style-type:export-only; mso-default-props:yes; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-fareast-font-family:Calibri; mso-fareast-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi;} .MsoPapDefault {mso-style-type:export-only; margin-bottom:8.0pt; line-height:107%;} @page WordSection1 {size:8.5in 11.0in; margin:1.0in 1.0in 1.0in 1.0in; mso-header-margin:.5in; mso-footer-margin:.5in; mso-paper-source:0;} div.WordSection1 {page:WordSection1;} --> </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-priority:99; mso-style-parent:""; mso-padding-alt:0in 5.4pt 0in 5.4pt; mso-para-margin-top:0in; mso-para-margin-right:0in; mso-para-margin-bottom:8.0pt; mso-para-margin-left:0in; line-height:107%; mso-pagination:widow-orphan; font-size:11.0pt; font-family:"Calibri",sans-serif; mso-ascii-font-family:Calibri; mso-ascii-theme-font:minor-latin; mso-hansi-font-family:Calibri; mso-hansi-theme-font:minor-latin; mso-bidi-font-family:"Times New Roman"; mso-bidi-theme-font:minor-bidi; mso-font-kerning:1.0pt; mso-ligatures:standardcontextual;} </style> <![endif]--> </head> <body lang=EN-US style='tab-interval:.5in;word-wrap:break-word'> <!--StartFragment--> -fcomplex-arithmetic | div | mul -- | -- | -- basic | algebraic form | algebraic form improved | smith's algorithm | algebraic form full | libcall | libcall + nan processing promoted | algebraic form + higher precision | algebraic form <!--EndFragment--> </body> </html>
908 lines
25 KiB
C
908 lines
25 KiB
C
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-unknown-unknown -o - | FileCheck %s --check-prefix=X86
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple x86_64-pc-win64 -o - | FileCheck %s --check-prefix=X86
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple i686-unknown-unknown -o - | FileCheck %s --check-prefix=X86
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple powerpc-unknown-unknown -o - | FileCheck %s --check-prefix=PPC
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple armv7-none-linux-gnueabi -o - | FileCheck %s --check-prefix=ARM
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple armv7-none-linux-gnueabihf -o - | FileCheck %s --check-prefix=ARMHF
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple thumbv7k-apple-watchos2.0 -o - -target-abi aapcs16 | FileCheck %s --check-prefix=ARM7K
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple aarch64-unknown-unknown -ffast-math -ffp-contract=fast -complex-range=improved -o - | FileCheck %s --check-prefix=AARCH64-FASTMATH
|
|
// RUN: %clang_cc1 %s -O0 -emit-llvm -triple spir -o - | FileCheck %s --check-prefix=SPIR
|
|
|
|
float _Complex add_float_rr(float a, float b) {
|
|
// X86-LABEL: @add_float_rr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
float _Complex add_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @add_float_cr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
float _Complex add_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @add_float_rc(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
float _Complex add_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @add_float_cc(
|
|
// X86: fadd
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
|
|
float _Complex sub_float_rr(float a, float b) {
|
|
// X86-LABEL: @sub_float_rr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
float _Complex sub_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @sub_float_cr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
float _Complex sub_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @sub_float_rc(
|
|
// X86: fsub
|
|
// X86: fneg
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
float _Complex sub_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @sub_float_cc(
|
|
// X86: fsub
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
|
|
float _Complex mul_float_rr(float a, float b) {
|
|
// X86-LABEL: @mul_float_rr(
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
float _Complex mul_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @mul_float_cr(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
float _Complex mul_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @mul_float_rc(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
|
|
float _Complex mul_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @mul_float_cc(
|
|
// X86: %[[AC:[^ ]+]] = fmul
|
|
// X86: %[[BD:[^ ]+]] = fmul
|
|
// X86: %[[AD:[^ ]+]] = fmul
|
|
// X86: %[[BC:[^ ]+]] = fmul
|
|
// X86: %[[RR:[^ ]+]] = fsub
|
|
// X86: %[[RI:[^ ]+]] = fadd
|
|
// X86-DAG: %[[AD]]
|
|
// X86-DAG: ,
|
|
// X86-DAG: %[[BC]]
|
|
// X86: fcmp uno float %[[RR]]
|
|
// X86: fcmp uno float %[[RI]]
|
|
// X86: call {{.*}} @__mulsc3(
|
|
// X86: ret
|
|
// SPIR: call spir_func {{.*}} @__mulsc3(
|
|
return a * b;
|
|
}
|
|
|
|
float _Complex div_float_rr(float a, float b) {
|
|
// X86-LABEL: @div_float_rr(
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
float _Complex div_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @div_float_cr(
|
|
// X86: fdiv
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
float _Complex div_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @div_float_rc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divsc3(
|
|
// X86: ret
|
|
|
|
// SPIR: call spir_func {{.*}} @__divsc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_float_rc(float noundef nofpclass(nan inf) %a, [2 x float] noundef nofpclass(nan inf) alignstack(8) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}float @llvm.fabs.f32(float {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}float @llvm.fabs.f32(float {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt float
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}float
|
|
// AARCH64-FASTMATH: ret
|
|
return a / b;
|
|
}
|
|
float _Complex div_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @div_float_cc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divsc3(
|
|
// X86: ret
|
|
|
|
// SPIR: call spir_func {{.*}} @__divsc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_float_cc([2 x float] noundef nofpclass(nan inf) alignstack(8) %a.coerce, [2 x float] noundef nofpclass(nan inf) alignstack(8) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}float @llvm.fabs.f32(float {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}float @llvm.fabs.f32(float {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt float
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}float
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}float
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}float
|
|
return a / b;
|
|
}
|
|
|
|
double _Complex add_double_rr(double a, double b) {
|
|
// X86-LABEL: @add_double_rr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
double _Complex add_double_cr(double _Complex a, double b) {
|
|
// X86-LABEL: @add_double_cr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
double _Complex add_double_rc(double a, double _Complex b) {
|
|
// X86-LABEL: @add_double_rc(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
double _Complex add_double_cc(double _Complex a, double _Complex b) {
|
|
// X86-LABEL: @add_double_cc(
|
|
// X86: fadd
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
|
|
double _Complex sub_double_rr(double a, double b) {
|
|
// X86-LABEL: @sub_double_rr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
double _Complex sub_double_cr(double _Complex a, double b) {
|
|
// X86-LABEL: @sub_double_cr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
double _Complex sub_double_rc(double a, double _Complex b) {
|
|
// X86-LABEL: @sub_double_rc(
|
|
// X86: fsub
|
|
// X86: fneg
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
double _Complex sub_double_cc(double _Complex a, double _Complex b) {
|
|
// X86-LABEL: @sub_double_cc(
|
|
// X86: fsub
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
|
|
double _Complex mul_double_rr(double a, double b) {
|
|
// X86-LABEL: @mul_double_rr(
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
double _Complex mul_double_cr(double _Complex a, double b) {
|
|
// X86-LABEL: @mul_double_cr(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
double _Complex mul_double_rc(double a, double _Complex b) {
|
|
// X86-LABEL: @mul_double_rc(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
double _Complex mul_double_cc(double _Complex a, double _Complex b) {
|
|
// X86-LABEL: @mul_double_cc(
|
|
// X86: %[[AC:[^ ]+]] = fmul
|
|
// X86: %[[BD:[^ ]+]] = fmul
|
|
// X86: %[[AD:[^ ]+]] = fmul
|
|
// X86: %[[BC:[^ ]+]] = fmul
|
|
// X86: %[[RR:[^ ]+]] = fsub double %[[AC]], %[[BD]]
|
|
// X86: %[[RI:[^ ]+]] = fadd double
|
|
// X86-DAG: %[[AD]]
|
|
// X86-DAG: ,
|
|
// X86-DAG: %[[BC]]
|
|
// X86: fcmp uno double %[[RR]]
|
|
// X86: fcmp uno double %[[RI]]
|
|
// X86: call {{.*}} @__muldc3(
|
|
// X86: ret
|
|
|
|
// SPIR: call spir_func {{.*}} @__muldc3(
|
|
return a * b;
|
|
}
|
|
|
|
double _Complex div_double_rr(double a, double b) {
|
|
// X86-LABEL: @div_double_rr(
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
double _Complex div_double_cr(double _Complex a, double b) {
|
|
// X86-LABEL: @div_double_cr(
|
|
// X86: fdiv
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
double _Complex div_double_rc(double a, double _Complex b) {
|
|
// X86-LABEL: @div_double_rc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divdc3(
|
|
// X86: ret
|
|
|
|
// SPIR: call spir_func {{.*}} @__divdc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_double_rc(double noundef nofpclass(nan inf) %a, [2 x double] noundef nofpclass(nan inf) alignstack(8) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}double @llvm.fabs.f64(double {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}double @llvm.fabs.f64(double {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt double
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}double
|
|
// AARCH64-FASTMATH: ret
|
|
return a / b;
|
|
}
|
|
double _Complex div_double_cc(double _Complex a, double _Complex b) {
|
|
// X86-LABEL: @div_double_cc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divdc3(
|
|
// X86: ret
|
|
|
|
// SPIR: call spir_func {{.*}} @__divdc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_double_cc([2 x double] noundef nofpclass(nan inf) alignstack(8) %a.coerce, [2 x double] noundef nofpclass(nan inf) alignstack(8) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}double @llvm.fabs.f64(double {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}double @llvm.fabs.f64(double {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt double
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}double
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}double
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}double
|
|
// AARCH64-FASTMATH: ret
|
|
return a / b;
|
|
}
|
|
|
|
long double _Complex add_long_double_rr(long double a, long double b) {
|
|
// X86-LABEL: @add_long_double_rr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
long double _Complex add_long_double_cr(long double _Complex a, long double b) {
|
|
// X86-LABEL: @add_long_double_cr(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
long double _Complex add_long_double_rc(long double a, long double _Complex b) {
|
|
// X86-LABEL: @add_long_double_rc(
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
long double _Complex add_long_double_cc(long double _Complex a, long double _Complex b) {
|
|
// X86-LABEL: @add_long_double_cc(
|
|
// X86: fadd
|
|
// X86: fadd
|
|
// X86-NOT: fadd
|
|
// X86: ret
|
|
return a + b;
|
|
}
|
|
|
|
long double _Complex sub_long_double_rr(long double a, long double b) {
|
|
// X86-LABEL: @sub_long_double_rr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
long double _Complex sub_long_double_cr(long double _Complex a, long double b) {
|
|
// X86-LABEL: @sub_long_double_cr(
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
long double _Complex sub_long_double_rc(long double a, long double _Complex b) {
|
|
// X86-LABEL: @sub_long_double_rc(
|
|
// X86: fsub
|
|
// X86: fneg
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
long double _Complex sub_long_double_cc(long double _Complex a, long double _Complex b) {
|
|
// X86-LABEL: @sub_long_double_cc(
|
|
// X86: fsub
|
|
// X86: fsub
|
|
// X86-NOT: fsub
|
|
// X86: ret
|
|
return a - b;
|
|
}
|
|
|
|
long double _Complex mul_long_double_rr(long double a, long double b) {
|
|
// X86-LABEL: @mul_long_double_rr(
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
long double _Complex mul_long_double_cr(long double _Complex a, long double b) {
|
|
// X86-LABEL: @mul_long_double_cr(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
long double _Complex mul_long_double_rc(long double a, long double _Complex b) {
|
|
// X86-LABEL: @mul_long_double_rc(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a * b;
|
|
}
|
|
long double _Complex mul_long_double_cc(long double _Complex a, long double _Complex b) {
|
|
// X86-LABEL: @mul_long_double_cc(
|
|
// X86: %[[AC:[^ ]+]] = fmul
|
|
// X86: %[[BD:[^ ]+]] = fmul
|
|
// X86: %[[AD:[^ ]+]] = fmul
|
|
// X86: %[[BC:[^ ]+]] = fmul
|
|
// X86: %[[RR:[^ ]+]] = fsub x86_fp80 %[[AC]], %[[BD]]
|
|
// X86: %[[RI:[^ ]+]] = fadd x86_fp80
|
|
// X86-DAG: %[[AD]]
|
|
// X86-DAG: ,
|
|
// X86-DAG: %[[BC]]
|
|
// X86: fcmp uno x86_fp80 %[[RR]]
|
|
// X86: fcmp uno x86_fp80 %[[RI]]
|
|
// X86: call {{.*}} @__mulxc3(
|
|
// X86: ret
|
|
// PPC-LABEL: @mul_long_double_cc(
|
|
// PPC: %[[AC:[^ ]+]] = fmul
|
|
// PPC: %[[BD:[^ ]+]] = fmul
|
|
// PPC: %[[AD:[^ ]+]] = fmul
|
|
// PPC: %[[BC:[^ ]+]] = fmul
|
|
// PPC: %[[RR:[^ ]+]] = fsub ppc_fp128 %[[AC]], %[[BD]]
|
|
// PPC: %[[RI:[^ ]+]] = fadd ppc_fp128
|
|
// PPC-DAG: %[[AD]]
|
|
// PPC-DAG: ,
|
|
// PPC-DAG: %[[BC]]
|
|
// PPC: fcmp uno ppc_fp128 %[[RR]]
|
|
// PPC: fcmp uno ppc_fp128 %[[RI]]
|
|
// PPC: call {{.*}} @__multc3(
|
|
// PPC: ret
|
|
// SPIR: call spir_func {{.*}} @__muldc3(
|
|
return a * b;
|
|
}
|
|
|
|
long double _Complex div_long_double_rr(long double a, long double b) {
|
|
// X86-LABEL: @div_long_double_rr(
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
long double _Complex div_long_double_cr(long double _Complex a, long double b) {
|
|
// X86-LABEL: @div_long_double_cr(
|
|
// X86: fdiv
|
|
// X86: fdiv
|
|
// X86-NOT: fdiv
|
|
// X86: ret
|
|
return a / b;
|
|
}
|
|
long double _Complex div_long_double_rc(long double a, long double _Complex b) {
|
|
// X86-LABEL: @div_long_double_rc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divxc3(
|
|
// X86: ret
|
|
// PPC-LABEL: @div_long_double_rc(
|
|
// PPC-NOT: fdiv
|
|
// PPC: call {{.*}} @__divtc3(
|
|
// PPC: ret
|
|
// SPIR: call spir_func {{.*}} @__divdc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_long_double_rc(fp128 noundef nofpclass(nan inf) %a, [2 x fp128] noundef nofpclass(nan inf) alignstack(16) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}fp128 @llvm.fabs.f128(fp128 {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}fp128 @llvm.fabs.f128(fp128 {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt fp128
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}fp128
|
|
// AARCH64-FASTMATH: ret
|
|
return a / b;
|
|
}
|
|
long double _Complex div_long_double_cc(long double _Complex a, long double _Complex b) {
|
|
// X86-LABEL: @div_long_double_cc(
|
|
// X86-NOT: fdiv
|
|
// X86: call {{.*}} @__divxc3(
|
|
// X86: ret
|
|
// PPC-LABEL: @div_long_double_cc(
|
|
// PPC-NOT: fdiv
|
|
// PPC: call {{.*}} @__divtc3(
|
|
// PPC: ret
|
|
// SPIR: call spir_func {{.*}} @__divdc3(
|
|
|
|
// a / b = (A+iB) / (C+iD) = (E+iF)
|
|
// if (|C| >= |D|)
|
|
// DdC = D/C
|
|
// CpRD = C+DdC*D
|
|
// E = (A+B*DdC)/CpRD
|
|
// F = (B-A*DdC)/CpRD
|
|
// else
|
|
// CdD = C/D
|
|
// DpRC= D+CdD*C
|
|
// E = (A*CdD+B)/DpRC
|
|
// F = (B*CdD-A)/DpRC
|
|
// AARCH64-FASTMATH-LABEL: @div_long_double_cc([2 x fp128] noundef nofpclass(nan inf) alignstack(16) %a.coerce, [2 x fp128] noundef nofpclass(nan inf) alignstack(16) %b.coerce)
|
|
// |C|
|
|
// AARCH64-FASTMATH: call {{.*}}fp128 @llvm.fabs.f128(fp128 {{.*}})
|
|
// |D|
|
|
// AARCH64-FASTMATH-NEXT: call {{.*}}fp128 @llvm.fabs.f128(fp128 {{.*}})
|
|
// AARCH64-FASTMATH-NEXT: fcmp {{.*}}ugt fp128
|
|
// AARCH64-FASTMATH-NEXT: br i1 {{.*}}, label
|
|
// AARCH64-FASTMATH: abs_rhsr_greater_or_equal_abs_rhsi:
|
|
|
|
// |C| >= |D|
|
|
// DdC=D/C
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// CpRD=C+CdC*D
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
|
|
// A+BR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// B-AR/CpRD
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: abs_rhsr_less_than_abs_rhsi:
|
|
|
|
// |C| < |D|
|
|
// CdD=C/D
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// DpRC=D+CdD*C
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
|
|
// (A*CdD+B)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fadd {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// (BCdD-A)/DpRC
|
|
// AARCH64-FASTMATH-NEXT: fmul {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fsub {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: fdiv {{.*}}fp128
|
|
|
|
// AARCH64-FASTMATH-NEXT: br label
|
|
// AARCH64-FASTMATH: complex_div:
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}fp128
|
|
// AARCH64-FASTMATH-NEXT: phi {{.*}}fp128
|
|
// AARCH64-FASTMATH: ret
|
|
return a / b;
|
|
}
|
|
|
|
// Comparison operators don't rely on library calls or have interseting math
|
|
// properties, but test that mixed types work correctly here.
|
|
_Bool eq_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @eq_float_cr(
|
|
// X86: fcmp oeq
|
|
// X86: fcmp oeq
|
|
// X86: and i1
|
|
// X86: ret
|
|
return a == b;
|
|
}
|
|
_Bool eq_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @eq_float_rc(
|
|
// X86: fcmp oeq
|
|
// X86: fcmp oeq
|
|
// X86: and i1
|
|
// X86: ret
|
|
return a == b;
|
|
}
|
|
_Bool eq_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @eq_float_cc(
|
|
// X86: fcmp oeq
|
|
// X86: fcmp oeq
|
|
// X86: and i1
|
|
// X86: ret
|
|
return a == b;
|
|
}
|
|
_Bool ne_float_cr(float _Complex a, float b) {
|
|
// X86-LABEL: @ne_float_cr(
|
|
// X86: fcmp une
|
|
// X86: fcmp une
|
|
// X86: or i1
|
|
// X86: ret
|
|
return a != b;
|
|
}
|
|
_Bool ne_float_rc(float a, float _Complex b) {
|
|
// X86-LABEL: @ne_float_rc(
|
|
// X86: fcmp une
|
|
// X86: fcmp une
|
|
// X86: or i1
|
|
// X86: ret
|
|
return a != b;
|
|
}
|
|
_Bool ne_float_cc(float _Complex a, float _Complex b) {
|
|
// X86-LABEL: @ne_float_cc(
|
|
// X86: fcmp une
|
|
// X86: fcmp une
|
|
// X86: or i1
|
|
// X86: ret
|
|
return a != b;
|
|
}
|
|
|
|
// Check that the libcall will obtain proper calling convention on ARM
|
|
_Complex double foo(_Complex double a, _Complex double b) {
|
|
// These functions are not defined as floating point helper functions in
|
|
// Run-time ABI for the ARM architecture document so they must not always
|
|
// use the base AAPCS.
|
|
|
|
// ARM-LABEL: @foo(
|
|
// ARM: call void @__muldc3
|
|
|
|
// SPIR: call spir_func void @__muldc3
|
|
|
|
// ARMHF-LABEL: @foo(
|
|
// ARMHF: call { double, double } @__muldc3
|
|
|
|
// ARM7K-LABEL: @foo(
|
|
// ARM7K: call { double, double } @__muldc3
|
|
return a*b;
|
|
}
|
|
|
|
typedef _Complex double ComplexDouble;
|
|
typedef double Double;
|
|
|
|
float _Complex double_cr_sugar(ComplexDouble a, Double b) {
|
|
// X86-LABEL: @double_cr_sugar(
|
|
// X86: fmul
|
|
// X86: fmul
|
|
// X86-NOT: fmul
|
|
// X86: ret
|
|
return a *= b;
|
|
}
|