1 Commits

Author SHA1 Message Date
a6c7b1427e fixes missing namespaces 2023-07-09 20:15:12 +02:00
563 changed files with 61599 additions and 73486 deletions

View File

@ -1,3 +1,4 @@
---
Language: Cpp Language: Cpp
# BasedOnStyle: LLVM # BasedOnStyle: LLVM
# should be in line with IndentWidth # should be in line with IndentWidth
@ -12,8 +13,8 @@ AllowAllParametersOfDeclarationOnNextLine: true
AllowShortBlocksOnASingleLine: false AllowShortBlocksOnASingleLine: false
AllowShortCaseLabelsOnASingleLine: false AllowShortCaseLabelsOnASingleLine: false
AllowShortFunctionsOnASingleLine: All AllowShortFunctionsOnASingleLine: All
AllowShortIfStatementsOnASingleLine: false AllowShortIfStatementsOnASingleLine: true
AllowShortLoopsOnASingleLine: false AllowShortLoopsOnASingleLine: true
AlwaysBreakAfterDefinitionReturnType: None AlwaysBreakAfterDefinitionReturnType: None
AlwaysBreakAfterReturnType: None AlwaysBreakAfterReturnType: None
AlwaysBreakBeforeMultilineStrings: false AlwaysBreakBeforeMultilineStrings: false
@ -38,8 +39,8 @@ BreakBeforeTernaryOperators: true
BreakConstructorInitializersBeforeComma: true BreakConstructorInitializersBeforeComma: true
BreakAfterJavaFieldAnnotations: false BreakAfterJavaFieldAnnotations: false
BreakStringLiterals: true BreakStringLiterals: true
ColumnLimit: 140 ColumnLimit: 120
CommentPragmas: '^( IWYU pragma:| @suppress)' CommentPragmas: '^ IWYU pragma:'
ConstructorInitializerAllOnOneLineOrOnePerLine: false ConstructorInitializerAllOnOneLineOrOnePerLine: false
ConstructorInitializerIndentWidth: 0 ConstructorInitializerIndentWidth: 0
ContinuationIndentWidth: 4 ContinuationIndentWidth: 4
@ -75,13 +76,13 @@ PenaltyBreakFirstLessLess: 120
PenaltyBreakString: 1000 PenaltyBreakString: 1000
PenaltyExcessCharacter: 1000000 PenaltyExcessCharacter: 1000000
PenaltyReturnTypeOnItsOwnLine: 60 PenaltyReturnTypeOnItsOwnLine: 60
PointerAlignment: Left PointerAlignment: Right
ReflowComments: true ReflowComments: true
SortIncludes: true SortIncludes: true
SpaceAfterCStyleCast: false SpaceAfterCStyleCast: false
SpaceAfterTemplateKeyword: true SpaceAfterTemplateKeyword: true
SpaceBeforeAssignmentOperators: true SpaceBeforeAssignmentOperators: true
SpaceBeforeParens: Never SpaceBeforeParens: ControlStatements
SpaceInEmptyParentheses: false SpaceInEmptyParentheses: false
SpacesBeforeTrailingComments: 1 SpacesBeforeTrailingComments: 1
SpacesInAngles: false SpacesInAngles: false

2
.gitignore vendored
View File

@ -1,6 +1,5 @@
.DS_Store .DS_Store
/*.il /*.il
/.settings
/avr-instr.html /avr-instr.html
/blink.S /blink.S
/flash.* /flash.*
@ -15,6 +14,7 @@
/*.ods /*.ods
/build*/ /build*/
/*.logs /*.logs
language.settings.xml
/*.gtkw /*.gtkw
/Debug wo LLVM/ /Debug wo LLVM/
/*.txdb /*.txdb

View File

@ -0,0 +1,73 @@
eclipse.preferences.version=1
org.eclipse.cdt.codan.checkers.errnoreturn=Warning
org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false}
org.eclipse.cdt.codan.checkers.errreturnvalue=Error
org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"}
org.eclipse.cdt.codan.checkers.nocommentinside=-Error
org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"}
org.eclipse.cdt.codan.checkers.nolinecomment=-Error
org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"}
org.eclipse.cdt.codan.checkers.noreturn=Error
org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false}
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error
org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"}
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error
org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"}
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning
org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"}
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error
org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"}
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning
org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false}
org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning
org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error
org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"}
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning
org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true}
org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error
org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"}
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"}
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"}
org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error
org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"}
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error
org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"}
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error
org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"}
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error
org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"}
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"}
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info
org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning
org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"}
org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error
org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"}
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error
org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"}
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error
org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"}
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning
org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"}
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning
org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"}
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning
org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()}
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning
org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false}
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning
org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false}
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"}
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true}
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true}
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning
org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")}
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error
org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"}

View File

@ -0,0 +1,13 @@
eclipse.preferences.version=1
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
environment/project/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/delimiter=\:
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/operation=append
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LLVM_HOME/value=/usr/lib/llvm-6.0
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/delimiter=\:
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/operation=append
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/LLVM_HOME/value=/usr/lib/llvm-6.0
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
environment/project/cdt.managedbuild.config.gnu.exe.release.1745230171/appendContributed=true

View File

@ -0,0 +1,37 @@
eclipse.preferences.version=1
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/CPATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/CPATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/CPLUS_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/CPLUS_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/C_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/C_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPLUS_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/CPLUS_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/C_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/C_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPLUS_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/CPLUS_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/C_INCLUDE_PATH/delimiter=\:
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/C_INCLUDE_PATH/operation=remove
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
environment/buildEnvironmentInclude/cdt.managedbuild.config.gnu.exe.release.1745230171/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/LIBRARY_PATH/delimiter=\:
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.debug.1751741082/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LIBRARY_PATH/delimiter=\:
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171.1259602404/appendContributed=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/delimiter=\:
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/LIBRARY_PATH/operation=remove
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/append=true
environment/buildEnvironmentLibrary/cdt.managedbuild.config.gnu.exe.release.1745230171/appendContributed=true

View File

@ -1,153 +1,140 @@
cmake_minimum_required(VERSION 3.18) cmake_minimum_required(VERSION 3.12)
list(APPEND CMAKE_MODULE_PATH ${CMAKE_CURRENT_SOURCE_DIR}/cmake) ###############################################################################
# ##############################################################################
# #
# ############################################################################## ###############################################################################
project(dbt-rise-tgc VERSION 1.0.0) project(dbt-rise-tgc VERSION 1.0.0)
include(GNUInstallDirs) include(GNUInstallDirs)
include(flink)
find_package(elfio QUIET) find_package(elfio QUIET)
find_package(Boost COMPONENTS coroutine)
find_package(jsoncpp) find_package(jsoncpp)
find_package(Boost COMPONENTS coroutine REQUIRED)
if(WITH_LLVM)
if(DEFINED ENV{LLVM_HOME})
find_path (LLVM_DIR LLVM-Config.cmake $ENV{LLVM_HOME}/lib/cmake/llvm)
endif(DEFINED ENV{LLVM_HOME})
find_package(LLVM REQUIRED CONFIG)
message(STATUS "Found LLVM ${LLVM_PACKAGE_VERSION}")
message(STATUS "Using LLVMConfig.cmake in: ${LLVM_DIR}")
llvm_map_components_to_libnames(llvm_libs support core mcjit x86codegen x86asmparser)
endif()
#Mac needed variables (adapt for your needs - http://www.cmake.org/Wiki/CMake_RPATH_handling#Mac_OS_X_and_the_RPATH)
#set(CMAKE_MACOSX_RPATH ON)
#set(CMAKE_SKIP_BUILD_RPATH FALSE)
#set(CMAKE_BUILD_WITH_INSTALL_RPATH FALSE)
#set(CMAKE_INSTALL_RPATH "${CMAKE_INSTALL_PREFIX}/lib")
#set(CMAKE_INSTALL_RPATH_USE_LINK_PATH TRUE)
add_subdirectory(softfloat) add_subdirectory(softfloat)
set(LIB_SOURCES set(LIB_SOURCES
src/iss/plugin/instruction_count.cpp src/iss/plugin/instruction_count.cpp
src/iss/arch/tgc5c.cpp src/iss/arch/tgc_c.cpp
src/vm/interp/vm_tgc5c.cpp src/vm/interp/vm_tgc_c.cpp
src/vm/fp_functions.cpp src/vm/fp_functions.cpp
src/iss/debugger/csr_names.cpp
src/iss/semihosting/semihosting.cpp
) )
if(WITH_TCC)
list(APPEND LIB_SOURCES
src/vm/tcc/vm_tgc5c.cpp
)
endif()
if(WITH_LLVM)
list(APPEND LIB_SOURCES
src/vm/llvm/vm_tgc5c.cpp
src/vm/llvm/fp_impl.cpp
)
endif()
if(WITH_ASMJIT)
list(APPEND LIB_SOURCES
src/vm/asmjit/vm_tgc5c.cpp
)
endif()
# library files # library files
FILE(GLOB GEN_ISS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/iss/arch/*.cpp) if(TARGET ${CORE_NAME}_cpp)
FILE(GLOB GEN_VM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/interp/vm_*.cpp) list(APPEND LIB_SOURCES ${${CORE_NAME}_OUTPUT_FILES})
FILE(GLOB GEN_YAML_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/contrib/instr/*.yaml) else()
list(APPEND LIB_SOURCES ${GEN_ISS_SOURCES} ${GEN_VM_SOURCES}) FILE(GLOB GEN_ISS_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/iss/arch/*.cpp)
FILE(GLOB GEN_VM_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/interp/vm_*.cpp)
list(APPEND LIB_SOURCES ${GEN_ISS_SOURCES} ${GEN_VM_SOURCES})
foreach(FILEPATH ${GEN_ISS_SOURCES})
get_filename_component(CORE ${FILEPATH} NAME_WE)
string(TOUPPER ${CORE} CORE)
list(APPEND LIB_DEFINES CORE_${CORE})
endforeach()
message("Defines are ${LIB_DEFINES}")
endif()
foreach(FILEPATH ${GEN_ISS_SOURCES}) if(TARGET RapidJSON OR TARGET RapidJSON::RapidJSON)
get_filename_component(CORE ${FILEPATH} NAME_WE) list(APPEND LIB_SOURCES src/iss/plugin/cycle_estimate.cpp src/iss/plugin/pctrace.cpp)
string(TOUPPER ${CORE} CORE) endif()
list(APPEND LIB_DEFINES CORE_${CORE})
endforeach()
message(STATUS "Core defines are ${LIB_DEFINES}")
if(WITH_LLVM) if(WITH_LLVM)
FILE(GLOB LLVM_GEN_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/llvm/vm_*.cpp) FILE(GLOB LLVM_GEN_SOURCES
list(APPEND LIB_SOURCES ${LLVM_GEN_SOURCES}) ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/llvm/vm_*.cpp
)
list(APPEND LIB_SOURCES ${LLVM_GEN_SOURCES})
endif() endif()
if(WITH_TCC) if(WITH_TCC)
FILE(GLOB TCC_GEN_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/tcc/vm_*.cpp) FILE(GLOB TCC_GEN_SOURCES
list(APPEND LIB_SOURCES ${TCC_GEN_SOURCES}) ${CMAKE_CURRENT_SOURCE_DIR}/src/vm/tcc/vm_*.cpp
endif() )
list(APPEND LIB_SOURCES ${TCC_GEN_SOURCES})
if(WITH_ASMJIT)
FILE(GLOB TCC_GEN_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/vm/asmjit/vm_*.cpp)
list(APPEND LIB_SOURCES ${TCC_GEN_SOURCES})
endif()
if(TARGET yaml-cpp::yaml-cpp)
list(APPEND LIB_SOURCES
src/iss/plugin/cycle_estimate.cpp
src/iss/plugin/instruction_count.cpp
)
endif() endif()
# Define the library # Define the library
add_library(${PROJECT_NAME} SHARED ${LIB_SOURCES}) add_library(${PROJECT_NAME} ${LIB_SOURCES})
# list code gen dependencies
if(TARGET ${CORE_NAME}_cpp)
add_dependencies(${PROJECT_NAME} ${CORE_NAME}_cpp)
endif()
if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU") if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU")
target_compile_options(${PROJECT_NAME} PRIVATE -Wno-shift-count-overflow) target_compile_options(${PROJECT_NAME} PRIVATE -Wno-shift-count-overflow)
elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") elseif("${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
target_compile_options(${PROJECT_NAME} PRIVATE /wd4293) target_compile_options(${PROJECT_NAME} PRIVATE /wd4293)
endif() endif()
target_include_directories(${PROJECT_NAME} PUBLIC src) target_include_directories(${PROJECT_NAME} PUBLIC src)
target_include_directories(${PROJECT_NAME} PUBLIC src-gen) target_include_directories(${PROJECT_NAME} PUBLIC src-gen)
target_link_libraries(${PROJECT_NAME} PUBLIC softfloat scc-util Boost::coroutine)
target_force_link_libraries(${PROJECT_NAME} PRIVATE dbt-rise-core) if(TARGET jsoncpp::jsoncpp)
target_link_libraries(${PROJECT_NAME} PUBLIC jsoncpp::jsoncpp)
# only re-export the include paths else()
get_target_property(DBT_CORE_INCL dbt-rise-core INTERFACE_INCLUDE_DIRECTORIES) target_link_libraries(${PROJECT_NAME} PUBLIC jsoncpp)
target_include_directories(${PROJECT_NAME} INTERFACE ${DBT_CORE_INCL}) endif()
get_target_property(DBT_CORE_DEFS dbt-rise-core INTERFACE_COMPILE_DEFINITIONS) if("${CMAKE_CXX_COMPILER_ID}" STREQUAL "GNU" AND BUILD_SHARED_LIBS)
target_link_libraries(${PROJECT_NAME} PUBLIC -Wl,--whole-archive dbt-rise-core -Wl,--no-whole-archive)
if(NOT(DBT_CORE_DEFS STREQUAL DBT_CORE_DEFS-NOTFOUND)) else()
target_compile_definitions(${PROJECT_NAME} INTERFACE ${DBT_CORE_DEFS}) target_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-core)
endif()
if(TARGET elfio::elfio)
target_link_libraries(${PROJECT_NAME} PUBLIC elfio::elfio)
else()
message(FATAL_ERROR "No elfio library found, maybe a find_package() call is missing")
endif()
if(TARGET lz4::lz4)
target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_LZ4)
target_link_libraries(${PROJECT_NAME} PUBLIC lz4::lz4)
endif()
if(TARGET RapidJSON::RapidJSON)
target_link_libraries(${PROJECT_NAME} PUBLIC RapidJSON::RapidJSON)
elseif(TARGET RapidJSON)
target_link_libraries(${PROJECT_NAME} PUBLIC RapidJSON)
endif() endif()
target_link_libraries(${PROJECT_NAME} PUBLIC elfio::elfio softfloat scc-util Boost::coroutine)
if(TARGET yaml-cpp::yaml-cpp)
target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_PLUGINS)
target_link_libraries(${PROJECT_NAME} PUBLIC yaml-cpp::yaml-cpp)
endif()
if(WITH_LLVM)
find_package(LLVM)
target_compile_definitions(${PROJECT_NAME} PUBLIC ${LLVM_DEFINITIONS})
target_include_directories(${PROJECT_NAME} PUBLIC ${LLVM_INCLUDE_DIRS})
if(BUILD_SHARED_LIBS)
target_link_libraries(${PROJECT_NAME} PUBLIC ${LLVM_LIBRARIES})
endif()
endif()
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
FRAMEWORK FALSE FRAMEWORK FALSE
) )
install(TARGETS ${PROJECT_NAME} COMPONENT ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME} COMPONENT ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} # headers for mac (note the different component -> different package) PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} # headers for mac (note the different component -> different package)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers
) )
install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/incl/iss COMPONENT ${PROJECT_NAME} install(DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/incl/iss COMPONENT ${PROJECT_NAME}
DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # target directory DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # target directory
FILES_MATCHING # install only matched files FILES_MATCHING # install only matched files
PATTERN "*.h" # select header files PATTERN "*.h" # select header files
) )
install(FILES ${GEN_YAML_SOURCES} DESTINATION share/tgc-vp) ###############################################################################
# ##############################################################################
# #
# ############################################################################## ###############################################################################
set(CMAKE_INSTALL_RPATH $ORIGIN/../${CMAKE_INSTALL_LIBDIR})
project(tgc-sim) project(tgc-sim)
find_package(Boost COMPONENTS program_options thread REQUIRED) find_package(Boost COMPONENTS program_options thread REQUIRED)
add_executable(${PROJECT_NAME} src/main.cpp) add_executable(${PROJECT_NAME} src/main.cpp)
if(TARGET ${CORE_NAME}_cpp) if(TARGET ${CORE_NAME}_cpp)
list(APPEND TGC_SOURCES ${${CORE_NAME}_OUTPUT_FILES}) list(APPEND TGC_SOURCES ${${CORE_NAME}_OUTPUT_FILES})
else() else()
@ -159,112 +146,78 @@ else()
endif() endif()
foreach(F IN LISTS TGC_SOURCES) foreach(F IN LISTS TGC_SOURCES)
if(${F} MATCHES ".*/arch/([^/]*)\.cpp") if (${F} MATCHES ".*/arch/([^/]*)\.cpp")
string(REGEX REPLACE ".*/([^/]*)\.cpp" "\\1" CORE_NAME_LC ${F}) string(REGEX REPLACE ".*/([^/]*)\.cpp" "\\1" CORE_NAME_LC ${F})
string(TOUPPER ${CORE_NAME_LC} CORE_NAME) string(TOUPPER ${CORE_NAME_LC} CORE_NAME)
target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME}) target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME})
endif() endif()
endforeach() endforeach()
# if(WITH_LLVM) if(WITH_LLVM)
# target_compile_definitions(${PROJECT_NAME} PRIVATE WITH_LLVM) target_compile_definitions(${PROJECT_NAME} PRIVATE WITH_LLVM)
# #target_link_libraries(${PROJECT_NAME} PUBLIC ${llvm_libs}) target_link_libraries(${PROJECT_NAME} PUBLIC ${llvm_libs})
# endif() endif()
# if(WITH_TCC) if(WITH_TCC)
# target_compile_definitions(${PROJECT_NAME} PRIVATE WITH_TCC) target_compile_definitions(${PROJECT_NAME} PRIVATE WITH_TCC)
# endif() endif()
target_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-tgc fmt::fmt) # Links the target exe against the libraries
target_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-tgc)
if(TARGET Boost::program_options) if(TARGET Boost::program_options)
target_link_libraries(${PROJECT_NAME} PUBLIC Boost::program_options) target_link_libraries(${PROJECT_NAME} PUBLIC Boost::program_options)
else() else()
target_link_libraries(${PROJECT_NAME} PUBLIC ${BOOST_program_options_LIBRARY}) target_link_libraries(${PROJECT_NAME} PUBLIC ${BOOST_program_options_LIBRARY})
endif() endif()
target_link_libraries(${PROJECT_NAME} PUBLIC ${CMAKE_DL_LIBS}) target_link_libraries(${PROJECT_NAME} PUBLIC ${CMAKE_DL_LIBS})
if (Tcmalloc_FOUND)
if(Tcmalloc_FOUND)
target_link_libraries(${PROJECT_NAME} PUBLIC ${Tcmalloc_LIBRARIES}) target_link_libraries(${PROJECT_NAME} PUBLIC ${Tcmalloc_LIBRARIES})
endif(Tcmalloc_FOUND) endif(Tcmalloc_FOUND)
install(TARGETS tgc-sim install(TARGETS tgc-sim
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} # headers for mac (note the different component -> different package) PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/${PROJECT_NAME} # headers for mac (note the different component -> different package)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers
) )
###############################################################################
if(BUILD_TESTING)
# ... CMake code to create tests ...
add_test(NAME tgc-sim-interp
COMMAND tgc-sim -f ${CMAKE_BINARY_DIR}/../../Firmwares/hello-world/hello --backend interp)
if(WITH_TCC)
add_test(NAME tgc-sim-tcc
COMMAND tgc-sim -f ${CMAKE_BINARY_DIR}/../../Firmwares/hello-world/hello --backend tcc)
endif()
if(WITH_LLVM)
add_test(NAME tgc-sim-llvm
COMMAND tgc-sim -f ${CMAKE_BINARY_DIR}/../../Firmwares/hello-world/hello --backend llvm)
endif()
if(WITH_ASMJIT)
add_test(NAME tgc-sim-asmjit
COMMAND tgc-sim -f ${CMAKE_BINARY_DIR}/../../Firmwares/hello-world/hello --backend asmjit)
endif()
endif()
# ##############################################################################
# #
# ############################################################################## ###############################################################################
if(TARGET scc-sysc) if(TARGET scc-sysc)
project(dbt-rise-tgc_sc VERSION 1.0.0) project(dbt-rise-tgc_sc VERSION 1.0.0)
set(LIB_SOURCES add_library(${PROJECT_NAME}
src/sysc/core_complex.cpp src/sysc/core_complex.cpp
src/sysc/register_tgc_c.cpp src/sysc/register_tgc_c.cpp
) )
FILE(GLOB GEN_SC_SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/src-gen/sysc/register_*.cpp)
list(APPEND LIB_SOURCES ${GEN_SC_SOURCES})
add_library(${PROJECT_NAME} ${LIB_SOURCES})
target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_SYSTEMC) target_compile_definitions(${PROJECT_NAME} PUBLIC WITH_SYSTEMC)
target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME}) target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME})
foreach(F IN LISTS TGC_SOURCES) foreach(F IN LISTS TGC_SOURCES)
if(${F} MATCHES ".*/arch/([^/]*)\.cpp") if (${F} MATCHES ".*/arch/([^/]*)\.cpp")
string(REGEX REPLACE ".*/([^/]*)\.cpp" "\\1" CORE_NAME_LC ${F}) string(REGEX REPLACE ".*/([^/]*)\.cpp" "\\1" CORE_NAME_LC ${F})
string(TOUPPER ${CORE_NAME_LC} CORE_NAME) string(TOUPPER ${CORE_NAME_LC} CORE_NAME)
target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME}) target_compile_definitions(${PROJECT_NAME} PRIVATE CORE_${CORE_NAME})
endif() endif()
endforeach() endforeach()
target_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-tgc scc-sysc) target_link_libraries(${PROJECT_NAME} PUBLIC dbt-rise-tgc scc-sysc)
if(WITH_LLVM)
# if(WITH_LLVM) target_link_libraries(${PROJECT_NAME} PUBLIC ${llvm_libs})
# target_link_libraries(${PROJECT_NAME} PUBLIC ${llvm_libs}) endif()
# endif()
set(LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/sysc/core_complex.h) set(LIB_HEADERS ${CMAKE_CURRENT_SOURCE_DIR}/src/sysc/core_complex.h)
set_target_properties(${PROJECT_NAME} PROPERTIES set_target_properties(${PROJECT_NAME} PROPERTIES
VERSION ${PROJECT_VERSION} VERSION ${PROJECT_VERSION}
FRAMEWORK FALSE FRAMEWORK FALSE
PUBLIC_HEADER "${LIB_HEADERS}" # specify the public headers PUBLIC_HEADER "${LIB_HEADERS}" # specify the public headers
) )
install(TARGETS ${PROJECT_NAME} COMPONENT ${PROJECT_NAME} install(TARGETS ${PROJECT_NAME} COMPONENT ${PROJECT_NAME}
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} # static lib
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR} # binaries
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} # shared lib
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} # for mac
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sysc # headers for mac (note the different component -> different package) PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR}/sysc # headers for mac (note the different component -> different package)
INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers INCLUDES DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} # headers
) )
endif() endif()
project(elfio-test)
find_package(Boost COMPONENTS program_options thread REQUIRED)
add_executable(${PROJECT_NAME} src/elfio.cpp)
target_link_libraries(${PROJECT_NAME} PUBLIC elfio::elfio)

View File

@ -1,623 +1,536 @@
RVI: RV32I:
LUI: - LUI:
index: 0
encoding: 0b00000000000000000000000000110111 encoding: 0b00000000000000000000000000110111
mask: 0b00000000000000000000000001111111 mask: 0b00000000000000000000000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
AUIPC: - AUIPC:
index: 1
encoding: 0b00000000000000000000000000010111 encoding: 0b00000000000000000000000000010111
mask: 0b00000000000000000000000001111111 mask: 0b00000000000000000000000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
JAL: - JAL:
index: 2
encoding: 0b00000000000000000000000001101111 encoding: 0b00000000000000000000000001101111
mask: 0b00000000000000000000000001111111 mask: 0b00000000000000000000000001111111
attributes: [[name:no_cont]]
size: 32 size: 32
branch: true branch: true
delay: 1 delay: 1
JALR: - JALR:
index: 3
encoding: 0b00000000000000000000000001100111 encoding: 0b00000000000000000000000001100111
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: 1
BEQ: - BEQ:
index: 4
encoding: 0b00000000000000000000000001100011 encoding: 0b00000000000000000000000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
BNE: - BNE:
index: 5
encoding: 0b00000000000000000001000001100011 encoding: 0b00000000000000000001000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
BLT: - BLT:
index: 6
encoding: 0b00000000000000000100000001100011 encoding: 0b00000000000000000100000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
BGE: - BGE:
index: 7
encoding: 0b00000000000000000101000001100011 encoding: 0b00000000000000000101000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
BLTU: - BLTU:
index: 8
encoding: 0b00000000000000000110000001100011 encoding: 0b00000000000000000110000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
BGEU: - BGEU:
index: 9
encoding: 0b00000000000000000111000001100011 encoding: 0b00000000000000000111000001100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:no_cont], [name:cond]]
size: 32 size: 32
branch: true branch: true
delay: [1,1] delay: [1,1]
LB: - LB:
index: 10
encoding: 0b00000000000000000000000000000011 encoding: 0b00000000000000000000000000000011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
LH: - LH:
index: 11
encoding: 0b00000000000000000001000000000011 encoding: 0b00000000000000000001000000000011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
LW: - LW:
index: 12
encoding: 0b00000000000000000010000000000011 encoding: 0b00000000000000000010000000000011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
LBU: - LBU:
index: 13
encoding: 0b00000000000000000100000000000011 encoding: 0b00000000000000000100000000000011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
LHU: - LHU:
index: 14
encoding: 0b00000000000000000101000000000011 encoding: 0b00000000000000000101000000000011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SB: - SB:
index: 15
encoding: 0b00000000000000000000000000100011 encoding: 0b00000000000000000000000000100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SH: - SH:
index: 16
encoding: 0b00000000000000000001000000100011 encoding: 0b00000000000000000001000000100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SW: - SW:
index: 17
encoding: 0b00000000000000000010000000100011 encoding: 0b00000000000000000010000000100011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
ADDI: - ADDI:
index: 18
encoding: 0b00000000000000000000000000010011 encoding: 0b00000000000000000000000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLTI: - SLTI:
index: 19
encoding: 0b00000000000000000010000000010011 encoding: 0b00000000000000000010000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLTIU: - SLTIU:
index: 20
encoding: 0b00000000000000000011000000010011 encoding: 0b00000000000000000011000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
XORI: - XORI:
index: 21
encoding: 0b00000000000000000100000000010011 encoding: 0b00000000000000000100000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
ORI: - ORI:
index: 22
encoding: 0b00000000000000000110000000010011 encoding: 0b00000000000000000110000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
ANDI: - ANDI:
index: 23
encoding: 0b00000000000000000111000000010011 encoding: 0b00000000000000000111000000010011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLLI: - SLLI:
index: 24
encoding: 0b00000000000000000001000000010011 encoding: 0b00000000000000000001000000010011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SRLI: - SRLI:
index: 25
encoding: 0b00000000000000000101000000010011 encoding: 0b00000000000000000101000000010011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SRAI: - SRAI:
index: 26
encoding: 0b01000000000000000101000000010011 encoding: 0b01000000000000000101000000010011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
ADD: - ADD:
index: 27
encoding: 0b00000000000000000000000000110011 encoding: 0b00000000000000000000000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SUB: - SUB:
index: 28
encoding: 0b01000000000000000000000000110011 encoding: 0b01000000000000000000000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLL: - SLL:
index: 29
encoding: 0b00000000000000000001000000110011 encoding: 0b00000000000000000001000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLT: - SLT:
index: 30
encoding: 0b00000000000000000010000000110011 encoding: 0b00000000000000000010000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SLTU: - SLTU:
index: 31
encoding: 0b00000000000000000011000000110011 encoding: 0b00000000000000000011000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
XOR: - XOR:
index: 32
encoding: 0b00000000000000000100000000110011 encoding: 0b00000000000000000100000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SRL: - SRL:
index: 33
encoding: 0b00000000000000000101000000110011 encoding: 0b00000000000000000101000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
SRA: - SRA:
index: 34
encoding: 0b01000000000000000101000000110011 encoding: 0b01000000000000000101000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
OR: - OR:
index: 35
encoding: 0b00000000000000000110000000110011 encoding: 0b00000000000000000110000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
AND: - AND:
index: 36
encoding: 0b00000000000000000111000000110011 encoding: 0b00000000000000000111000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
FENCE: - FENCE:
index: 37
encoding: 0b00000000000000000000000000001111 encoding: 0b00000000000000000000000000001111
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
ECALL: - ECALL:
index: 38
encoding: 0b00000000000000000000000001110011 encoding: 0b00000000000000000000000001110011
mask: 0b11111111111111111111111111111111 mask: 0b11111111111111111111111111111111
attributes: [[name:no_cont]] attributes: [[name:no_cont]]
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
EBREAK: - EBREAK:
index: 39
encoding: 0b00000000000100000000000001110011 encoding: 0b00000000000100000000000001110011
mask: 0b11111111111111111111111111111111 mask: 0b11111111111111111111111111111111
attributes: [[name:no_cont]] attributes: [[name:no_cont]]
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
MRET: - MRET:
index: 40
encoding: 0b00110000001000000000000001110011 encoding: 0b00110000001000000000000001110011
mask: 0b11111111111111111111111111111111 mask: 0b11111111111111111111111111111111
attributes: [[name:no_cont]] attributes: [[name:no_cont]]
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
WFI: - WFI:
index: 41
encoding: 0b00010000010100000000000001110011 encoding: 0b00010000010100000000000001110011
mask: 0b11111111111111111111111111111111 mask: 0b11111111111111111111111111111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
Zicsr: Zicsr:
CSRRW: - CSRRW:
index: 42
encoding: 0b00000000000000000001000001110011 encoding: 0b00000000000000000001000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
CSRRS: - CSRRS:
index: 43
encoding: 0b00000000000000000010000001110011 encoding: 0b00000000000000000010000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
CSRRC: - CSRRC:
index: 44
encoding: 0b00000000000000000011000001110011 encoding: 0b00000000000000000011000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
CSRRWI: - CSRRWI:
index: 45
encoding: 0b00000000000000000101000001110011 encoding: 0b00000000000000000101000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
CSRRSI: - CSRRSI:
index: 46
encoding: 0b00000000000000000110000001110011 encoding: 0b00000000000000000110000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
CSRRCI: - CSRRCI:
index: 47
encoding: 0b00000000000000000111000001110011 encoding: 0b00000000000000000111000001110011
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
Zifencei: Zifencei:
FENCE_I: - FENCE_I:
index: 48
encoding: 0b00000000000000000001000000001111 encoding: 0b00000000000000000001000000001111
mask: 0b00000000000000000111000001111111 mask: 0b00000000000000000111000001111111
attributes: [[name:flush]] attributes: [[name:flush]]
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
RVM: RV32M:
MUL: - MUL:
index: 49
encoding: 0b00000010000000000000000000110011 encoding: 0b00000010000000000000000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
MULH: - MULH:
index: 50
encoding: 0b00000010000000000001000000110011 encoding: 0b00000010000000000001000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
MULHSU: - MULHSU:
index: 51
encoding: 0b00000010000000000010000000110011 encoding: 0b00000010000000000010000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
MULHU: - MULHU:
index: 52
encoding: 0b00000010000000000011000000110011 encoding: 0b00000010000000000011000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
DIV: - DIV:
index: 53
encoding: 0b00000010000000000100000000110011 encoding: 0b00000010000000000100000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
DIVU: - DIVU:
index: 54
encoding: 0b00000010000000000101000000110011 encoding: 0b00000010000000000101000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
REM: - REM:
index: 55
encoding: 0b00000010000000000110000000110011 encoding: 0b00000010000000000110000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
REMU: - REMU:
index: 56
encoding: 0b00000010000000000111000000110011 encoding: 0b00000010000000000111000000110011
mask: 0b11111110000000000111000001111111 mask: 0b11111110000000000111000001111111
size: 32 size: 32
branch: false branch: false
delay: 1 delay: 1
Zca: RV32IC:
C__ADDI4SPN: - CADDI4SPN:
index: 57
encoding: 0b0000000000000000 encoding: 0b0000000000000000
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__LW: - CLW:
index: 58
encoding: 0b0100000000000000 encoding: 0b0100000000000000
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__SW: - CSW:
index: 59
encoding: 0b1100000000000000 encoding: 0b1100000000000000
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__ADDI: - CADDI:
index: 60
encoding: 0b0000000000000001 encoding: 0b0000000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__NOP: - CNOP:
index: 61
encoding: 0b0000000000000001 encoding: 0b0000000000000001
mask: 0b1110111110000011 mask: 0b1110111110000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__JAL: - CJAL:
index: 62
encoding: 0b0010000000000001 encoding: 0b0010000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
attributes: [[name:enable, value:1]] attributes: [[name:no_cont]]
size: 16 size: 16
branch: true branch: true
delay: 1 delay: 1
C__LI: - CLI:
index: 63
encoding: 0b0100000000000001 encoding: 0b0100000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__LUI: - CLUI:
index: 64
encoding: 0b0110000000000001 encoding: 0b0110000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__ADDI16SP: - CADDI16SP:
index: 65
encoding: 0b0110000100000001 encoding: 0b0110000100000001
mask: 0b1110111110000011 mask: 0b1110111110000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
__reserved_clui: - CSRLI:
index: 66
encoding: 0b0110000000000001
mask: 0b1111000001111111
size: 16
branch: false
delay: 1
C__SRLI:
index: 67
encoding: 0b1000000000000001 encoding: 0b1000000000000001
mask: 0b1111110000000011 mask: 0b1111110000000011
attributes: [[name:enable, value:1]]
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__SRAI: - CSRAI:
index: 68
encoding: 0b1000010000000001 encoding: 0b1000010000000001
mask: 0b1111110000000011 mask: 0b1111110000000011
attributes: [[name:enable, value:1]]
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__ANDI: - CANDI:
index: 69
encoding: 0b1000100000000001 encoding: 0b1000100000000001
mask: 0b1110110000000011 mask: 0b1110110000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__SUB: - CSUB:
index: 70
encoding: 0b1000110000000001 encoding: 0b1000110000000001
mask: 0b1111110001100011 mask: 0b1111110001100011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__XOR: - CXOR:
index: 71
encoding: 0b1000110000100001 encoding: 0b1000110000100001
mask: 0b1111110001100011 mask: 0b1111110001100011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__OR: - COR:
index: 72
encoding: 0b1000110001000001 encoding: 0b1000110001000001
mask: 0b1111110001100011 mask: 0b1111110001100011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__AND: - CAND:
index: 73
encoding: 0b1000110001100001 encoding: 0b1000110001100001
mask: 0b1111110001100011 mask: 0b1111110001100011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__J: - CJ:
index: 74
encoding: 0b1010000000000001 encoding: 0b1010000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
attributes: [[name:no_cont]]
size: 16 size: 16
branch: true branch: true
delay: 1 delay: 1
C__BEQZ: - CBEQZ:
index: 75
encoding: 0b1100000000000001 encoding: 0b1100000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
attributes: [[name:no_cont], [name:cond]]
size: 16 size: 16
branch: true branch: true
delay: [1,1] delay: [1,1]
C__BNEZ: - CBNEZ:
index: 76
encoding: 0b1110000000000001 encoding: 0b1110000000000001
mask: 0b1110000000000011 mask: 0b1110000000000011
attributes: [[name:no_cont], [name:cond]]
size: 16 size: 16
branch: true branch: true
delay: [1,1] delay: [1,1]
C__SLLI: - CSLLI:
index: 77
encoding: 0b0000000000000010 encoding: 0b0000000000000010
mask: 0b1111000000000011 mask: 0b1111000000000011
attributes: [[name:enable, value:1]]
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__LWSP: - CLWSP:
index: 78
encoding: 0b0100000000000010 encoding: 0b0100000000000010
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__MV: - CMV:
index: 79
encoding: 0b1000000000000010 encoding: 0b1000000000000010
mask: 0b1111000000000011 mask: 0b1111000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__JR: - CJR:
index: 80
encoding: 0b1000000000000010 encoding: 0b1000000000000010
mask: 0b1111000001111111 mask: 0b1111000001111111
attributes: [[name:no_cont]]
size: 16 size: 16
branch: true branch: true
delay: 1 delay: 1
__reserved_cmv: - CADD:
index: 81
encoding: 0b1000000000000010
mask: 0b1111111111111111
size: 16
branch: false
delay: 1
C__ADD:
index: 82
encoding: 0b1001000000000010 encoding: 0b1001000000000010
mask: 0b1111000000000011 mask: 0b1111000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__JALR: - CJALR:
index: 83
encoding: 0b1001000000000010 encoding: 0b1001000000000010
mask: 0b1111000001111111 mask: 0b1111000001111111
attributes: [[name:no_cont]]
size: 16 size: 16
branch: true branch: true
delay: 1 delay: 1
C__EBREAK: - CEBREAK:
index: 84
encoding: 0b1001000000000010 encoding: 0b1001000000000010
mask: 0b1111111111111111 mask: 0b1111111111111111
attributes: [[name:no_cont]]
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
C__SWSP: - CSWSP:
index: 85
encoding: 0b1100000000000010 encoding: 0b1100000000000010
mask: 0b1110000000000011 mask: 0b1110000000000011
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1
DII: - DII:
index: 86
encoding: 0b0000000000000000 encoding: 0b0000000000000000
mask: 0b1111111111111111 mask: 0b1111111111111111
attributes: [[name:no_cont]]
size: 16 size: 16
branch: false branch: false
delay: 1 delay: 1

View File

@ -1,35 +0,0 @@
# according to https://github.com/horance-liu/flink.cmake/tree/master
# SPDX-License-Identifier: Apache-2.0
include(CMakeParseArguments)
function(target_do_force_link_libraries target visibility lib)
if(MSVC)
target_link_libraries(${target} ${visibility} "/WHOLEARCHIVE:${lib}")
elseif(APPLE)
target_link_libraries(${target} ${visibility} -Wl,-force_load ${lib})
else()
target_link_libraries(${target} ${visibility} -Wl,--whole-archive ${lib} -Wl,--no-whole-archive)
endif()
endfunction()
function(target_force_link_libraries target)
cmake_parse_arguments(FLINK
""
""
"PUBLIC;INTERFACE;PRIVATE"
${ARGN}
)
foreach(lib IN LISTS FLINK_PUBLIC)
target_do_force_link_libraries(${target} PUBLIC ${lib})
endforeach()
foreach(lib IN LISTS FLINK_INTERFACE)
target_do_force_link_libraries(${target} INTERFACE ${lib})
endforeach()
foreach(lib IN LISTS FLINK_PRIVATE)
target_do_force_link_libraries(${target} PRIVATE ${lib})
endforeach()
endfunction()

View File

@ -19,7 +19,7 @@ setenv CXX $COWAREHOME/SLS/linux/common/bin/g++
cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON -DBUILD_SHARED_LIBS=ON \ cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON -DBUILD_SHARED_LIBS=ON \
-DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT} -DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT}
cmake --build build/PA --target install -j16 cmake --build build/PA --target install -j16
cd dbt-rise-tgc/contrib/pa cd dbt-rise-tgc/contrib
# import the TGC core itself # import the TGC core itself
pct tgc_import_tb.tcl pct tgc_import_tb.tcl
``` ```
@ -37,7 +37,7 @@ export CXX=$COWAREHOME/SLS/linux/common/bin/g++
cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON -DBUILD_SHARED_LIBS=ON \ cmake -S . -B build/PA -DCMAKE_BUILD_TYPE=Debug -DUSE_CWR_SYSTEMC=ON -DBUILD_SHARED_LIBS=ON \
-DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT} -DCODEGEN=OFF -DCMAKE_INSTALL_PREFIX=${TGFS_INSTALL_ROOT}
cmake --build build/PA --target install -j16 cmake --build build/PA --target install -j16
cd dbt-rise-tgc/contrib/pa cd dbt-rise-tgc/contrib
# import the TGC core itself # import the TGC core itself
pct tgc_import_tb.tcl pct tgc_import_tb.tcl
``` ```

View File

@ -1 +0,0 @@
/*.yaml

View File

@ -1,650 +0,0 @@
RV32I:
ADD:
branch: false
delay: 1
encoding: 51
index: 27
mask: 4261441663
size: 32
ADDI:
branch: false
delay: 1
encoding: 19
index: 18
mask: 28799
size: 32
AND:
branch: false
delay: 1
encoding: 28723
index: 36
mask: 4261441663
size: 32
ANDI:
branch: false
delay: 1
encoding: 28691
index: 23
mask: 28799
size: 32
AUIPC:
branch: false
delay: 1
encoding: 23
index: 1
mask: 127
size: 32
BEQ:
branch: true
delay:
- 1
- 2
encoding: 99
index: 4
mask: 28799
size: 32
BGE:
branch: true
delay:
- 1
- 2
encoding: 20579
index: 7
mask: 28799
size: 32
BGEU:
branch: true
delay:
- 1
- 2
encoding: 28771
index: 9
mask: 28799
size: 32
BLT:
branch: true
delay:
- 1
- 2
encoding: 16483
index: 6
mask: 28799
size: 32
BLTU:
branch: true
delay:
- 1
- 2
encoding: 24675
index: 8
mask: 28799
size: 32
BNE:
branch: true
delay:
- 1
- 2
encoding: 4195
index: 5
mask: 28799
size: 32
EBREAK:
attributes:
- - name:no_cont
branch: false
delay: 3
encoding: 1048691
index: 39
mask: 4294967295
size: 32
ECALL:
attributes:
- - name:no_cont
branch: false
delay: 1
encoding: 115
index: 38
mask: 4294967295
size: 32
FENCE:
branch: false
delay: 1
encoding: 15
index: 37
mask: 28799
size: 32
JAL:
branch: true
delay: 2
encoding: 111
index: 2
mask: 127
size: 32
JALR:
branch: true
delay: 2
encoding: 103
index: 3
mask: 28799
size: 32
LB:
branch: false
delay: 2
encoding: 3
index: 10
mask: 28799
size: 32
LBU:
branch: false
delay: 2
encoding: 16387
index: 13
mask: 28799
size: 32
LH:
branch: false
delay: 2
encoding: 4099
index: 11
mask: 28799
size: 32
LHU:
branch: false
delay: 2
encoding: 20483
index: 14
mask: 28799
size: 32
LUI:
branch: false
delay: 1
encoding: 55
index: 0
mask: 127
size: 32
LW:
branch: false
delay: 2
encoding: 8195
index: 12
mask: 28799
size: 32
MRET:
attributes:
- - name:no_cont
branch: false
delay: 2
encoding: 807403635
index: 40
mask: 4294967295
size: 32
OR:
branch: false
delay: 1
encoding: 24627
index: 35
mask: 4261441663
size: 32
ORI:
branch: false
delay: 1
encoding: 24595
index: 22
mask: 28799
size: 32
SB:
branch: false
delay: 1
encoding: 35
index: 15
mask: 28799
size: 32
SH:
branch: false
delay: 1
encoding: 4131
index: 16
mask: 28799
size: 32
SLL:
branch: false
delay: X_24:20
encoding: 4147
index: 29
mask: 4261441663
size: 32
SLLI:
branch: false
delay: u_24:20
encoding: 4115
index: 24
mask: 4261441663
size: 32
SLT:
branch: false
delay: 1
encoding: 8243
index: 30
mask: 4261441663
size: 32
SLTI:
branch: false
delay: 1
encoding: 8211
index: 19
mask: 28799
size: 32
SLTIU:
branch: false
delay: 1
encoding: 12307
index: 20
mask: 28799
size: 32
SLTU:
branch: false
delay: 1
encoding: 12339
index: 31
mask: 4261441663
size: 32
SRA:
branch: false
delay: X_24:20
encoding: 1073762355
index: 34
mask: 4261441663
size: 32
SRAI:
branch: false
delay: u_24:20
encoding: 1073762323
index: 26
mask: 4261441663
size: 32
SRL:
branch: false
delay: X_24:20
encoding: 20531
index: 33
mask: 4261441663
size: 32
SRLI:
branch: false
delay: u_24:20
encoding: 20499
index: 25
mask: 4261441663
size: 32
SUB:
branch: false
delay: 1
encoding: 1073741875
index: 28
mask: 4261441663
size: 32
SW:
branch: false
delay: 1
encoding: 8227
index: 17
mask: 28799
size: 32
WFI:
branch: false
delay: 1
encoding: 273678451
index: 41
mask: 4294967295
size: 32
XOR:
branch: false
delay: 1
encoding: 16435
index: 32
mask: 4261441663
size: 32
XORI:
branch: false
delay: 1
encoding: 16403
index: 21
mask: 28799
size: 32
RV32M:
DIV:
branch: false
delay: 33
encoding: 33570867
index: 53
mask: 4261441663
size: 32
DIVU:
branch: false
delay: 33
encoding: 33574963
index: 54
mask: 4261441663
size: 32
MUL:
branch: false
delay: 32
encoding: 33554483
index: 49
mask: 4261441663
size: 32
MULH:
branch: false
delay: 32
encoding: 33558579
index: 50
mask: 4261441663
size: 32
MULHSU:
branch: false
delay: 32
encoding: 33562675
index: 51
mask: 4261441663
size: 32
MULHU:
branch: false
delay: 32
encoding: 33566771
index: 52
mask: 4261441663
size: 32
REM:
branch: false
delay: 33
encoding: 33579059
index: 55
mask: 4261441663
size: 32
REMU:
branch: false
delay: 33
encoding: 33583155
index: 56
mask: 4261441663
size: 32
Zca:
C__ADD:
branch: false
delay: 1
encoding: 36866
index: 82
mask: 61443
size: 16
C__ADDI:
branch: false
delay: 1
encoding: 1
index: 60
mask: 57347
size: 16
C__ADDI16SP:
branch: false
delay: 1
encoding: 24833
index: 65
mask: 61315
size: 16
C__ADDI4SPN:
branch: false
delay: 1
encoding: 0
index: 57
mask: 57347
size: 16
C__AND:
branch: false
delay: 1
encoding: 35937
index: 73
mask: 64611
size: 16
C__ANDI:
branch: false
delay: 1
encoding: 34817
index: 69
mask: 60419
size: 16
C__BEQZ:
branch: true
delay:
- 1
- 2
encoding: 49153
index: 75
mask: 57347
size: 16
C__BNEZ:
branch: true
delay:
- 1
- 2
encoding: 57345
index: 76
mask: 57347
size: 16
C__EBREAK:
branch: false
delay: 3
encoding: 36866
index: 84
mask: 65535
size: 16
C__J:
branch: true
delay: 1
encoding: 40961
index: 74
mask: 57347
size: 16
C__JAL:
attributes:
- - name:enable
- value:1
branch: true
delay: 1
encoding: 8193
index: 62
mask: 57347
size: 16
C__JALR:
branch: true
delay: 1
encoding: 36866
index: 83
mask: 61567
size: 16
C__JR:
branch: true
delay: 1
encoding: 32770
index: 80
mask: 61567
size: 16
C__LI:
branch: false
delay: 1
encoding: 16385
index: 63
mask: 57347
size: 16
C__LUI:
branch: false
delay: 1
encoding: 24577
index: 64
mask: 57347
size: 16
C__LW:
branch: false
delay: 2
encoding: 16384
index: 58
mask: 57347
size: 16
C__LWSP:
branch: false
delay: 2
encoding: 16386
index: 78
mask: 57347
size: 16
C__MV:
branch: false
delay: 1
encoding: 32770
index: 79
mask: 61443
size: 16
C__NOP:
branch: false
delay: 1
encoding: 1
index: 61
mask: 61315
size: 16
C__OR:
branch: false
delay: 1
encoding: 35905
index: 72
mask: 64611
size: 16
C__SLLI:
attributes:
- - name:enable
- value:1
branch: false
delay: u_12:12*16+u_6:2
encoding: 2
index: 77
mask: 61443
size: 16
C__SRAI:
attributes:
- - name:enable
- value:1
branch: false
delay: u_12:12*16+u_6:2
encoding: 33793
index: 68
mask: 64515
size: 16
C__SRLI:
attributes:
- - name:enable
- value:1
branch: false
delay: u_12:12*16+u_6:2
encoding: 32769
index: 67
mask: 64515
size: 16
C__SUB:
branch: false
delay: 1
encoding: 35841
index: 70
mask: 64611
size: 16
C__SW:
branch: false
delay: 1
encoding: 49152
index: 59
mask: 57347
size: 16
C__SWSP:
branch: false
delay: 1
encoding: 49154
index: 85
mask: 57347
size: 16
C__XOR:
branch: false
delay: 1
encoding: 35873
index: 71
mask: 64611
size: 16
DII:
branch: false
delay: 1
encoding: 0
index: 86
mask: 65535
size: 16
__reserved_clui:
branch: false
delay: 1
encoding: 24577
index: 66
mask: 61567
size: 16
__reserved_cmv:
branch: false
delay: 1
encoding: 32770
index: 81
mask: 65535
size: 16
Zicsr:
CSRRC:
branch: false
delay: 1
encoding: 12403
index: 44
mask: 28799
size: 32
CSRRCI:
branch: false
delay: 1
encoding: 28787
index: 47
mask: 28799
size: 32
CSRRS:
branch: false
delay: 1
encoding: 8307
index: 43
mask: 28799
size: 32
CSRRSI:
branch: false
delay: 1
encoding: 24691
index: 46
mask: 28799
size: 32
CSRRW:
branch: false
delay: 1
encoding: 4211
index: 42
mask: 28799
size: 32
CSRRWI:
branch: false
delay: 1
encoding: 20595
index: 45
mask: 28799
size: 32
Zifencei:
FENCE_I:
attributes:
- - name:flush
branch: false
delay: 1
encoding: 4111
index: 48
mask: 28799
size: 32

View File

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 25 KiB

View File

@ -1,8 +1,8 @@
import "ISA/RVI.core_desc" import "ISA/RV32I.core_desc"
import "ISA/RVM.core_desc" import "ISA/RVM.core_desc"
import "ISA/RVC.core_desc" import "ISA/RVC.core_desc"
Core TGC5C provides RV32I, Zicsr, Zifencei, RV32M, RV32IC { Core TGC_C provides RV32I, Zicsr, Zifencei, RV32M, RV32IC {
architectural_state { architectural_state {
XLEN=32; XLEN=32;
// definitions for the architecture wrapper // definitions for the architecture wrapper

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2024 MINRES Technologies GmbH * Copyright (C) 2017 - 2020 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -37,7 +37,6 @@ def getRegisterSizes(){
return regs return regs
} }
%> %>
// clang-format off
#include "${coreDef.name.toLowerCase()}.h" #include "${coreDef.name.toLowerCase()}.h"
#include "util/ities.h" #include "util/ities.h"
#include <util/logging.h> #include <util/logging.h>
@ -47,10 +46,10 @@ def getRegisterSizes(){
using namespace iss::arch; using namespace iss::arch;
constexpr std::array<const char*, ${registers.size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names; constexpr std::array<const char*, ${registers.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names;
constexpr std::array<const char*, ${registers.size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases; constexpr std::array<const char*, ${registers.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases;
constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths; constexpr std::array<const uint32_t, ${getRegisterSizes().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths;
constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets; constexpr std::array<const uint32_t, ${getRegisterSizes().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets;
${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() = default; ${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() = default;
@ -71,7 +70,7 @@ uint8_t *${coreDef.name.toLowerCase()}::get_regs_base_ptr() {
return reinterpret_cast<uint8_t*>(&reg); return reinterpret_cast<uint8_t*>(&reg);
} }
${coreDef.name.toLowerCase()}::phys_addr_t ${coreDef.name.toLowerCase()}::virt2phys(const iss::addr_t &addr) { ${coreDef.name.toLowerCase()}::phys_addr_t ${coreDef.name.toLowerCase()}::virt2phys(const iss::addr_t &pc) {
return phys_addr_t(addr.access, addr.space, addr.val&traits<${coreDef.name.toLowerCase()}>::addr_mask); return phys_addr_t(pc); // change logical address to physical address
} }
// clang-format on

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2024 MINRES Technologies GmbH * Copyright (C) 2017 - 2021 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -55,12 +55,12 @@ def byteSize(int size){
return 128; return 128;
} }
def getCString(def val){ def getCString(def val){
return val.toString()+'ULL' return val.toString()
} }
%> %>
#ifndef _${coreDef.name.toUpperCase()}_H_ #ifndef _${coreDef.name.toUpperCase()}_H_
#define _${coreDef.name.toUpperCase()}_H_ #define _${coreDef.name.toUpperCase()}_H_
// clang-format off
#include <array> #include <array>
#include <iss/arch/traits.h> #include <iss/arch/traits.h>
#include <iss/arch_if.h> #include <iss/arch_if.h>
@ -75,11 +75,11 @@ template <> struct traits<${coreDef.name.toLowerCase()}> {
constexpr static char const* const core_type = "${coreDef.name}"; constexpr static char const* const core_type = "${coreDef.name}";
static constexpr std::array<const char*, ${registers.size()}> reg_names{ static constexpr std::array<const char*, ${registers.size}> reg_names{
{"${registers.collect{it.name.toLowerCase()}.join('", "')}"}}; {"${registers.collect{it.name}.join('", "')}"}};
static constexpr std::array<const char*, ${registers.size()}> reg_aliases{ static constexpr std::array<const char*, ${registers.size}> reg_aliases{
{"${registers.collect{it.alias.toLowerCase()}.join('", "')}"}}; {"${registers.collect{it.alias}.join('", "')}"}};
enum constants {${constants.collect{c -> c.name+"="+getCString(c.value)}.join(', ')}}; enum constants {${constants.collect{c -> c.name+"="+getCString(c.value)}.join(', ')}};
@ -99,17 +99,17 @@ template <> struct traits<${coreDef.name.toLowerCase()}> {
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>; using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
static constexpr std::array<const uint32_t, ${getRegisterSizes().size()}> reg_bit_widths{ static constexpr std::array<const uint32_t, ${getRegisterSizes().size}> reg_bit_widths{
{${getRegisterSizes().join(',')}}}; {${getRegisterSizes().join(',')}}};
static constexpr std::array<const uint32_t, ${getRegisterOffsets().size()}> reg_byte_offsets{ static constexpr std::array<const uint32_t, ${getRegisterOffsets().size}> reg_byte_offsets{
{${getRegisterOffsets().join(',')}}}; {${getRegisterOffsets().join(',')}}};
static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1); static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1);
enum sreg_flag_e { FLAGS }; enum sreg_flag_e { FLAGS };
enum mem_type_e { ${spaces.collect{it.name}.join(', ')}, IMEM = MEM }; enum mem_type_e { ${spaces.collect{it.name}.join(', ')} };
enum class opcode_e {<%instructions.eachWithIndex{instr, index -> %> enum class opcode_e {<%instructions.eachWithIndex{instr, index -> %>
${instr.instruction.name} = ${index},<%}%> ${instr.instruction.name} = ${index},<%}%>
@ -137,6 +137,14 @@ struct ${coreDef.name.toLowerCase()}: public arch_if {
inline uint64_t stop_code() { return interrupt_sim; } inline uint64_t stop_code() { return interrupt_sim; }
inline phys_addr_t v2p(const iss::addr_t& addr){
if (addr.space != traits<${coreDef.name.toLowerCase()}>::MEM || addr.type == iss::address_type::PHYSICAL ||
addr_mode[static_cast<uint16_t>(addr.access)&0x3]==address_type::PHYSICAL) {
return phys_addr_t(addr.access, addr.space, addr.val&traits<${coreDef.name.toLowerCase()}>::addr_mask);
} else
return virt2phys(addr);
}
virtual phys_addr_t virt2phys(const iss::addr_t& addr); virtual phys_addr_t virt2phys(const iss::addr_t& addr);
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; } virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
@ -174,4 +182,3 @@ if(fcsr != null) {%>
} }
} }
#endif /* _${coreDef.name.toUpperCase()}_H_ */ #endif /* _${coreDef.name.toUpperCase()}_H_ */
// clang-format on

View File

@ -0,0 +1,86 @@
#include "${coreDef.name.toLowerCase()}.h"
#include <vector>
#include <array>
#include <cstdlib>
#include <algorithm>
namespace iss {
namespace arch {
namespace {
// according to
// https://stackoverflow.com/questions/8871204/count-number-of-1s-in-binary-representation
#ifdef __GCC__
constexpr size_t bit_count(uint32_t u) { return __builtin_popcount(u); }
#elif __cplusplus < 201402L
constexpr size_t uCount(uint32_t u) { return u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111); }
constexpr size_t bit_count(uint32_t u) { return ((uCount(u) + (uCount(u) >> 3)) & 030707070707) % 63; }
#else
constexpr size_t bit_count(uint32_t u) {
size_t uCount = u - ((u >> 1) & 033333333333) - ((u >> 2) & 011111111111);
return ((uCount + (uCount >> 3)) & 030707070707) % 63;
}
#endif
using opcode_e = traits<${coreDef.name.toLowerCase()}>::opcode_e;
/****************************************************************************
* start opcode definitions
****************************************************************************/
struct instruction_desriptor {
size_t length;
uint32_t value;
uint32_t mask;
opcode_e op;
};
const std::array<instruction_desriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
{${instr.length}, ${instr.encoding}, ${instr.mask}, opcode_e::${instr.instruction.name}},<%}%>
}};
}
template<>
struct instruction_decoder<${coreDef.name.toLowerCase()}> {
using opcode_e = traits<${coreDef.name.toLowerCase()}>::opcode_e;
using code_word_t=traits<${coreDef.name.toLowerCase()}>::code_word_t;
struct instruction_pattern {
uint32_t value;
uint32_t mask;
opcode_e id;
};
std::array<std::vector<instruction_pattern>, 4> qlut;
template<typename T>
unsigned decode_instruction(T);
instruction_decoder() {
for (auto instr : instr_descr) {
auto quadrant = instr.value & 0x3;
qlut[quadrant].push_back(instruction_pattern{instr.value, instr.mask, instr.op});
}
for(auto& lut: qlut){
std::sort(std::begin(lut), std::end(lut), [](instruction_pattern const& a, instruction_pattern const& b){
return bit_count(a.mask) < bit_count(b.mask);
});
}
}
};
template<>
unsigned instruction_decoder<${coreDef.name.toLowerCase()}>::decode_instruction<traits<${coreDef.name.toLowerCase()}>::code_word_t>(traits<${coreDef.name.toLowerCase()}>::code_word_t instr){
auto res = std::find_if(std::begin(qlut[instr&0x3]), std::end(qlut[instr&0x3]), [instr](instruction_pattern const& e){
return !((instr&e.mask) ^ e.value );
});
return static_cast<unsigned>(res!=std::end(qlut[instr&0x3])? res->id : opcode_e::MAX_OPCODE);
}
std::unique_ptr<instruction_decoder<${coreDef.name.toLowerCase()}>> traits<${coreDef.name.toLowerCase()}>::get_decoder(){
return std::make_unique<instruction_decoder<${coreDef.name.toLowerCase()}>>();
}
}
}

View File

@ -8,10 +8,9 @@
instrGroups[groupName]+=it; instrGroups[groupName]+=it;
} }
instrGroups instrGroups
}%><%int index = 0; getInstructionGroups().each{name, instrList -> %> }%><%getInstructionGroups().each{name, instrList -> %>
${name}: <% instrList.each { %> ${name}: <% instrList.findAll{!it.instruction.name.startsWith("__")}.each { %>
${it.instruction.name}: - ${it.instruction.name}:
index: ${index++}
encoding: ${it.encoding} encoding: ${it.encoding}
mask: ${it.mask}<%if(it.attributes.size) {%> mask: ${it.mask}<%if(it.attributes.size) {%>
attributes: ${it.attributes}<%}%> attributes: ${it.attributes}<%}%>

View File

@ -1,131 +0,0 @@
/*******************************************************************************
* Copyright (C) 2024 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
// clang-format off
#include <sysc/iss_factory.h>
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/arch/riscv_hart_mu_p.h>
#include <sysc/sc_core_adapter.h>
#include <sysc/core_complex.h>
#include <array>
<%
def array_count = coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e"? 3 : 2;
%>
namespace iss {
namespace interp {
using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|interp", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%>
};
}
#if defined(WITH_LLVM)
namespace llvm {
using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|llvm", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%>
};
}
#endif
#if defined(WITH_TCC)
namespace tcc {
using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|tcc", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%>
};
}
#endif
#if defined(WITH_ASMJIT)
namespace asmjit {
using namespace sysc;
volatile std::array<bool, ${array_count}> ${coreDef.name.toLowerCase()}_init = {
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_m_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
}),
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%if(coreDef.name.toLowerCase()=="tgc5d" || coreDef.name.toLowerCase()=="tgc5e") {%>,
iss_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p_clic_pmp|asmjit", [](unsigned gdb_port, void* data) -> iss_factory::base_t {
auto* cc = reinterpret_cast<sysc::tgfs::core_complex_if*>(data);
auto* cpu = new sc_core_adapter<arch::riscv_hart_mu_p<arch::${coreDef.name.toLowerCase()}, (iss::arch::features_e)(iss::arch::FEAT_PMP | iss::arch::FEAT_EXT_N | iss::arch::FEAT_CLIC)>>(cc);
return {sysc::sc_cpu_ptr{cpu}, vm_ptr{create(static_cast<arch::${coreDef.name.toLowerCase()}*>(cpu), gdb_port)}};
})<%}%>
};
}
#endif
}
// clang-format on

View File

@ -1,371 +0,0 @@
/*******************************************************************************
* Copyright (C) 2017-2024 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
// clang-format off
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h>
#include <iss/iss.h>
#include <iss/asmjit/vm_base.h>
#include <asmjit/asmjit.h>
#include <util/logging.h>
#include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY
#endif
#include <fmt/format.h>
#include <array>
#include <iss/debugger/riscv_target_adapter.h>
namespace iss {
namespace asmjit {
namespace ${coreDef.name.toLowerCase()} {
using namespace ::asmjit;
using namespace iss::arch;
using namespace iss::debugger;
template <typename ARCH> class vm_impl : public iss::asmjit::vm_base<ARCH> {
public:
using traits = arch::traits<ARCH>;
using super = typename iss::asmjit::vm_base<ARCH>;
using virt_addr_t = typename super::virt_addr_t;
using phys_addr_t = typename super::phys_addr_t;
using code_word_t = typename super::code_word_t;
using mem_type_e = typename super::mem_type_e;
using addr_t = typename super::addr_t;
vm_impl();
vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0);
void enableDebug(bool enable) { super::sync_exec = super::ALL_SYNC; }
target_adapter_if *accquire_target_adapter(server_if *srv) override {
debugger_if::dbg_enabled = true;
if (vm_base<ARCH>::tgt_adapter == nullptr)
vm_base<ARCH>::tgt_adapter = new riscv_target_adapter<ARCH>(srv, this->get_arch());
return vm_base<ARCH>::tgt_adapter;
}
protected:
using super::get_ptr_for;
using super::get_reg_for;
using super::get_reg_for_Gp;
using super::load_reg_from_mem;
using super::load_reg_from_mem_Gp;
using super::write_reg_to_mem;
using super::gen_read_mem;
using super::gen_write_mem;
using super::gen_leave;
using super::gen_sync;
using this_class = vm_impl<ARCH>;
using compile_func = continuation_e (this_class::*)(virt_addr_t&, code_word_t, jit_holder&);
continuation_e gen_single_inst_behavior(virt_addr_t&, unsigned int &, jit_holder&) override;
enum globals_e {TVAL = 0, GLOBALS_SIZE};
void gen_block_prologue(jit_holder& jh) override;
void gen_block_epilogue(jit_holder& jh) override;
inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
void gen_instr_prologue(jit_holder& jh);
void gen_instr_epilogue(jit_holder& jh);
inline void gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause);
template <typename T, typename = typename std::enable_if<std::is_integral<T>::value>::type> void gen_set_tval(jit_holder& jh, T new_tval) ;
void gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) ;
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
inline S sext(U from) {
auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0);
}
<%functions.each{ it.eachLine { %>
${it}<%}%>
<%}%>
private:
/****************************************************************************
* start opcode definitions
****************************************************************************/
struct instruction_descriptor {
uint32_t length;
uint32_t value;
uint32_t mask;
compile_func op;
};
const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */
continuation_e __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, jit_holder& jh){
uint64_t PC = pc.val;
<%instr.fields.eachLine{%>${it}
<%}%>if(this->disass_enabled){
/* generate disass */
<%instr.disass.eachLine{%>
${it}<%}%>
InvokeNode* call_print_disass;
char* mnemonic_ptr = strdup(mnemonic.c_str());
jh.disass_collection.push_back(mnemonic_ptr);
jh.cc.invoke(&call_print_disass, &print_disass, FuncSignature::build<void, void *, uint64_t, char *>());
call_print_disass->setArg(0, jh.arch_if_ptr);
call_print_disass->setArg(1, pc.val);
call_print_disass->setArg(2, mnemonic_ptr);
}
x86::Compiler& cc = jh.cc;
cc.comment(fmt::format("${instr.name}_{:#x}:",pc.val).c_str());
gen_sync(jh, PRE_SYNC, ${idx});
mov(cc, jh.pc, pc.val);
gen_set_tval(jh, instr);
pc = pc+${instr.length/8};
mov(cc, jh.next_pc, pc.val);
gen_instr_prologue(jh);
cc.comment("//behavior:");
/*generate behavior*/
<%instr.behavior.eachLine{%>${it}
<%}%>
gen_sync(jh, POST_SYNC, ${idx});
gen_instr_epilogue(jh);
return returnValue;
}
<%}%>
/****************************************************************************
* end opcode definitions
****************************************************************************/
continuation_e illegal_instruction(virt_addr_t &pc, code_word_t instr, jit_holder& jh ) {
x86::Compiler& cc = jh.cc;
if(this->disass_enabled){
auto mnemonic = std::string("illegal_instruction");
InvokeNode* call_print_disass;
char* mnemonic_ptr = strdup(mnemonic.c_str());
jh.disass_collection.push_back(mnemonic_ptr);
jh.cc.invoke(&call_print_disass, &print_disass, FuncSignature::build<void, void *, uint64_t, char *>());
call_print_disass->setArg(0, jh.arch_if_ptr);
call_print_disass->setArg(1, pc.val);
call_print_disass->setArg(2, mnemonic_ptr);
}
cc.comment(fmt::format("illegal_instruction{:#x}:",pc.val).c_str());
gen_sync(jh, PRE_SYNC, instr_descr.size());
mov(cc, jh.pc, pc.val);
gen_set_tval(jh, instr);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
mov(cc, jh.next_pc, pc.val);
gen_instr_prologue(jh);
cc.comment("//behavior:");
gen_raise(jh, 0, 2);
gen_sync(jh, POST_SYNC, instr_descr.size());
gen_instr_epilogue(jh);
return ILLEGAL_INSTR;
}
};
template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id)
, instr_decoder([this]() {
std::vector<generic_instruction_descriptor> g_instr_descr;
g_instr_descr.reserve(instr_descr.size());
for (uint32_t i = 0; i < instr_descr.size(); ++i) {
generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i};
g_instr_descr.push_back(new_instr_descr);
}
return std::move(g_instr_descr);
}()) {}
template <typename ARCH>
continuation_e vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, jit_holder& jh) {
enum {TRAP_ID=1<<16};
code_word_t instr = 0;
phys_addr_t paddr(pc);
auto *const data = (uint8_t *)&instr;
if(this->core.has_mmu())
paddr = this->core.virt2phys(pc);
auto res = this->core.read(paddr, 4, data);
if (res != iss::Ok)
return ILLEGAL_FETCH;
if (instr == 0x0000006f || (instr&0xffff)==0xa001)
return JUMP_TO_SELF;
++inst_cnt;
uint32_t inst_index = instr_decoder.decode_instr(instr);
compile_func f = nullptr;
if(inst_index < instr_descr.size())
f = instr_descr[inst_index].op;
if (f == nullptr)
f = &this_class::illegal_instruction;
return (this->*f)(pc, instr, jh);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_instr_prologue(jit_holder& jh) {
auto& cc = jh.cc;
cc.comment("//gen_instr_prologue");
x86_reg_t current_trap_state = get_reg_for(cc, traits::TRAP_STATE);
mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
mov(cc, get_ptr_for(jh, traits::PENDING_TRAP), current_trap_state);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_instr_epilogue(jit_holder& jh) {
auto& cc = jh.cc;
cc.comment("//gen_instr_epilogue");
x86_reg_t current_trap_state = get_reg_for(cc, traits::TRAP_STATE);
mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
cmp(cc, current_trap_state, 0);
cc.jne(jh.trap_entry);
cc.inc(get_ptr_for(jh, traits::ICOUNT));
cc.inc(get_ptr_for(jh, traits::CYCLE));
}
template <typename ARCH>
void vm_impl<ARCH>::gen_block_prologue(jit_holder& jh){
jh.pc = load_reg_from_mem_Gp(jh, traits::PC);
jh.next_pc = load_reg_from_mem_Gp(jh, traits::NEXT_PC);
jh.globals.resize(GLOBALS_SIZE);
jh.globals[TVAL] = get_reg_Gp(jh.cc, 64, false);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_block_epilogue(jit_holder& jh){
x86::Compiler& cc = jh.cc;
cc.comment("//gen_block_epilogue");
cc.ret(jh.next_pc);
cc.bind(jh.trap_entry);
this->write_back(jh);
x86::Gp current_trap_state = get_reg_for_Gp(cc, traits::TRAP_STATE);
mov(cc, current_trap_state, get_ptr_for(jh, traits::TRAP_STATE));
x86::Gp current_pc = get_reg_for_Gp(cc, traits::PC);
mov(cc, current_pc, get_ptr_for(jh, traits::PC));
cc.comment("//enter trap call;");
InvokeNode* call_enter_trap;
cc.invoke(&call_enter_trap, &enter_trap, FuncSignature::build<uint64_t, void*, uint64_t, uint64_t, uint64_t>());
call_enter_trap->setArg(0, jh.arch_if_ptr);
call_enter_trap->setArg(1, current_trap_state);
call_enter_trap->setArg(2, current_pc);
call_enter_trap->setArg(3, jh.globals[TVAL]);
x86_reg_t current_next_pc = get_reg_for(cc, traits::NEXT_PC);
mov(cc, current_next_pc, get_ptr_for(jh, traits::NEXT_PC));
mov(cc, jh.next_pc, current_next_pc);
mov(cc, get_ptr_for(jh, traits::LAST_BRANCH), static_cast<int>(UNKNOWN_JUMP));
cc.ret(jh.next_pc);
}
template <typename ARCH>
inline void vm_impl<ARCH>::gen_raise(jit_holder& jh, uint16_t trap_id, uint16_t cause) {
auto& cc = jh.cc;
cc.comment("//gen_raise");
auto tmp1 = get_reg_for(cc, traits::TRAP_STATE);
mov(cc, tmp1, 0x80ULL << 24 | (cause << 16) | trap_id);
mov(cc, get_ptr_for(jh, traits::TRAP_STATE), tmp1);
cc.jmp(jh.trap_entry);
}
template <typename ARCH>
template <typename T, typename>
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, T new_tval) {
mov(jh.cc, jh.globals[TVAL], new_tval);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_set_tval(jit_holder& jh, x86_reg_t _new_tval) {
if(nonstd::holds_alternative<x86::Gp>(_new_tval)) {
x86::Gp new_tval = nonstd::get<x86::Gp>(_new_tval);
if(new_tval.size() < 8)
new_tval = gen_ext_Gp(jh.cc, new_tval, 64, false);
mov(jh.cc, jh.globals[TVAL], new_tval);
} else {
throw std::runtime_error("Variant not supported in gen_set_tval");
}
}
} // namespace tgc5c
template <>
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
auto ret = new ${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*core, dump);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(ret, port);
return std::unique_ptr<vm_if>(ret);
}
} // namespace asmjit
} // namespace iss
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/arch/riscv_hart_mu_p.h>
#include <iss/factory.h>
namespace iss {
namespace {
volatile std::array<bool, 2> dummy = {
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|asmjit", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}};
}),
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|asmjit", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new asmjit::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}};
})
};
}
}
// clang-format on

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2017-2024 MINRES Technologies GmbH * Copyright (C) 2021 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -34,22 +34,15 @@ def nativeTypeSize(int size){
if(size<=8) return 8; else if(size<=16) return 16; else if(size<=32) return 32; else return 64; if(size<=8) return 8; else if(size<=16) return 16; else if(size<=32) return 32; else return 64;
} }
%> %>
// clang-format off
#include <cstdint>
#include <iss/arch/${coreDef.name.toLowerCase()}.h> #include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
#include <iss/iss.h> #include <iss/iss.h>
#include <iss/interp/vm_base.h> #include <iss/interp/vm_base.h>
#include <vm/fp_functions.h>
#include <util/logging.h> #include <util/logging.h>
#include <sstream>
#include <boost/coroutine2/all.hpp> #include <boost/coroutine2/all.hpp>
#include <functional> #include <functional>
#include <exception>
#include <vector>
#include <sstream>
#include <iss/instruction_decoder.h>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
@ -66,10 +59,6 @@ using namespace iss::arch;
using namespace iss::debugger; using namespace iss::debugger;
using namespace std::placeholders; using namespace std::placeholders;
struct memory_access_exception : public std::exception{
memory_access_exception(){}
};
template <typename ARCH> class vm_impl : public iss::interp::vm_base<ARCH> { template <typename ARCH> class vm_impl : public iss::interp::vm_base<ARCH> {
public: public:
using traits = arch::traits<ARCH>; using traits = arch::traits<ARCH>;
@ -100,20 +89,37 @@ protected:
using compile_ret_t = virt_addr_t; using compile_ret_t = virt_addr_t;
using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr); using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr);
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return index<traits::reg_aliases.size()?traits::reg_aliases[index]:"illegal";}
<%
def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
typename arch::traits<ARCH>::opcode_e decode_inst_id(code_word_t instr);
virt_addr_t execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit) override; virt_addr_t execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit) override;
// some compile time constants // some compile time constants
// enum { MASK16 = 0b1111110001100011, MASK32 = 0b11111111111100000111000001111111 };
enum { MASK16 = 0b1111111111111111, MASK32 = 0b11111111111100000111000001111111 };
enum { EXTR_MASK16 = MASK16 >> 2, EXTR_MASK32 = MASK32 >> 2 };
enum {
LUT_SIZE = 1 << util::bit_count(static_cast<uint32_t>(EXTR_MASK32)),
LUT_SIZE_C = 1 << util::bit_count(static_cast<uint32_t>(EXTR_MASK16))
};
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
struct instruction_pattern {
uint32_t value;
uint32_t mask;
typename arch::traits<ARCH>::opcode_e id;
};
std::array<std::vector<instruction_pattern>, 4> qlut;
inline void raise(uint16_t trap_id, uint16_t cause){ inline void raise(uint16_t trap_id, uint16_t cause){
auto trap_val = 0x80ULL << 24 | (cause << 16) | trap_id; auto trap_val = 0x80ULL << 24 | (cause << 16) | trap_id;
this->core.reg.trap_state = trap_val; this->core.reg.trap_state = trap_val;
this->template get_reg<uint${addrDataWidth}_t>(traits::NEXT_PC) = std::numeric_limits<uint${addrDataWidth}_t>::max();
} }
inline void leave(unsigned lvl){ inline void leave(unsigned lvl){
@ -124,13 +130,6 @@ if(fcsr != null) {%>
this->core.wait_until(type); this->core.wait_until(type);
} }
inline void set_tval(uint64_t new_tval){
tval = new_tval;
}
uint64_t fetch_count{0};
uint64_t tval{0};
using yield_t = boost::coroutines2::coroutine<void>::push_type; using yield_t = boost::coroutines2::coroutine<void>::push_type;
using coro_t = boost::coroutines2::coroutine<void>::pull_type; using coro_t = boost::coroutines2::coroutine<void>::pull_type;
std::vector<coro_t> spawn_blocks; std::vector<coro_t> spawn_blocks;
@ -159,38 +158,28 @@ private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
****************************************************************************/ ****************************************************************************/
struct instruction_descriptor { struct InstructionDesriptor {
uint32_t length; size_t length;
uint32_t value; uint32_t value;
uint32_t mask; uint32_t mask;
typename arch::traits<ARCH>::opcode_e op; typename arch::traits<ARCH>::opcode_e op;
}; };
const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{ const std::array<InstructionDesriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
{${instr.length}, ${instr.encoding}, ${instr.mask}, arch::traits<ARCH>::opcode_e::${instr.instruction.name}},<%}%> {${instr.length}, ${instr.encoding}, ${instr.mask}, arch::traits<ARCH>::opcode_e::${instr.instruction.name}},<%}%>
}}; }};
//needs to be declared after instr_descr //static constexpr typename traits::addr_t upper_bits = ~traits::PGMASK;
decoder instr_decoder;
iss::status fetch_ins(virt_addr_t pc, uint8_t * data){ iss::status fetch_ins(virt_addr_t pc, uint8_t * data){
if(this->core.has_mmu()) { auto phys_pc = this->core.v2p(pc);
auto phys_pc = this->core.virt2phys(pc); //if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary
// if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary // if (this->core.read(phys_pc, 2, data) != iss::Ok) return iss::Err;
// if (this->core.read(phys_pc, 2, data) != iss::Ok) return iss::Err; // if ((data[0] & 0x3) == 0x3) // this is a 32bit instruction
// if ((data[0] & 0x3) == 0x3) // this is a 32bit instruction // if (this->core.read(this->core.v2p(pc + 2), 2, data + 2) != iss::Ok) return iss::Err;
// if (this->core.read(this->core.v2p(pc + 2), 2, data + 2) != iss::Ok) //} else {
// return iss::Err; if (this->core.read(phys_pc, 4, data) != iss::Ok) return iss::Err;
// } else { //}
if (this->core.read(phys_pc, 4, data) != iss::Ok)
return iss::Err;
// }
} else {
if (this->core.read(phys_addr_t(pc.access, pc.space, pc.val), 4, data) != iss::Ok)
return iss::Err;
}
return iss::Ok; return iss::Ok;
} }
}; };
@ -218,23 +207,21 @@ constexpr size_t bit_count(uint32_t u) {
template <typename ARCH> template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) : vm_base<ARCH>(core, core_id, cluster_id) {
, instr_decoder([this]() { unsigned id=0;
std::vector<generic_instruction_descriptor> g_instr_descr; for (auto instr : instr_descr) {
g_instr_descr.reserve(instr_descr.size()); auto quadrant = instr.value & 0x3;
for (uint32_t i = 0; i < instr_descr.size(); ++i) { qlut[quadrant].push_back(instruction_pattern{instr.value, instr.mask, instr.op});
generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i}; }
g_instr_descr.push_back(new_instr_descr); for(auto& lut: qlut){
} std::sort(std::begin(lut), std::end(lut), [](instruction_pattern const& a, instruction_pattern const& b){
return std::move(g_instr_descr); return bit_count(a.mask) > bit_count(b.mask);
}()) {} });
}
inline bool is_icount_limit_enabled(finish_cond_e cond){
return (cond & finish_cond_e::ICOUNT_LIMIT) == finish_cond_e::ICOUNT_LIMIT;
} }
inline bool is_fcount_limit_enabled(finish_cond_e cond){ inline bool is_count_limit_enabled(finish_cond_e cond){
return (cond & finish_cond_e::FCOUNT_LIMIT) == finish_cond_e::FCOUNT_LIMIT; return (cond & finish_cond_e::COUNT_LIMIT) == finish_cond_e::COUNT_LIMIT;
} }
inline bool is_jump_to_self_enabled(finish_cond_e cond){ inline bool is_jump_to_self_enabled(finish_cond_e cond){
@ -242,7 +229,15 @@ inline bool is_jump_to_self_enabled(finish_cond_e cond){
} }
template <typename ARCH> template <typename ARCH>
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t count_limit){ typename arch::traits<ARCH>::opcode_e vm_impl<ARCH>::decode_inst_id(code_word_t instr){
for(auto& e: qlut[instr&0x3]){
if(!((instr&e.mask) ^ e.value )) return e.id;
}
return arch::traits<ARCH>::opcode_e::MAX_OPCODE;
}
template <typename ARCH>
typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e cond, virt_addr_t start, uint64_t icount_limit){
auto pc=start; auto pc=start;
auto* PC = reinterpret_cast<uint${addrDataWidth}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]); auto* PC = reinterpret_cast<uint${addrDataWidth}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::PC]);
auto* NEXT_PC = reinterpret_cast<uint${addrDataWidth}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]); auto* NEXT_PC = reinterpret_cast<uint${addrDataWidth}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::NEXT_PC]);
@ -255,52 +250,39 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
auto *const data = reinterpret_cast<uint8_t*>(&instr); auto *const data = reinterpret_cast<uint8_t*>(&instr);
while(!this->core.should_stop() && while(!this->core.should_stop() &&
!(is_icount_limit_enabled(cond) && icount >= count_limit) && !(is_count_limit_enabled(cond) && icount >= icount_limit)){
!(is_fcount_limit_enabled(cond) && fetch_count >= count_limit)){
if(this->debugging_enabled())
this->tgt_adapter->check_continue(*PC);
pc.val=*PC;
if(fetch_ins(pc, data)!=iss::Ok){ if(fetch_ins(pc, data)!=iss::Ok){
if(this->sync_exec && PRE_SYNC) this->do_sync(PRE_SYNC, std::numeric_limits<unsigned>::max()); this->do_sync(POST_SYNC, std::numeric_limits<unsigned>::max());
process_spawn_blocks(); pc.val = super::core.enter_trap(std::numeric_limits<uint64_t>::max(), pc.val, 0);
if(this->sync_exec && POST_SYNC) this->do_sync(PRE_SYNC, std::numeric_limits<unsigned>::max());
pc.val = super::core.enter_trap(arch::traits<ARCH>::RV_CAUSE_FETCH_ACCESS<<16, pc.val, 0);
} else { } else {
if (is_jump_to_self_enabled(cond) && if (is_jump_to_self_enabled(cond) &&
(instr == 0x0000006f || (instr&0xffff)==0xa001)) throw simulation_stopped(0); // 'J 0' or 'C.J 0' (instr == 0x0000006f || (instr&0xffff)==0xa001)) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
uint32_t inst_index = instr_decoder.decode_instr(instr); auto inst_id = decode_inst_id(instr);
opcode_e inst_id = arch::traits<ARCH>::opcode_e::MAX_OPCODE;;
if(inst_index <instr_descr.size())
inst_id = instr_descr[inst_index].op;
// pre execution stuff // pre execution stuff
this->core.reg.last_branch = 0; this->core.reg.last_branch = 0;
if(this->sync_exec && PRE_SYNC) this->do_sync(PRE_SYNC, static_cast<unsigned>(inst_id)); if(this->sync_exec && PRE_SYNC) this->do_sync(PRE_SYNC, static_cast<unsigned>(inst_id));
try{ switch(inst_id){<%instructions.eachWithIndex{instr, idx -> %>
switch(inst_id){<%instructions.eachWithIndex{instr, idx -> %> case arch::traits<ARCH>::opcode_e::${instr.name}: {
case arch::traits<ARCH>::opcode_e::${instr.name}: { <%instr.fields.eachLine{%>${it}
<%instr.fields.eachLine{%>${it} <%}%>if(this->disass_enabled){
<%}%>if(this->disass_enabled){ /* generate console output when executing the command */<%instr.disass.eachLine{%>
/* generate console output when executing the command */<%instr.disass.eachLine{%>
${it}<%}%>
this->core.disass_output(pc.val, mnemonic);
}
// used registers<%instr.usedVariables.each{ k,v->
if(v.isArray) {%>
auto* ${k} = reinterpret_cast<uint${nativeTypeSize(v.type.size)}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::${k}0]);<% }else{ %>
auto* ${k} = reinterpret_cast<uint${nativeTypeSize(v.type.size)}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::${k}]);
<%}}%>// calculate next pc value
*NEXT_PC = *PC + ${instr.length/8};
// execute instruction<%instr.behavior.eachLine{%>
${it}<%}%> ${it}<%}%>
break;
}// @suppress("No break at end of case")<%}%>
default: {
*NEXT_PC = *PC + ((instr & 3) == 3 ? 4 : 2);
raise(0, 2);
} }
} // used registers<%instr.usedVariables.each{ k,v->
}catch(memory_access_exception& e){} if(v.isArray) {%>
auto* ${k} = reinterpret_cast<uint${nativeTypeSize(v.type.size)}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::${k}0]);<% }else{ %>
auto* ${k} = reinterpret_cast<uint${nativeTypeSize(v.type.size)}_t*>(this->regs_base_ptr+arch::traits<ARCH>::reg_byte_offsets[arch::traits<ARCH>::${k}]);
<%}}%>// calculate next pc value
*NEXT_PC = *PC + ${instr.length/8};
// execute instruction<%instr.behavior.eachLine{%>
${it}<%}%>
TRAP_${instr.name}:break;
}// @suppress("No break at end of case")<%}%>
default: {
*NEXT_PC = *PC + ((instr & 3) == 3 ? 4 : 2);
raise(0, 2);
}
}
// post execution stuff // post execution stuff
process_spawn_blocks(); process_spawn_blocks();
if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast<unsigned>(inst_id)); if(this->sync_exec && POST_SYNC) this->do_sync(POST_SYNC, static_cast<unsigned>(inst_id));
@ -308,23 +290,21 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
// this->core.reg.trap_state = this->core.reg.pending_trap; // this->core.reg.trap_state = this->core.reg.pending_trap;
// trap check // trap check
if(trap_state!=0){ if(trap_state!=0){
//In case of Instruction address misaligned (cause = 0 and trapid = 0) need the targeted addr (in tval) super::core.enter_trap(trap_state, pc.val, instr);
auto mcause = (trap_state>>16) & 0xff;
super::core.enter_trap(trap_state, pc.val, mcause ? instr:tval);
} else { } else {
icount++; icount++;
instret++; instret++;
} }
*PC = *NEXT_PC; cycle++;
pc.val=*NEXT_PC;
this->core.reg.PC = this->core.reg.NEXT_PC;
this->core.reg.trap_state = this->core.reg.pending_trap; this->core.reg.trap_state = this->core.reg.pending_trap;
} }
fetch_count++;
cycle++;
} }
return pc; return pc;
} }
} // namespace ${coreDef.name.toLowerCase()} }
template <> template <>
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) { std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
@ -335,33 +315,29 @@ std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreD
} // namespace interp } // namespace interp
} // namespace iss } // namespace iss
#include <iss/factory.h>
#include <iss/arch/riscv_hart_m_p.h> #include <iss/arch/riscv_hart_m_p.h>
#include <iss/arch/riscv_hart_mu_p.h> #include <iss/arch/riscv_hart_mu_p.h>
#include <iss/factory.h>
namespace iss { namespace iss {
namespace { namespace {
volatile std::array<bool, 2> dummy = { std::array<bool, 2> dummy = {
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|interp", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{ core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|interp", [](unsigned port, void*) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>(); auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new interp::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new interp::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
}), }),
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|interp", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{ core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|interp", [](unsigned port, void*) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>(); auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new interp::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new interp::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
}) })
}; };
} }
} }
// clang-format on extern "C" {
bool* get_${coreDef.name.toLowerCase()}_interp_creators() {
return iss::dummy.data();
}
}

View File

@ -1,385 +0,0 @@
/*******************************************************************************
* Copyright (C) 2017-2024 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
// clang-format off
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h>
#include <iss/iss.h>
#include <iss/llvm/vm_base.h>
#include <util/logging.h>
#include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY
#endif
#include <fmt/format.h>
#include <array>
#include <iss/debugger/riscv_target_adapter.h>
namespace iss {
namespace llvm {
namespace fp_impl {
void add_fp_functions_2_module(::llvm::Module *, unsigned, unsigned);
}
namespace ${coreDef.name.toLowerCase()} {
using namespace ::llvm;
using namespace iss::arch;
using namespace iss::debugger;
template <typename ARCH> class vm_impl : public iss::llvm::vm_base<ARCH> {
public:
using traits = arch::traits<ARCH>;
using super = typename iss::llvm::vm_base<ARCH>;
using virt_addr_t = typename super::virt_addr_t;
using phys_addr_t = typename super::phys_addr_t;
using code_word_t = typename super::code_word_t;
using addr_t = typename super::addr_t;
vm_impl();
vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0);
void enableDebug(bool enable) { super::sync_exec = super::ALL_SYNC; }
target_adapter_if *accquire_target_adapter(server_if *srv) override {
debugger_if::dbg_enabled = true;
if (vm_base<ARCH>::tgt_adapter == nullptr)
vm_base<ARCH>::tgt_adapter = new riscv_target_adapter<ARCH>(srv, this->get_arch());
return vm_base<ARCH>::tgt_adapter;
}
protected:
using vm_base<ARCH>::get_reg_ptr;
inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
<%}%>
template <typename T> inline ConstantInt *size(T type) {
return ConstantInt::get(getContext(), APInt(32, type->getType()->getScalarSizeInBits()));
}
void setup_module(Module* m) override {
super::setup_module(m);
iss::llvm::fp_impl::add_fp_functions_2_module(m, traits::FP_REGS_SIZE, traits::XLEN);
}
inline Value *gen_choose(Value *cond, Value *trueVal, Value *falseVal, unsigned size) {
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
}
std::tuple<continuation_e, BasicBlock *> gen_single_inst_behavior(virt_addr_t &, unsigned int &, BasicBlock *) override;
void gen_leave_behavior(BasicBlock *leave_blk) override;
void gen_raise_trap(uint16_t trap_id, uint16_t cause);
void gen_leave_trap(unsigned lvl);
void gen_wait(unsigned type);
void set_tval(uint64_t new_tval);
void set_tval(Value* new_tval);
void gen_trap_behavior(BasicBlock *) override;
void gen_instr_prologue();
void gen_instr_epilogue(BasicBlock *bb);
inline Value *gen_reg_load(unsigned i, unsigned level = 0) {
return this->builder.CreateLoad(this->get_typeptr(i), get_reg_ptr(i), false);
}
inline void gen_set_pc(virt_addr_t pc, unsigned reg_num) {
Value *next_pc_v = this->builder.CreateSExtOrTrunc(this->gen_const(traits::XLEN, pc.val),
this->get_type(traits::XLEN));
this->builder.CreateStore(next_pc_v, get_reg_ptr(reg_num), true);
}
// some compile time constants
using this_class = vm_impl<ARCH>;
using compile_func = std::tuple<continuation_e, BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr,
BasicBlock *bb);
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
inline S sext(U from) {
auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0);
}
<%functions.each{ it.eachLine { %>
${it}<%}%>
<%}%>
private:
/****************************************************************************
* start opcode definitions
****************************************************************************/
struct instruction_descriptor {
uint32_t length;
uint32_t value;
uint32_t mask;
compile_func op;
};
const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */
std::tuple<continuation_e, BasicBlock*> __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, BasicBlock* bb){
uint64_t PC = pc.val;
<%instr.fields.eachLine{%>${it}
<%}%>if(this->disass_enabled){
/* generate console output when executing the command */<%instr.disass.eachLine{%>
${it}<%}%>
std::vector<Value*> args {
this->core_ptr,
this->gen_const(64, pc.val),
this->builder.CreateGlobalStringPtr(mnemonic),
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
bb->setName(fmt::format("${instr.name}_0x{:X}",pc.val));
this->gen_sync(PRE_SYNC,${idx});
this->gen_set_pc(pc, traits::PC);
this->set_tval(instr);
pc=pc+ ${instr.length/8};
this->gen_set_pc(pc, traits::NEXT_PC);
this->gen_instr_prologue();
/*generate behavior*/
<%instr.behavior.eachLine{%>${it}
<%}%>
this->gen_sync(POST_SYNC, ${idx});
this->gen_instr_epilogue(bb);
this->builder.CreateBr(bb);
return returnValue;
}
<%}%>
/****************************************************************************
* end opcode definitions
****************************************************************************/
std::tuple<continuation_e, BasicBlock *> illegal_instruction(virt_addr_t &pc, code_word_t instr, BasicBlock *bb) {
if(this->disass_enabled){
auto mnemonic = std::string("illegal_instruction");
std::vector<Value*> args {
this->core_ptr,
this->gen_const(64, pc.val),
this->builder.CreateGlobalStringPtr(mnemonic),
};
this->builder.CreateCall(this->mod->getFunction("print_disass"), args);
}
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), true),
get_reg_ptr(traits::PC), true);
this->builder.CreateStore(
this->builder.CreateAdd(this->builder.CreateLoad(this->get_typeptr(traits::ICOUNT), get_reg_ptr(traits::ICOUNT), true),
this->gen_const(64U, 1)),
get_reg_ptr(traits::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->set_tval(instr);
this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, instr_descr.size());
bb = this->leave_blk;
this->gen_instr_epilogue(bb);
this->builder.CreateBr(bb);
return std::make_tuple(ILLEGAL_INSTR, nullptr);
}
};
template <typename CODE_WORD> void debug_fn(CODE_WORD instr) {
volatile CODE_WORD x = instr;
instr = 2 * x;
}
template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id)
, instr_decoder([this]() {
std::vector<generic_instruction_descriptor> g_instr_descr;
g_instr_descr.reserve(instr_descr.size());
for (uint32_t i = 0; i < instr_descr.size(); ++i) {
generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i};
g_instr_descr.push_back(new_instr_descr);
}
return std::move(g_instr_descr);
}()) {}
template <typename ARCH>
std::tuple<continuation_e, BasicBlock *>
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, BasicBlock *this_block) {
// we fetch at max 4 byte, alignment is 2
enum {TRAP_ID=1<<16};
code_word_t instr = 0;
// const typename traits::addr_t upper_bits = ~traits::PGMASK;
phys_addr_t paddr(pc);
auto *const data = (uint8_t *)&instr;
if(this->core.has_mmu())
paddr = this->core.virt2phys(pc);
auto res = this->core.read(paddr, 4, data);
if (res != iss::Ok)
return std::make_tuple(ILLEGAL_FETCH, nullptr);
if (instr == 0x0000006f || (instr&0xffff)==0xa001)
return std::make_tuple(JUMP_TO_SELF, nullptr);
++inst_cnt;
uint32_t inst_index = instr_decoder.decode_instr(instr);
compile_func f = nullptr;
if(inst_index < instr_descr.size())
f = instr_descr[inst_index].op;
if (f == nullptr) {
f = &this_class::illegal_instruction;
}
return (this->*f)(pc, instr, this_block);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_leave_behavior(BasicBlock *leave_blk) {
this->builder.SetInsertPoint(leave_blk);
this->builder.CreateRet(this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC),get_reg_ptr(traits::NEXT_PC), false));
}
template <typename ARCH>
void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
auto *TRAP_val = this->gen_const(32, 0x80 << 24 | (cause << 16) | trap_id);
this->builder.CreateStore(TRAP_val, get_reg_ptr(traits::TRAP_STATE), true);
this->builder.CreateBr(this->trap_blk);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, lvl)) };
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
this->builder.CreateStore(this->gen_const(32U, static_cast<int>(UNKNOWN_JUMP)), get_reg_ptr(traits::LAST_BRANCH), false);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_wait(unsigned type) {
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, type)) };
this->builder.CreateCall(this->mod->getFunction("wait"), args);
}
template <typename ARCH>
inline void vm_impl<ARCH>::set_tval(uint64_t tval) {
auto tmp_tval = this->gen_const(64, tval);
this->set_tval(tmp_tval);
}
template <typename ARCH>
inline void vm_impl<ARCH>::set_tval(Value* new_tval) {
this->builder.CreateStore(this->gen_ext(new_tval, 64, false), this->tval);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_trap_behavior(BasicBlock *trap_blk) {
this->builder.SetInsertPoint(trap_blk);
auto *trap_state_val = this->builder.CreateLoad(this->get_typeptr(traits::TRAP_STATE), get_reg_ptr(traits::TRAP_STATE), true);
auto *cur_pc_val = this->builder.CreateLoad(this->get_typeptr(traits::PC), get_reg_ptr(traits::PC), true);
std::vector<Value *> args{this->core_ptr,
this->adj_to64(trap_state_val),
this->adj_to64(cur_pc_val),
this->adj_to64(this->builder.CreateLoad(this->get_type(64),this->tval))};
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
this->builder.CreateStore(this->gen_const(32U, static_cast<int>(UNKNOWN_JUMP)), get_reg_ptr(traits::LAST_BRANCH), false);
auto *trap_addr_val = this->builder.CreateLoad(this->get_typeptr(traits::NEXT_PC), get_reg_ptr(traits::NEXT_PC), false);
this->builder.CreateRet(trap_addr_val);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_instr_prologue() {
auto* trap_val =
this->builder.CreateLoad(this->get_typeptr(arch::traits<ARCH>::PENDING_TRAP), get_reg_ptr(arch::traits<ARCH>::PENDING_TRAP));
this->builder.CreateStore(trap_val, get_reg_ptr(arch::traits<ARCH>::TRAP_STATE), false);
}
template <typename ARCH>
void vm_impl<ARCH>::gen_instr_epilogue(BasicBlock *bb) {
auto* target_bb = BasicBlock::Create(this->mod->getContext(), "", this->func, bb);
auto *v = this->builder.CreateLoad(this->get_typeptr(traits::TRAP_STATE), get_reg_ptr(traits::TRAP_STATE), true);
this->gen_cond_branch(this->builder.CreateICmp(
ICmpInst::ICMP_EQ, v,
ConstantInt::get(getContext(), APInt(v->getType()->getIntegerBitWidth(), 0))),
target_bb, this->trap_blk, 1);
this->builder.SetInsertPoint(target_bb);
// update icount
auto* icount_val = this->builder.CreateAdd(
this->builder.CreateLoad(this->get_typeptr(arch::traits<ARCH>::ICOUNT), get_reg_ptr(arch::traits<ARCH>::ICOUNT)), this->gen_const(64U, 1));
this->builder.CreateStore(icount_val, get_reg_ptr(arch::traits<ARCH>::ICOUNT), false);
}
} // namespace ${coreDef.name.toLowerCase()}
template <>
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
auto ret = new ${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*core, dump);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(ret, port);
return std::unique_ptr<vm_if>(ret);
}
} // namespace llvm
} // namespace iss
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/arch/riscv_hart_mu_p.h>
#include <iss/factory.h>
namespace iss {
namespace {
volatile std::array<bool, 2> dummy = {
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|llvm", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new llvm::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t*)>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}};
}),
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|llvm", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new llvm::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<std::function<void(arch_if*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t*, arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t*)>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}};
})
};
}
}
// clang-format on

View File

@ -0,0 +1,9 @@
{
"${coreDef.name}" : [<%instructions.eachWithIndex{instr,index -> %>${index==0?"":","}
{
"name" : "${instr.name}",
"size" : ${instr.length},
"delay" : ${generator.hasAttribute(instr.instruction, com.minres.coredsl.coreDsl.InstrAttribute.COND)?[1,1]:1}
}<%}%>
]
}

View File

@ -0,0 +1,223 @@
/*******************************************************************************
* Copyright (C) 2017, 2018 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
<%
import com.minres.coredsl.coreDsl.Register
import com.minres.coredsl.coreDsl.RegisterFile
import com.minres.coredsl.coreDsl.RegisterAlias
def getTypeSize(size){
if(size > 32) 64 else if(size > 16) 32 else if(size > 8) 16 else 8
}
def getOriginalName(reg){
if( reg.original instanceof RegisterFile) {
if( reg.index != null ) {
return reg.original.name+generator.generateHostCode(reg.index)
} else {
return reg.original.name
}
} else if(reg.original instanceof Register){
return reg.original.name
}
}
def getRegisterNames(){
def regNames = []
allRegs.each { reg ->
if( reg instanceof RegisterFile) {
(reg.range.right..reg.range.left).each{
regNames+=reg.name.toLowerCase()+it
}
} else if(reg instanceof Register){
regNames+=reg.name.toLowerCase()
}
}
return regNames
}
def getRegisterAliasNames(){
def regMap = allRegs.findAll{it instanceof RegisterAlias }.collectEntries {[getOriginalName(it), it.name]}
return allRegs.findAll{it instanceof Register || it instanceof RegisterFile}.collect{reg ->
if( reg instanceof RegisterFile) {
return (reg.range.right..reg.range.left).collect{ (regMap[reg.name]?:regMap[reg.name+it]?:reg.name.toLowerCase()+it).toLowerCase() }
} else if(reg instanceof Register){
regMap[reg.name]?:reg.name.toLowerCase()
}
}.flatten()
}
%>
#ifndef _${coreDef.name.toUpperCase()}_H_
#define _${coreDef.name.toUpperCase()}_H_
#include <array>
#include <iss/arch/traits.h>
#include <iss/arch_if.h>
#include <iss/vm_if.h>
namespace iss {
namespace arch {
struct ${coreDef.name.toLowerCase()};
template <> struct traits<${coreDef.name.toLowerCase()}> {
constexpr static char const* const core_type = "${coreDef.name}";
static constexpr std::array<const char*, ${getRegisterNames().size}> reg_names{
{"${getRegisterNames().join("\", \"")}"}};
static constexpr std::array<const char*, ${getRegisterAliasNames().size}> reg_aliases{
{"${getRegisterAliasNames().join("\", \"")}"}};
enum constants {${coreDef.constants.collect{c -> c.name+"="+c.value}.join(', ')}};
constexpr static unsigned FP_REGS_SIZE = ${coreDef.constants.find {it.name=='FLEN'}?.value?:0};
enum reg_e {<%
allRegs.each { reg ->
if( reg instanceof RegisterFile) {
(reg.range.right..reg.range.left).each{%>
${reg.name}${it},<%
}
} else if(reg instanceof Register){ %>
${reg.name},<%
}
}%>
NUM_REGS,
NEXT_${pc.name}=NUM_REGS,
TRAP_STATE,
PENDING_TRAP,
MACHINE_STATE,
LAST_BRANCH,
ICOUNT<%
allRegs.each { reg ->
if(reg instanceof RegisterAlias){ def aliasname=getOriginalName(reg)%>,
${reg.name} = ${aliasname}<%
}
}%>
};
using reg_t = uint${regDataWidth}_t;
using addr_t = uint${addrDataWidth}_t;
using code_word_t = uint${addrDataWidth}_t; //TODO: check removal
using virt_addr_t = iss::typed_addr_t<iss::address_type::VIRTUAL>;
using phys_addr_t = iss::typed_addr_t<iss::address_type::PHYSICAL>;
static constexpr std::array<const uint32_t, ${regSizes.size}> reg_bit_widths{
{${regSizes.join(",")}}};
static constexpr std::array<const uint32_t, ${regOffsets.size}> reg_byte_offsets{
{${regOffsets.join(",")}}};
static const uint64_t addr_mask = (reg_t(1) << (XLEN - 1)) | ((reg_t(1) << (XLEN - 1)) - 1);
enum sreg_flag_e { FLAGS };
enum mem_type_e { ${allSpaces.collect{s -> s.name}.join(', ')} };
};
struct ${coreDef.name.toLowerCase()}: public arch_if {
using virt_addr_t = typename traits<${coreDef.name.toLowerCase()}>::virt_addr_t;
using phys_addr_t = typename traits<${coreDef.name.toLowerCase()}>::phys_addr_t;
using reg_t = typename traits<${coreDef.name.toLowerCase()}>::reg_t;
using addr_t = typename traits<${coreDef.name.toLowerCase()}>::addr_t;
${coreDef.name.toLowerCase()}();
~${coreDef.name.toLowerCase()}();
void reset(uint64_t address=0) override;
uint8_t* get_regs_base_ptr() override;
/// deprecated
void get_reg(short idx, std::vector<uint8_t>& value) override {}
void set_reg(short idx, const std::vector<uint8_t>& value) override {}
/// deprecated
bool get_flag(int flag) override {return false;}
void set_flag(int, bool value) override {};
/// deprecated
void update_flags(operations op, uint64_t opr1, uint64_t opr2) override {};
inline uint64_t get_icount() { return reg.icount; }
inline bool should_stop() { return interrupt_sim; }
inline uint64_t stop_code() { return interrupt_sim; }
inline phys_addr_t v2p(const iss::addr_t& addr){
if (addr.space != traits<${coreDef.name.toLowerCase()}>::MEM || addr.type == iss::address_type::PHYSICAL ||
addr_mode[static_cast<uint16_t>(addr.access)&0x3]==address_type::PHYSICAL) {
return phys_addr_t(addr.access, addr.space, addr.val&traits<${coreDef.name.toLowerCase()}>::addr_mask);
} else
return virt2phys(addr);
}
virtual phys_addr_t virt2phys(const iss::addr_t& addr);
virtual iss::sync_type needed_sync() const { return iss::NO_SYNC; }
inline uint32_t get_last_branch() { return reg.last_branch; }
protected:
struct ${coreDef.name}_regs {<%
allRegs.each { reg ->
if( reg instanceof RegisterFile) {
(reg.range.right..reg.range.left).each{%>
uint${generator.getSize(reg)}_t ${reg.name}${it} = 0;<%
}
} else if(reg instanceof Register){ %>
uint${generator.getSize(reg)}_t ${reg.name} = 0;<%
}
}%>
uint${generator.getSize(pc)}_t NEXT_${pc.name} = 0;
uint32_t trap_state = 0, pending_trap = 0, machine_state = 0, last_branch = 0;
uint64_t icount = 0;
} reg;
std::array<address_type, 4> addr_mode;
uint64_t interrupt_sim=0;
<%
def fcsr = allRegs.find {it.name=='FCSR'}
if(fcsr != null) {%>
uint${generator.getSize(fcsr)}_t get_fcsr(){return reg.FCSR;}
void set_fcsr(uint${generator.getSize(fcsr)}_t val){reg.FCSR = val;}
<%} else { %>
uint32_t get_fcsr(){return 0;}
void set_fcsr(uint32_t val){}
<%}%>
};
}
}
#endif /* _${coreDef.name.toUpperCase()}_H_ */

View File

@ -0,0 +1,107 @@
/*******************************************************************************
* Copyright (C) 2017, 2018 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
<%
import com.minres.coredsl.coreDsl.Register
import com.minres.coredsl.coreDsl.RegisterFile
import com.minres.coredsl.coreDsl.RegisterAlias
def getOriginalName(reg){
if( reg.original instanceof RegisterFile) {
if( reg.index != null ) {
return reg.original.name+generator.generateHostCode(reg.index)
} else {
return reg.original.name
}
} else if(reg.original instanceof Register){
return reg.original.name
}
}
def getRegisterNames(){
def regNames = []
allRegs.each { reg ->
if( reg instanceof RegisterFile) {
(reg.range.right..reg.range.left).each{
regNames+=reg.name.toLowerCase()+it
}
} else if(reg instanceof Register){
regNames+=reg.name.toLowerCase()
}
}
return regNames
}
def getRegisterAliasNames(){
def regMap = allRegs.findAll{it instanceof RegisterAlias }.collectEntries {[getOriginalName(it), it.name]}
return allRegs.findAll{it instanceof Register || it instanceof RegisterFile}.collect{reg ->
if( reg instanceof RegisterFile) {
return (reg.range.right..reg.range.left).collect{ (regMap[reg.name]?:regMap[reg.name+it]?:reg.name.toLowerCase()+it).toLowerCase() }
} else if(reg instanceof Register){
regMap[reg.name]?:reg.name.toLowerCase()
}
}.flatten()
}
%>
#include "util/ities.h"
#include <util/logging.h>
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <cstdio>
#include <cstring>
#include <fstream>
using namespace iss::arch;
constexpr std::array<const char*, ${getRegisterNames().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_names;
constexpr std::array<const char*, ${getRegisterAliasNames().size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_aliases;
constexpr std::array<const uint32_t, ${regSizes.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_bit_widths;
constexpr std::array<const uint32_t, ${regOffsets.size}> iss::arch::traits<iss::arch::${coreDef.name.toLowerCase()}>::reg_byte_offsets;
${coreDef.name.toLowerCase()}::${coreDef.name.toLowerCase()}() {
reg.icount = 0;
}
${coreDef.name.toLowerCase()}::~${coreDef.name.toLowerCase()}() = default;
void ${coreDef.name.toLowerCase()}::reset(uint64_t address) {
for(size_t i=0; i<traits<${coreDef.name.toLowerCase()}>::NUM_REGS; ++i) set_reg(i, std::vector<uint8_t>(sizeof(traits<${coreDef.name.toLowerCase()}>::reg_t),0));
reg.PC=address;
reg.NEXT_PC=reg.PC;
reg.trap_state=0;
reg.machine_state=0x3;
reg.icount=0;
}
uint8_t *${coreDef.name.toLowerCase()}::get_regs_base_ptr() {
return reinterpret_cast<uint8_t*>(&reg);
}
${coreDef.name.toLowerCase()}::phys_addr_t ${coreDef.name.toLowerCase()}::virt2phys(const iss::addr_t &pc) {
return phys_addr_t(pc); // change logical address to physical address
}

View File

@ -0,0 +1,325 @@
/*******************************************************************************
* Copyright (C) 2017, 2018 MINRES Technologies GmbH
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
*
* 3. Neither the name of the copyright holder nor the names of its contributors
* may be used to endorse or promote products derived from this software
* without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*
*******************************************************************************/
#include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h>
#include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/arch/riscv_hart_m_p.h>
#include <iss/iss.h>
#include <iss/llvm/vm_base.h>
#include <util/logging.h>
#ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY
#endif
#include <fmt/format.h>
#include <array>
#include <iss/debugger/riscv_target_adapter.h>
namespace iss {
namespace llvm {
namespace fp_impl {
void add_fp_functions_2_module(::llvm::Module *, unsigned, unsigned);
}
namespace ${coreDef.name.toLowerCase()} {
using namespace ::llvm;
using namespace iss::arch;
using namespace iss::debugger;
template <typename ARCH> class vm_impl : public iss::llvm::vm_base<ARCH> {
public:
using super = typename iss::llvm::vm_base<ARCH>;
using virt_addr_t = typename super::virt_addr_t;
using phys_addr_t = typename super::phys_addr_t;
using code_word_t = typename super::code_word_t;
using addr_t = typename super::addr_t;
vm_impl();
vm_impl(ARCH &core, unsigned core_id = 0, unsigned cluster_id = 0);
void enableDebug(bool enable) { super::sync_exec = super::ALL_SYNC; }
target_adapter_if *accquire_target_adapter(server_if *srv) override {
debugger_if::dbg_enabled = true;
if (vm_base<ARCH>::tgt_adapter == nullptr)
vm_base<ARCH>::tgt_adapter = new riscv_target_adapter<ARCH>(srv, this->get_arch());
return vm_base<ARCH>::tgt_adapter;
}
protected:
using vm_base<ARCH>::get_reg_ptr;
inline const char *name(size_t index){return traits<ARCH>::reg_aliases.at(index);}
template <typename T> inline ConstantInt *size(T type) {
return ConstantInt::get(getContext(), APInt(32, type->getType()->getScalarSizeInBits()));
}
void setup_module(Module* m) override {
super::setup_module(m);
iss::llvm::fp_impl::add_fp_functions_2_module(m, traits<ARCH>::FP_REGS_SIZE, traits<ARCH>::XLEN);
}
inline Value *gen_choose(Value *cond, Value *trueVal, Value *falseVal, unsigned size) {
return super::gen_cond_assign(cond, this->gen_ext(trueVal, size), this->gen_ext(falseVal, size));
}
std::tuple<continuation_e, BasicBlock *> gen_single_inst_behavior(virt_addr_t &, unsigned int &, BasicBlock *) override;
void gen_leave_behavior(BasicBlock *leave_blk) override;
void gen_raise_trap(uint16_t trap_id, uint16_t cause);
void gen_leave_trap(unsigned lvl);
void gen_wait(unsigned type);
void gen_trap_behavior(BasicBlock *) override;
void gen_trap_check(BasicBlock *bb);
inline Value *gen_reg_load(unsigned i, unsigned level = 0) {
return this->builder.CreateLoad(get_reg_ptr(i), false);
}
inline void gen_set_pc(virt_addr_t pc, unsigned reg_num) {
Value *next_pc_v = this->builder.CreateSExtOrTrunc(this->gen_const(traits<ARCH>::XLEN, pc.val),
this->get_type(traits<ARCH>::XLEN));
this->builder.CreateStore(next_pc_v, get_reg_ptr(reg_num), true);
}
// some compile time constants
// enum { MASK16 = 0b1111110001100011, MASK32 = 0b11111111111100000111000001111111 };
enum { MASK16 = 0b1111111111111111, MASK32 = 0b11111111111100000111000001111111 };
enum { EXTR_MASK16 = MASK16 >> 2, EXTR_MASK32 = MASK32 >> 2 };
enum { LUT_SIZE = 1 << util::bit_count(EXTR_MASK32), LUT_SIZE_C = 1 << util::bit_count(EXTR_MASK16) };
using this_class = vm_impl<ARCH>;
using compile_func = std::tuple<continuation_e, BasicBlock *> (this_class::*)(virt_addr_t &pc,
code_word_t instr,
BasicBlock *bb);
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
std::array<compile_func *, 4> qlut;
std::array<const uint32_t, 4> lutmasks = {{EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32}};
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) {
if (pos < 0) {
lut[idx] = f;
} else {
auto bitmask = 1UL << pos;
if ((mask & bitmask) == 0) {
expand_bit_mask(pos - 1, mask, value, valid, idx, lut, f);
} else {
if ((valid & bitmask) == 0) {
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1), lut, f);
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1) + 1, lut, f);
} else {
auto new_val = idx << 1;
if ((value & bitmask) != 0) new_val++;
expand_bit_mask(pos - 1, mask, value, valid, new_val, lut, f);
}
}
}
}
inline uint32_t extract_fields(uint32_t val) { return extract_fields(29, val >> 2, lutmasks[val & 0x3], 0); }
uint32_t extract_fields(int pos, uint32_t val, uint32_t mask, uint32_t lut_val) {
if (pos >= 0) {
auto bitmask = 1UL << pos;
if ((mask & bitmask) == 0) {
lut_val = extract_fields(pos - 1, val, mask, lut_val);
} else {
auto new_val = lut_val << 1;
if ((val & bitmask) != 0) new_val++;
lut_val = extract_fields(pos - 1, val, mask, new_val);
}
}
return lut_val;
}
private:
/****************************************************************************
* start opcode definitions
****************************************************************************/
struct InstructionDesriptor {
size_t length;
uint32_t value;
uint32_t mask;
compile_func op;
};
const std::array<InstructionDesriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name} */
{${instr.length}, ${instr.value}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}};
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */
std::tuple<continuation_e, BasicBlock*> __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, BasicBlock* bb){<%instr.code.eachLine{%>
${it}<%}%>
}
<%}%>
/****************************************************************************
* end opcode definitions
****************************************************************************/
std::tuple<continuation_e, BasicBlock *> illegal_intruction(virt_addr_t &pc, code_word_t instr, BasicBlock *bb) {
this->gen_sync(iss::PRE_SYNC, instr_descr.size());
this->builder.CreateStore(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), true),
get_reg_ptr(traits<ARCH>::PC), true);
this->builder.CreateStore(
this->builder.CreateAdd(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::ICOUNT), true),
this->gen_const(64U, 1)),
get_reg_ptr(traits<ARCH>::ICOUNT), true);
pc = pc + ((instr & 3) == 3 ? 4 : 2);
this->gen_raise_trap(0, 2); // illegal instruction trap
this->gen_sync(iss::POST_SYNC, instr_descr.size());
this->gen_trap_check(this->leave_blk);
return std::make_tuple(BRANCH, nullptr);
}
};
template <typename CODE_WORD> void debug_fn(CODE_WORD insn) {
volatile CODE_WORD x = insn;
insn = 2 * x;
}
template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) {
qlut[0] = lut_00.data();
qlut[1] = lut_01.data();
qlut[2] = lut_10.data();
qlut[3] = lut_11.data();
for (auto instr : instr_descr) {
auto quantrant = instr.value & 0x3;
expand_bit_mask(29, lutmasks[quantrant], instr.value >> 2, instr.mask >> 2, 0, qlut[quantrant], instr.op);
}
}
template <typename ARCH>
std::tuple<continuation_e, BasicBlock *>
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, BasicBlock *this_block) {
// we fetch at max 4 byte, alignment is 2
enum {TRAP_ID=1<<16};
code_word_t insn = 0;
const typename traits<ARCH>::addr_t upper_bits = ~traits<ARCH>::PGMASK;
phys_addr_t paddr(pc);
auto *const data = (uint8_t *)&insn;
paddr = this->core.v2p(pc);
if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary
auto res = this->core.read(paddr, 2, data);
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
if ((insn & 0x3) == 0x3) { // this is a 32bit instruction
res = this->core.read(this->core.v2p(pc + 2), 2, data + 2);
}
} else {
auto res = this->core.read(paddr, 4, data);
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
}
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
// curr pc on stack
++inst_cnt;
auto lut_val = extract_fields(insn);
auto f = qlut[insn & 0x3][lut_val];
if (f == nullptr) {
f = &this_class::illegal_intruction;
}
return (this->*f)(pc, insn, this_block);
}
template <typename ARCH> void vm_impl<ARCH>::gen_leave_behavior(BasicBlock *leave_blk) {
this->builder.SetInsertPoint(leave_blk);
this->builder.CreateRet(this->builder.CreateLoad(get_reg_ptr(arch::traits<ARCH>::NEXT_PC), false));
}
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(uint16_t trap_id, uint16_t cause) {
auto *TRAP_val = this->gen_const(32, 0x80 << 24 | (cause << 16) | trap_id);
this->builder.CreateStore(TRAP_val, get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
}
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(unsigned lvl) {
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, lvl)) };
this->builder.CreateCall(this->mod->getFunction("leave_trap"), args);
auto *PC_val = this->gen_read_mem(traits<ARCH>::CSR, (lvl << 8) + 0x41, traits<ARCH>::XLEN / 8);
this->builder.CreateStore(PC_val, get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()), get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
}
template <typename ARCH> void vm_impl<ARCH>::gen_wait(unsigned type) {
std::vector<Value *> args{ this->core_ptr, ConstantInt::get(getContext(), APInt(64, type)) };
this->builder.CreateCall(this->mod->getFunction("wait"), args);
}
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(BasicBlock *trap_blk) {
this->builder.SetInsertPoint(trap_blk);
auto *trap_state_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::TRAP_STATE), true);
this->builder.CreateStore(this->gen_const(32U, std::numeric_limits<uint32_t>::max()),
get_reg_ptr(traits<ARCH>::LAST_BRANCH), false);
std::vector<Value *> args{this->core_ptr, this->adj_to64(trap_state_val),
this->adj_to64(this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::PC), false))};
this->builder.CreateCall(this->mod->getFunction("enter_trap"), args);
auto *trap_addr_val = this->builder.CreateLoad(get_reg_ptr(traits<ARCH>::NEXT_PC), false);
this->builder.CreateRet(trap_addr_val);
}
template <typename ARCH> inline void vm_impl<ARCH>::gen_trap_check(BasicBlock *bb) {
auto *v = this->builder.CreateLoad(get_reg_ptr(arch::traits<ARCH>::TRAP_STATE), true);
this->gen_cond_branch(this->builder.CreateICmp(
ICmpInst::ICMP_EQ, v,
ConstantInt::get(getContext(), APInt(v->getType()->getIntegerBitWidth(), 0))),
bb, this->trap_blk, 1);
}
} // namespace ${coreDef.name.toLowerCase()}
template <>
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
auto ret = new ${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*core, dump);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(ret, port);
return std::unique_ptr<vm_if>(ret);
}
} // namespace llvm
} // namespace iss

View File

@ -1,5 +1,5 @@
/******************************************************************************* /*******************************************************************************
* Copyright (C) 2020-2024 MINRES Technologies GmbH * Copyright (C) 2020 MINRES Technologies GmbH
* All rights reserved. * All rights reserved.
* *
* Redistribution and use in source and binary forms, with or without * Redistribution and use in source and binary forms, with or without
@ -29,7 +29,7 @@
* POSSIBILITY OF SUCH DAMAGE. * POSSIBILITY OF SUCH DAMAGE.
* *
*******************************************************************************/ *******************************************************************************/
// clang-format off
#include <iss/arch/${coreDef.name.toLowerCase()}.h> #include <iss/arch/${coreDef.name.toLowerCase()}.h>
#include <iss/debugger/gdb_session.h> #include <iss/debugger/gdb_session.h>
#include <iss/debugger/server.h> #include <iss/debugger/server.h>
@ -37,10 +37,7 @@
#include <iss/tcc/vm_base.h> #include <iss/tcc/vm_base.h>
#include <util/logging.h> #include <util/logging.h>
#include <sstream> #include <sstream>
#include <iss/instruction_decoder.h>
<%def fcsr = registers.find {it.name=='FCSR'}
if(fcsr != null) {%>
#include <vm/fp_functions.h><%}%>
#ifndef FMT_HEADER_ONLY #ifndef FMT_HEADER_ONLY
#define FMT_HEADER_ONLY #define FMT_HEADER_ONLY
#endif #endif
@ -87,12 +84,7 @@ protected:
using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr, tu_builder&); using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr, tu_builder&);
inline const char *name(size_t index){return traits::reg_aliases.at(index);} inline const char *name(size_t index){return traits::reg_aliases.at(index);}
<%
if(fcsr != null) {%>
inline const char *fname(size_t index){return index < 32?name(index+traits::F0):"illegal";}
void add_prologue(tu_builder& tu) override;
<%}%>
void setup_module(std::string m) override { void setup_module(std::string m) override {
super::setup_module(m); super::setup_module(m);
} }
@ -105,9 +97,7 @@ if(fcsr != null) {%>
void gen_leave_trap(tu_builder& tu, unsigned lvl); void gen_leave_trap(tu_builder& tu, unsigned lvl);
inline void gen_set_tval(tu_builder& tu, uint64_t new_tval); void gen_wait(tu_builder& tu, unsigned type);
inline void gen_set_tval(tu_builder& tu, value new_tval);
inline void gen_trap_check(tu_builder& tu) { inline void gen_trap_check(tu_builder& tu) {
tu("if(*trap_state!=0) goto trap_entry;"); tu("if(*trap_state!=0) goto trap_entry;");
@ -130,184 +120,188 @@ if(fcsr != null) {%>
} }
} }
// some compile time constants
// enum { MASK16 = 0b1111110001100011, MASK32 = 0b11111111111100000111000001111111 };
enum { MASK16 = 0b1111111111111111, MASK32 = 0b11111111111100000111000001111111 };
enum { EXTR_MASK16 = MASK16 >> 2, EXTR_MASK32 = MASK32 >> 2 };
enum { LUT_SIZE = 1 << util::bit_count(static_cast<uint32_t>(EXTR_MASK32)), LUT_SIZE_C = 1 << util::bit_count(static_cast<uint32_t>(EXTR_MASK16)) };
std::array<compile_func, LUT_SIZE> lut;
std::array<compile_func, LUT_SIZE_C> lut_00, lut_01, lut_10;
std::array<compile_func, LUT_SIZE> lut_11;
std::array<compile_func *, 4> qlut;
std::array<const uint32_t, 4> lutmasks = {{EXTR_MASK16, EXTR_MASK16, EXTR_MASK16, EXTR_MASK32}};
void expand_bit_mask(int pos, uint32_t mask, uint32_t value, uint32_t valid, uint32_t idx, compile_func lut[],
compile_func f) {
if (pos < 0) {
lut[idx] = f;
} else {
auto bitmask = 1UL << pos;
if ((mask & bitmask) == 0) {
expand_bit_mask(pos - 1, mask, value, valid, idx, lut, f);
} else {
if ((valid & bitmask) == 0) {
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1), lut, f);
expand_bit_mask(pos - 1, mask, value, valid, (idx << 1) + 1, lut, f);
} else {
auto new_val = idx << 1;
if ((value & bitmask) != 0) new_val++;
expand_bit_mask(pos - 1, mask, value, valid, new_val, lut, f);
}
}
}
}
inline uint32_t extract_fields(uint32_t val) { return extract_fields(29, val >> 2, lutmasks[val & 0x3], 0); }
uint32_t extract_fields(int pos, uint32_t val, uint32_t mask, uint32_t lut_val) {
if (pos >= 0) {
auto bitmask = 1UL << pos;
if ((mask & bitmask) == 0) {
lut_val = extract_fields(pos - 1, val, mask, lut_val);
} else {
auto new_val = lut_val << 1;
if ((val & bitmask) != 0) new_val++;
lut_val = extract_fields(pos - 1, val, mask, new_val);
}
}
return lut_val;
}
template<unsigned W, typename U, typename S = typename std::make_signed<U>::type> template<unsigned W, typename U, typename S = typename std::make_signed<U>::type>
inline S sext(U from) { inline S sext(U from) {
auto mask = (1ULL<<W) - 1; auto mask = (1ULL<<W) - 1;
auto sign_mask = 1ULL<<(W-1); auto sign_mask = 1ULL<<(W-1);
return (from & mask) | ((from & sign_mask) ? ~mask : 0); return (from & mask) | ((from & sign_mask) ? ~mask : 0);
} }
<%functions.each{ it.eachLine { %>
${it}<%}%>
<%}%>
private: private:
/**************************************************************************** /****************************************************************************
* start opcode definitions * start opcode definitions
****************************************************************************/ ****************************************************************************/
struct instruction_descriptor { struct InstructionDesriptor {
uint32_t length; size_t length;
uint32_t value; uint32_t value;
uint32_t mask; uint32_t mask;
compile_func op; compile_func op;
}; };
const std::array<instruction_descriptor, ${instructions.size()}> instr_descr = {{ const std::array<InstructionDesriptor, ${instructions.size}> instr_descr = {{
/* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %> /* entries are: size, valid value, valid mask, function ptr */<%instructions.each{instr -> %>
/* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */ /* instruction ${instr.instruction.name}, encoding '${instr.encoding}' */
{${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%> {${instr.length}, ${instr.encoding}, ${instr.mask}, &this_class::__${generator.functionName(instr.name)}},<%}%>
}}; }};
//needs to be declared after instr_descr
decoder instr_decoder;
/* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %> /* instruction definitions */<%instructions.eachWithIndex{instr, idx -> %>
/* instruction ${idx}: ${instr.name} */ /* instruction ${idx}: ${instr.name} */
compile_ret_t __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, tu_builder& tu){ compile_ret_t __${generator.functionName(instr.name)}(virt_addr_t& pc, code_word_t instr, tu_builder& tu){
tu("${instr.name}_{:#010x}:", pc.val); tu("${instr.name}_{:#010x}:", pc.val);
vm_base<ARCH>::gen_sync(tu, PRE_SYNC,${idx}); vm_base<ARCH>::gen_sync(tu, PRE_SYNC,${idx});
uint64_t PC = pc.val;
<%instr.fields.eachLine{%>${it} <%instr.fields.eachLine{%>${it}
<%}%>if(this->disass_enabled){ <%}%>if(this->disass_enabled){
/* generate console output when executing the command */<%instr.disass.eachLine{%> /* generate console output when executing the command */<%instr.disass.eachLine{%>
${it}<%}%> ${it}<%}%>
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, mnemonic);
} }
auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]); auto cur_pc_val = tu.constant(pc.val, traits::reg_bit_widths[traits::PC]);
pc=pc+ ${instr.length/8}; pc=pc+ ${instr.length/8};
gen_set_pc(tu, pc, traits::NEXT_PC); gen_set_pc(tu, pc, traits::NEXT_PC);
tu.open_scope(); tu.open_scope();<%instr.behavior.eachLine{%>
this->gen_set_tval(tu, instr); ${it}<%}%>
<%instr.behavior.eachLine{%>${it}
<%}%>
tu.close_scope(); tu.close_scope();
vm_base<ARCH>::gen_sync(tu, POST_SYNC,${idx}); vm_base<ARCH>::gen_sync(tu, POST_SYNC,${idx});
gen_trap_check(tu); gen_trap_check(tu);
return returnValue; return returnValue;
} }
<%}%> <%}%>
/**************************************************************************** /****************************************************************************
* end opcode definitions * end opcode definitions
****************************************************************************/ ****************************************************************************/
compile_ret_t illegal_instruction(virt_addr_t &pc, code_word_t instr, tu_builder& tu) { compile_ret_t illegal_intruction(virt_addr_t &pc, code_word_t instr, tu_builder& tu) {
vm_impl::gen_sync(tu, iss::PRE_SYNC, instr_descr.size()); vm_impl::gen_sync(tu, iss::PRE_SYNC, instr_descr.size());
if(this->disass_enabled){
/* generate console output when executing the command */
tu("print_disass(core_ptr, {:#x}, \"{}\");", pc.val, std::string("illegal_instruction"));
}
pc = pc + ((instr & 3) == 3 ? 4 : 2); pc = pc + ((instr & 3) == 3 ? 4 : 2);
gen_raise_trap(tu, 0, static_cast<int32_t>(traits:: RV_CAUSE_ILLEGAL_INSTRUCTION)); gen_raise_trap(tu, 0, 2); // illegal instruction trap
this->gen_set_tval(tu, instr);
vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size()); vm_impl::gen_sync(tu, iss::POST_SYNC, instr_descr.size());
vm_impl::gen_trap_check(tu); vm_impl::gen_trap_check(tu);
return ILLEGAL_INSTR; return BRANCH;
} }
}; };
template <typename CODE_WORD> void debug_fn(CODE_WORD instr) { template <typename CODE_WORD> void debug_fn(CODE_WORD insn) {
volatile CODE_WORD x = instr; volatile CODE_WORD x = insn;
instr = 2 * x; insn = 2 * x;
} }
template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); } template <typename ARCH> vm_impl<ARCH>::vm_impl() { this(new ARCH()); }
template <typename ARCH> template <typename ARCH>
vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id) vm_impl<ARCH>::vm_impl(ARCH &core, unsigned core_id, unsigned cluster_id)
: vm_base<ARCH>(core, core_id, cluster_id) : vm_base<ARCH>(core, core_id, cluster_id) {
, instr_decoder([this]() { qlut[0] = lut_00.data();
std::vector<generic_instruction_descriptor> g_instr_descr; qlut[1] = lut_01.data();
g_instr_descr.reserve(instr_descr.size()); qlut[2] = lut_10.data();
for (uint32_t i = 0; i < instr_descr.size(); ++i) { qlut[3] = lut_11.data();
generic_instruction_descriptor new_instr_descr {instr_descr[i].value, instr_descr[i].mask, i}; for (auto instr : instr_descr) {
g_instr_descr.push_back(new_instr_descr); auto quantrant = instr.value & 0x3;
} expand_bit_mask(29, lutmasks[quantrant], instr.value >> 2, instr.mask >> 2, 0, qlut[quantrant], instr.op);
return std::move(g_instr_descr); }
}()) {} }
template <typename ARCH> template <typename ARCH>
std::tuple<continuation_e> std::tuple<continuation_e>
vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, tu_builder& tu) { vm_impl<ARCH>::gen_single_inst_behavior(virt_addr_t &pc, unsigned int &inst_cnt, tu_builder& tu) {
// we fetch at max 4 byte, alignment is 2 // we fetch at max 4 byte, alignment is 2
enum {TRAP_ID=1<<16}; enum {TRAP_ID=1<<16};
code_word_t instr = 0; code_word_t insn = 0;
// const typename traits::addr_t upper_bits = ~traits::PGMASK;
phys_addr_t paddr(pc); phys_addr_t paddr(pc);
if(this->core.has_mmu()) auto *const data = (uint8_t *)&insn;
paddr = this->core.virt2phys(pc); paddr = this->core.v2p(pc);
auto res = this->core.read(paddr, 4, reinterpret_cast<uint8_t*>(&instr)); // if ((pc.val & upper_bits) != ((pc.val + 2) & upper_bits)) { // we may cross a page boundary
if (res != iss::Ok) // auto res = this->core.read(paddr, 2, data);
return ILLEGAL_FETCH; // if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
if (instr == 0x0000006f || (instr&0xffff)==0xa001) // if ((insn & 0x3) == 0x3) { // this is a 32bit instruction
return JUMP_TO_SELF; // res = this->core.read(this->core.v2p(pc + 2), 2, data + 2);
// }
// } else {
auto res = this->core.read(paddr, 4, data);
if (res != iss::Ok) throw trap_access(TRAP_ID, pc.val);
// }
if (insn == 0x0000006f || (insn&0xffff)==0xa001) throw simulation_stopped(0); // 'J 0' or 'C.J 0'
// curr pc on stack
++inst_cnt; ++inst_cnt;
uint32_t inst_index = instr_decoder.decode_instr(instr); auto lut_val = extract_fields(insn);
compile_func f = nullptr; auto f = qlut[insn & 0x3][lut_val];
if(inst_index < instr_descr.size())
f = instr_descr[inst_index].op;
if (f == nullptr) { if (f == nullptr) {
f = &this_class::illegal_instruction; f = &this_class::illegal_intruction;
} }
return (this->*f)(pc, instr, tu); return (this->*f)(pc, insn, tu);
} }
template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) { template <typename ARCH> void vm_impl<ARCH>::gen_raise_trap(tu_builder& tu, uint16_t trap_id, uint16_t cause) {
tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id); tu(" *trap_state = {:#x};", 0x80 << 24 | (cause << 16) | trap_id);
tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(), 32));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) { template <typename ARCH> void vm_impl<ARCH>::gen_leave_trap(tu_builder& tu, unsigned lvl) {
tu("leave_trap(core_ptr, {});", lvl); tu("leave_trap(core_ptr, {});", lvl);
tu.store(traits::NEXT_PC, tu.read_mem(traits::CSR, (lvl << 8) + 0x41, traits::XLEN)); tu.store(traits::NEXT_PC, tu.read_mem(traits::CSR, (lvl << 8) + 0x41, traits::XLEN));
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(UNKNOWN_JUMP), 32)); tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(), 32));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_set_tval(tu_builder& tu, uint64_t new_tval) { template <typename ARCH> void vm_impl<ARCH>::gen_wait(tu_builder& tu, unsigned type) {
tu(fmt::format("tval = {};", new_tval));
}
template <typename ARCH> void vm_impl<ARCH>::gen_set_tval(tu_builder& tu, value new_tval) {
tu(fmt::format("tval = {};", new_tval.str));
} }
template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) { template <typename ARCH> void vm_impl<ARCH>::gen_trap_behavior(tu_builder& tu) {
tu("trap_entry:"); tu("trap_entry:");
this->gen_sync(tu, POST_SYNC, -1); tu("enter_trap(core_ptr, *trap_state, *pc, 0);");
tu("enter_trap(core_ptr, *trap_state, *pc, tval);"); tu.store(traits::LAST_BRANCH, tu.constant(std::numeric_limits<uint32_t>::max(),32));
tu.store(traits::LAST_BRANCH, tu.constant(static_cast<int>(UNKNOWN_JUMP),32));
tu("return *next_pc;"); tu("return *next_pc;");
} }
<%
if(fcsr != null) {%>
template <typename ARCH> void vm_impl<ARCH>::add_prologue(tu_builder& tu){
std::ostringstream os;
os << "uint32_t (*fget_flags)()=" << (uintptr_t)&fget_flags << ";\\n";
os << "uint32_t (*fadd_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fadd_s << ";\\n";
os << "uint32_t (*fsub_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fsub_s << ";\\n";
os << "uint32_t (*fmul_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fmul_s << ";\\n";
os << "uint32_t (*fdiv_s)(uint32_t v1, uint32_t v2, uint8_t mode)=" << (uintptr_t)&fdiv_s << ";\\n";
os << "uint32_t (*fsqrt_s)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&fsqrt_s << ";\\n";
os << "uint32_t (*fcmp_s)(uint32_t v1, uint32_t v2, uint32_t op)=" << (uintptr_t)&fcmp_s << ";\\n";
os << "uint32_t (*fcvt_s)(uint32_t v1, uint32_t op, uint8_t mode)=" << (uintptr_t)&fcvt_s << ";\\n";
os << "uint32_t (*fmadd_s)(uint32_t v1, uint32_t v2, uint32_t v3, uint32_t op, uint8_t mode)=" << (uintptr_t)&fmadd_s << ";\\n";
os << "uint32_t (*fsel_s)(uint32_t v1, uint32_t v2, uint32_t op)=" << (uintptr_t)&fsel_s << ";\\n";
os << "uint32_t (*fclass_s)( uint32_t v1 )=" << (uintptr_t)&fclass_s << ";\\n";
os << "uint32_t (*fconv_d2f)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&fconv_d2f << ";\\n";
os << "uint64_t (*fconv_f2d)(uint32_t v1, uint8_t mode)=" << (uintptr_t)&fconv_f2d << ";\\n";
os << "uint64_t (*fadd_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fadd_d << ";\\n";
os << "uint64_t (*fsub_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fsub_d << ";\\n";
os << "uint64_t (*fmul_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fmul_d << ";\\n";
os << "uint64_t (*fdiv_d)(uint64_t v1, uint64_t v2, uint8_t mode)=" << (uintptr_t)&fdiv_d << ";\\n";
os << "uint64_t (*fsqrt_d)(uint64_t v1, uint8_t mode)=" << (uintptr_t)&fsqrt_d << ";\\n";
os << "uint64_t (*fcmp_d)(uint64_t v1, uint64_t v2, uint32_t op)=" << (uintptr_t)&fcmp_d << ";\\n";
os << "uint64_t (*fcvt_d)(uint64_t v1, uint32_t op, uint8_t mode)=" << (uintptr_t)&fcvt_d << ";\\n";
os << "uint64_t (*fmadd_d)(uint64_t v1, uint64_t v2, uint64_t v3, uint32_t op, uint8_t mode)=" << (uintptr_t)&fmadd_d << ";\\n";
os << "uint64_t (*fsel_d)(uint64_t v1, uint64_t v2, uint32_t op)=" << (uintptr_t)&fsel_d << ";\\n";
os << "uint64_t (*fclass_d)(uint64_t v1 )=" << (uintptr_t)&fclass_d << ";\\n";
os << "uint64_t (*fcvt_32_64)(uint32_t v1, uint32_t op, uint8_t mode)=" << (uintptr_t)&fcvt_32_64 << ";\\n";
os << "uint32_t (*fcvt_64_32)(uint64_t v1, uint32_t op, uint8_t mode)=" << (uintptr_t)&fcvt_64_32 << ";\\n";
os << "uint32_t (*unbox_s)(uint64_t v)=" << (uintptr_t)&unbox_s << ";\\n";
tu.add_prologue(os.str());
}
<%}%>
} // namespace ${coreDef.name.toLowerCase()} } // namespace mnrv32
template <> template <>
std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) { std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreDef.name.toLowerCase()} *core, unsigned short port, bool dump) {
@ -318,33 +312,29 @@ std::unique_ptr<vm_if> create<arch::${coreDef.name.toLowerCase()}>(arch::${coreD
} // namesapce tcc } // namesapce tcc
} // namespace iss } // namespace iss
#include <iss/factory.h>
#include <iss/arch/riscv_hart_m_p.h> #include <iss/arch/riscv_hart_m_p.h>
#include <iss/arch/riscv_hart_mu_p.h> #include <iss/arch/riscv_hart_mu_p.h>
#include <iss/factory.h>
namespace iss { namespace iss {
namespace { namespace {
volatile std::array<bool, 2> dummy = { std::array<bool, 2> dummy = {
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|tcc", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{ core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|m_p|tcc", [](unsigned port, void*) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>(); auto* cpu = new iss::arch::riscv_hart_m_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
}), }),
core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|tcc", [](unsigned port, void* init_data) -> std::tuple<cpu_ptr, vm_ptr>{ core_factory::instance().register_creator("${coreDef.name.toLowerCase()}|mu_p|tcc", [](unsigned port, void*) -> std::tuple<cpu_ptr, vm_ptr>{
auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>(); auto* cpu = new iss::arch::riscv_hart_mu_p<iss::arch::${coreDef.name.toLowerCase()}>();
auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false); auto vm = new tcc::${coreDef.name.toLowerCase()}::vm_impl<arch::${coreDef.name.toLowerCase()}>(*cpu, false);
if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port); if (port != 0) debugger::server<debugger::gdb_session>::run_server(vm, port);
if(init_data){
auto* cb = reinterpret_cast<semihosting_cb_t<arch::traits<arch::${coreDef.name.toLowerCase()}>::reg_t>*>(init_data);
cpu->set_semihosting_callback(*cb);
}
return {cpu_ptr{cpu}, vm_ptr{vm}}; return {cpu_ptr{cpu}, vm_ptr{vm}};
}) })
}; };
} }
} }
// clang-format on extern "C" {
bool* get_${coreDef.name.toLowerCase()}_tcc_creators() {
return iss::dummy.data();
}
}

View File

@ -1,2 +0,0 @@
build/*/*.o
build/*/*.a

View File

@ -327,7 +327,7 @@ set(OTHERS
set(LIB_SOURCES ${PRIMITIVES} ${SPECIALIZE} ${OTHERS}) set(LIB_SOURCES ${PRIMITIVES} ${SPECIALIZE} ${OTHERS})
add_library(softfloat STATIC ${LIB_SOURCES}) add_library(softfloat ${LIB_SOURCES})
set_property(TARGET softfloat PROPERTY C_STANDARD 99) set_property(TARGET softfloat PROPERTY C_STANDARD 99)
target_compile_definitions(softfloat PRIVATE target_compile_definitions(softfloat PRIVATE
SOFTFLOAT_ROUND_ODD SOFTFLOAT_ROUND_ODD
@ -347,7 +347,7 @@ set_target_properties(softfloat PROPERTIES
install(TARGETS softfloat install(TARGETS softfloat
EXPORT ${PROJECT_NAME}Targets # for downstream dependencies EXPORT ${PROJECT_NAME}Targets # for downstream dependencies
ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}/static COMPONENT libs # static lib ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libs # static lib
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libs # shared lib LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libs # shared lib
FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libs # for mac FRAMEWORK DESTINATION ${CMAKE_INSTALL_LIBDIR} COMPONENT libs # for mac
PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT devel # headers for mac (note the different component -> different package) PUBLIC_HEADER DESTINATION ${CMAKE_INSTALL_INCLUDEDIR} COMPONENT devel # headers for mac (note the different component -> different package)

View File

@ -1,37 +1,37 @@
License for Berkeley SoftFloat Release 3e License for Berkeley SoftFloat Release 3e
John R. Hauser John R. Hauser
2018 January 20 2018 January 20
The following applies to the whole of SoftFloat Release 3e as well as to The following applies to the whole of SoftFloat Release 3e as well as to
each source file individually. each source file individually.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright 2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions, and the following disclaimer in the notice, this list of conditions, and the following disclaimer in the
documentation and/or other materials provided with the distribution. documentation and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors 3. Neither the name of the University nor the names of its contributors
may be used to endorse or promote products derived from this software may be used to endorse or promote products derived from this software
without specific prior written permission. without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

View File

@ -1,49 +1,49 @@
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Berkeley SoftFloat Package Overview</TITLE> <TITLE>Berkeley SoftFloat Package Overview</TITLE>
</HEAD> </HEAD>
<BODY> <BODY>
<H1>Package Overview for Berkeley SoftFloat Release 3e</H1> <H1>Package Overview for Berkeley SoftFloat Release 3e</H1>
<P> <P>
John R. Hauser<BR> John R. Hauser<BR>
2018 January 20<BR> 2018 January 20<BR>
</P> </P>
<P> <P>
Berkeley SoftFloat is a software implementation of binary floating-point that Berkeley SoftFloat is a software implementation of binary floating-point that
conforms to the IEEE Standard for Floating-Point Arithmetic. conforms to the IEEE Standard for Floating-Point Arithmetic.
SoftFloat is distributed in the form of C source code. SoftFloat is distributed in the form of C source code.
Building the SoftFloat sources generates a library file (typically Building the SoftFloat sources generates a library file (typically
<CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) containing the <CODE>softfloat.a</CODE> or <CODE>libsoftfloat.a</CODE>) containing the
floating-point subroutines. floating-point subroutines.
</P> </P>
<P> <P>
The SoftFloat package is documented in the following files in the The SoftFloat package is documented in the following files in the
<CODE>doc</CODE> subdirectory: <CODE>doc</CODE> subdirectory:
<BLOCKQUOTE> <BLOCKQUOTE>
<TABLE> <TABLE>
<TR> <TR>
<TD><A HREF="doc/SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A></TD> <TD><A HREF="doc/SoftFloat.html"><NOBR><CODE>SoftFloat.html</CODE></NOBR></A></TD>
<TD>Documentation for using the SoftFloat functions.</TD> <TD>Documentation for using the SoftFloat functions.</TD>
</TR> </TR>
<TR> <TR>
<TD><A HREF="doc/SoftFloat-source.html"><NOBR><CODE>SoftFloat-source.html</CODE></NOBR></A></TD> <TD><A HREF="doc/SoftFloat-source.html"><NOBR><CODE>SoftFloat-source.html</CODE></NOBR></A></TD>
<TD>Documentation for building SoftFloat.</TD> <TD>Documentation for building SoftFloat.</TD>
</TR> </TR>
<TR> <TR>
<TD><A HREF="doc/SoftFloat-history.html"><NOBR><CODE>SoftFloat-history.html</CODE></A><CODE>&nbsp;&nbsp;&nbsp;</CODE></NOBR></TD> <TD><A HREF="doc/SoftFloat-history.html"><NOBR><CODE>SoftFloat-history.html</CODE></A><CODE>&nbsp;&nbsp;&nbsp;</CODE></NOBR></TD>
<TD>History of the major changes to SoftFloat.</TD> <TD>History of the major changes to SoftFloat.</TD>
</TR> </TR>
</TABLE> </TABLE>
</BLOCKQUOTE> </BLOCKQUOTE>
Other files in the package comprise the source code for SoftFloat. Other files in the package comprise the source code for SoftFloat.
</P> </P>
</BODY> </BODY>

View File

@ -1,24 +0,0 @@
Package Overview for Berkeley SoftFloat Release 3e
==================================================
John R. Hauser<br>
2018 January 20
Berkeley SoftFloat is a software implementation of binary floating-point
that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat
is distributed in the form of C source code. Building the SoftFloat sources
generates a library file (typically `softfloat.a` or `libsoftfloat.a`)
containing the floating-point subroutines.
The SoftFloat package is documented in the following files in the `doc`
subdirectory:
* [SoftFloat.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat.html) Documentation for using the SoftFloat functions.
* [SoftFloat-source.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat-source.html) Documentation for building SoftFloat.
* [SoftFloat-history.html](http://www.jhauser.us/arithmetic/SoftFloat-3/doc/SoftFloat-history.html) History of the major changes to SoftFloat.
Other files in the package comprise the source code for SoftFloat.

View File

@ -1,21 +1,21 @@
Package Overview for Berkeley SoftFloat Release 3e Package Overview for Berkeley SoftFloat Release 3e
John R. Hauser John R. Hauser
2018 January 20 2018 January 20
Berkeley SoftFloat is a software implementation of binary floating-point Berkeley SoftFloat is a software implementation of binary floating-point
that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat that conforms to the IEEE Standard for Floating-Point Arithmetic. SoftFloat
is distributed in the form of C source code. Building the SoftFloat sources is distributed in the form of C source code. Building the SoftFloat sources
generates a library file (typically "softfloat.a" or "libsoftfloat.a") generates a library file (typically "softfloat.a" or "libsoftfloat.a")
containing the floating-point subroutines. containing the floating-point subroutines.
The SoftFloat package is documented in the following files in the "doc" The SoftFloat package is documented in the following files in the "doc"
subdirectory: subdirectory:
SoftFloat.html Documentation for using the SoftFloat functions. SoftFloat.html Documentation for using the SoftFloat functions.
SoftFloat-source.html Documentation for building SoftFloat. SoftFloat-source.html Documentation for building SoftFloat.
SoftFloat-history.html History of the major changes to SoftFloat. SoftFloat-history.html History of the major changes to SoftFloat.
Other files in the package comprise the source code for SoftFloat. Other files in the package comprise the source code for SoftFloat.

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086 SPECIALIZE_TYPE ?= 8086
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,323 +1,323 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= ARM-VFPv2 SPECIALIZE_TYPE ?= ARM-VFPv2
SOFTFLOAT_OPTS ?= -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 SOFTFLOAT_OPTS ?= -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,399 +0,0 @@
#=============================================================================
#
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser.
#
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved.
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met:
#
# 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer.
#
# 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution.
#
# 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software
# without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
#
#=============================================================================
SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= RISCV
MARCH ?= rv64gcv_zfh_zfhmin
MABI ?= lp64d
SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \
riscv64-unknown-linux-gnu-gcc -c -march=$(MARCH) -mabi=$(MABI) -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \
$(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@
OBJ = .o
LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all
all: softfloat$(LIB)
OBJS_PRIMITIVES = \
s_eq128$(OBJ) \
s_le128$(OBJ) \
s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \
s_add256M$(OBJ) \
s_sub128$(OBJ) \
s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \
s_bf16UIToCommonNaN$(OBJ) \
s_commonNaNToBF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \
s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \
s_normSubnormalBF16Sig$(OBJ) \
s_roundPackToBF16$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \
s_roundPackToExtF80$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \
s_addMagsExtF80$(OBJ) \
s_subMagsExtF80$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \
s_roundPackToF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \
s_addMagsF128$(OBJ) \
s_subMagsF128$(OBJ) \
s_mulAddF128$(OBJ) \
softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \
ui32_to_extF80$(OBJ) \
ui32_to_extF80M$(OBJ) \
ui32_to_f128$(OBJ) \
ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \
ui64_to_extF80$(OBJ) \
ui64_to_extF80M$(OBJ) \
ui64_to_f128$(OBJ) \
ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \
i32_to_extF80$(OBJ) \
i32_to_extF80M$(OBJ) \
i32_to_f128$(OBJ) \
i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \
i64_to_extF80$(OBJ) \
i64_to_extF80M$(OBJ) \
i64_to_f128$(OBJ) \
i64_to_f128M$(OBJ) \
bf16_isSignalingNaN$(OBJ) \
bf16_to_f32$(OBJ) \
f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \
f16_to_extF80$(OBJ) \
f16_to_extF80M$(OBJ) \
f16_to_f128$(OBJ) \
f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \
f16_add$(OBJ) \
f16_sub$(OBJ) \
f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \
f16_div$(OBJ) \
f16_rem$(OBJ) \
f16_sqrt$(OBJ) \
f16_eq$(OBJ) \
f16_le$(OBJ) \
f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \
f32_to_bf16$(OBJ) \
f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \
f32_to_extF80$(OBJ) \
f32_to_extF80M$(OBJ) \
f32_to_f128$(OBJ) \
f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \
f32_add$(OBJ) \
f32_sub$(OBJ) \
f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \
f32_div$(OBJ) \
f32_rem$(OBJ) \
f32_sqrt$(OBJ) \
f32_eq$(OBJ) \
f32_le$(OBJ) \
f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \
f64_to_extF80$(OBJ) \
f64_to_extF80M$(OBJ) \
f64_to_f128$(OBJ) \
f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \
f64_add$(OBJ) \
f64_sub$(OBJ) \
f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \
f64_div$(OBJ) \
f64_rem$(OBJ) \
f64_sqrt$(OBJ) \
f64_eq$(OBJ) \
f64_le$(OBJ) \
f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \
extF80_to_ui32$(OBJ) \
extF80_to_ui64$(OBJ) \
extF80_to_i32$(OBJ) \
extF80_to_i64$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \
extF80_to_f16$(OBJ) \
extF80_to_f32$(OBJ) \
extF80_to_f64$(OBJ) \
extF80_to_f128$(OBJ) \
extF80_roundToInt$(OBJ) \
extF80_add$(OBJ) \
extF80_sub$(OBJ) \
extF80_mul$(OBJ) \
extF80_div$(OBJ) \
extF80_rem$(OBJ) \
extF80_sqrt$(OBJ) \
extF80_eq$(OBJ) \
extF80_le$(OBJ) \
extF80_lt$(OBJ) \
extF80_eq_signaling$(OBJ) \
extF80_le_quiet$(OBJ) \
extF80_lt_quiet$(OBJ) \
extF80_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \
f128_to_ui32$(OBJ) \
f128_to_ui64$(OBJ) \
f128_to_i32$(OBJ) \
f128_to_i64$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \
f128_to_f16$(OBJ) \
f128_to_f32$(OBJ) \
f128_to_extF80$(OBJ) \
f128_to_f64$(OBJ) \
f128_roundToInt$(OBJ) \
f128_add$(OBJ) \
f128_sub$(OBJ) \
f128_mul$(OBJ) \
f128_mulAdd$(OBJ) \
f128_div$(OBJ) \
f128_rem$(OBJ) \
f128_sqrt$(OBJ) \
f128_eq$(OBJ) \
f128_le$(OBJ) \
f128_lt$(OBJ) \
f128_eq_signaling$(OBJ) \
f128_le_quiet$(OBJ) \
f128_lt_quiet$(OBJ) \
f128_isSignalingNaN$(OBJ) \
f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \
f128M_to_extF80M$(OBJ) \
f128M_to_f64$(OBJ) \
f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \
f128M_sub$(OBJ) \
f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \
f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \
f128M_le$(OBJ) \
f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,54 +0,0 @@
/*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__
#define INLINE inline
#else
#define INLINE extern inline
#endif
/*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1
#include "opts-GCC.h"

View File

@ -1,397 +1,390 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \ gcc -c -Werror-implicit-function-declaration -DSOFTFLOAT_FAST_INT64 \
$(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_bf16UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToBF16UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ s_commonNaNToF128UI$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_propagateNaNF128UI$(OBJ) \
s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \
OBJS_OTHERS = \ s_roundToUI64$(OBJ) \
s_roundToUI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundToUI64$(OBJ) \ s_roundToI64$(OBJ) \
s_roundToI32$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundToI64$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normSubnormalBF16Sig$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_roundPackToBF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_subMagsF16$(OBJ) \
s_roundPackToF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_addMagsF16$(OBJ) \ s_roundPackToF32$(OBJ) \
s_subMagsF16$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_mulAddF16$(OBJ) \ s_addMagsF32$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_subMagsF32$(OBJ) \
s_roundPackToF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_addMagsF32$(OBJ) \ s_roundPackToF64$(OBJ) \
s_subMagsF32$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_mulAddF32$(OBJ) \ s_addMagsF64$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_subMagsF64$(OBJ) \
s_roundPackToF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_addMagsF64$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_subMagsF64$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_mulAddF64$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_roundPackToF128$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_normRoundPackToF128$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_addMagsF128$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_subMagsF128$(OBJ) \
s_roundPackToF128$(OBJ) \ s_mulAddF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \ softfloat_state$(OBJ) \
s_addMagsF128$(OBJ) \ ui32_to_f16$(OBJ) \
s_subMagsF128$(OBJ) \ ui32_to_f32$(OBJ) \
s_mulAddF128$(OBJ) \ ui32_to_f64$(OBJ) \
softfloat_state$(OBJ) \ ui32_to_extF80$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f128$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f128M$(OBJ) \
ui32_to_extF80$(OBJ) \ ui64_to_f16$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui64_to_f32$(OBJ) \
ui32_to_f128$(OBJ) \ ui64_to_f64$(OBJ) \
ui32_to_f128M$(OBJ) \ ui64_to_extF80$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f128$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f128M$(OBJ) \
ui64_to_extF80$(OBJ) \ i32_to_f16$(OBJ) \
ui64_to_extF80M$(OBJ) \ i32_to_f32$(OBJ) \
ui64_to_f128$(OBJ) \ i32_to_f64$(OBJ) \
ui64_to_f128M$(OBJ) \ i32_to_extF80$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f128$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f128M$(OBJ) \
i32_to_extF80$(OBJ) \ i64_to_f16$(OBJ) \
i32_to_extF80M$(OBJ) \ i64_to_f32$(OBJ) \
i32_to_f128$(OBJ) \ i64_to_f64$(OBJ) \
i32_to_f128M$(OBJ) \ i64_to_extF80$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f128$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f128M$(OBJ) \
i64_to_extF80$(OBJ) \ f16_to_ui32$(OBJ) \
i64_to_extF80M$(OBJ) \ f16_to_ui64$(OBJ) \
i64_to_f128$(OBJ) \ f16_to_i32$(OBJ) \
i64_to_f128M$(OBJ) \ f16_to_i64$(OBJ) \
bf16_isSignalingNaN$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
bf16_to_f32$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_extF80$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_f128$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_f128M$(OBJ) \
f16_to_f32$(OBJ) \ f16_roundToInt$(OBJ) \
f16_to_f64$(OBJ) \ f16_add$(OBJ) \
f16_to_extF80$(OBJ) \ f16_sub$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_mul$(OBJ) \
f16_to_f128$(OBJ) \ f16_mulAdd$(OBJ) \
f16_to_f128M$(OBJ) \ f16_div$(OBJ) \
f16_roundToInt$(OBJ) \ f16_rem$(OBJ) \
f16_add$(OBJ) \ f16_sqrt$(OBJ) \
f16_sub$(OBJ) \ f16_eq$(OBJ) \
f16_mul$(OBJ) \ f16_le$(OBJ) \
f16_mulAdd$(OBJ) \ f16_lt$(OBJ) \
f16_div$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_rem$(OBJ) \ f16_le_quiet$(OBJ) \
f16_sqrt$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_eq$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f16_le$(OBJ) \ f32_to_ui32$(OBJ) \
f16_lt$(OBJ) \ f32_to_ui64$(OBJ) \
f16_eq_signaling$(OBJ) \ f32_to_i32$(OBJ) \
f16_le_quiet$(OBJ) \ f32_to_i64$(OBJ) \
f16_lt_quiet$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_extF80$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_f128$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_f128M$(OBJ) \
f32_to_bf16$(OBJ) \ f32_roundToInt$(OBJ) \
f32_to_f16$(OBJ) \ f32_add$(OBJ) \
f32_to_f64$(OBJ) \ f32_sub$(OBJ) \
f32_to_extF80$(OBJ) \ f32_mul$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_mulAdd$(OBJ) \
f32_to_f128$(OBJ) \ f32_div$(OBJ) \
f32_to_f128M$(OBJ) \ f32_rem$(OBJ) \
f32_roundToInt$(OBJ) \ f32_sqrt$(OBJ) \
f32_add$(OBJ) \ f32_eq$(OBJ) \
f32_sub$(OBJ) \ f32_le$(OBJ) \
f32_mul$(OBJ) \ f32_lt$(OBJ) \
f32_mulAdd$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_div$(OBJ) \ f32_le_quiet$(OBJ) \
f32_rem$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_sqrt$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f32_eq$(OBJ) \ f64_to_ui32$(OBJ) \
f32_le$(OBJ) \ f64_to_ui64$(OBJ) \
f32_lt$(OBJ) \ f64_to_i32$(OBJ) \
f32_eq_signaling$(OBJ) \ f64_to_i64$(OBJ) \
f32_le_quiet$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f32_lt_quiet$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_extF80$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_f128$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_f128M$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_roundToInt$(OBJ) \
f64_to_f16$(OBJ) \ f64_add$(OBJ) \
f64_to_f32$(OBJ) \ f64_sub$(OBJ) \
f64_to_extF80$(OBJ) \ f64_mul$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_mulAdd$(OBJ) \
f64_to_f128$(OBJ) \ f64_div$(OBJ) \
f64_to_f128M$(OBJ) \ f64_rem$(OBJ) \
f64_roundToInt$(OBJ) \ f64_sqrt$(OBJ) \
f64_add$(OBJ) \ f64_eq$(OBJ) \
f64_sub$(OBJ) \ f64_le$(OBJ) \
f64_mul$(OBJ) \ f64_lt$(OBJ) \
f64_mulAdd$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_div$(OBJ) \ f64_le_quiet$(OBJ) \
f64_rem$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_sqrt$(OBJ) \ f64_isSignalingNaN$(OBJ) \
f64_eq$(OBJ) \ extF80_to_ui32$(OBJ) \
f64_le$(OBJ) \ extF80_to_ui64$(OBJ) \
f64_lt$(OBJ) \ extF80_to_i32$(OBJ) \
f64_eq_signaling$(OBJ) \ extF80_to_i64$(OBJ) \
f64_le_quiet$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
f64_lt_quiet$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
f64_isSignalingNaN$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_to_ui32$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_to_ui64$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_to_i32$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_to_i64$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ extF80_add$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_sub$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_mul$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_div$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_rem$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_sqrt$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_eq$(OBJ) \
extF80_add$(OBJ) \ extF80_le$(OBJ) \
extF80_sub$(OBJ) \ extF80_lt$(OBJ) \
extF80_mul$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80_div$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80_rem$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80_eq$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80_le$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80_lt$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_add$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_div$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_add$(OBJ) \ extF80M_le$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_div$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_lt_quiet$(OBJ) \
extF80M_sqrt$(OBJ) \ f128_to_ui32$(OBJ) \
extF80M_eq$(OBJ) \ f128_to_ui64$(OBJ) \
extF80M_le$(OBJ) \ f128_to_i32$(OBJ) \
extF80M_lt$(OBJ) \ f128_to_i64$(OBJ) \
extF80M_eq_signaling$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
extF80M_le_quiet$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
extF80M_lt_quiet$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_to_ui32$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_to_ui64$(OBJ) \ f128_to_f16$(OBJ) \
f128_to_i32$(OBJ) \ f128_to_f32$(OBJ) \
f128_to_i64$(OBJ) \ f128_to_extF80$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ f128_to_f64$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ f128_roundToInt$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ f128_add$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_sub$(OBJ) \
f128_to_f16$(OBJ) \ f128_mul$(OBJ) \
f128_to_f32$(OBJ) \ f128_mulAdd$(OBJ) \
f128_to_extF80$(OBJ) \ f128_div$(OBJ) \
f128_to_f64$(OBJ) \ f128_rem$(OBJ) \
f128_roundToInt$(OBJ) \ f128_sqrt$(OBJ) \
f128_add$(OBJ) \ f128_eq$(OBJ) \
f128_sub$(OBJ) \ f128_le$(OBJ) \
f128_mul$(OBJ) \ f128_lt$(OBJ) \
f128_mulAdd$(OBJ) \ f128_eq_signaling$(OBJ) \
f128_div$(OBJ) \ f128_le_quiet$(OBJ) \
f128_rem$(OBJ) \ f128_lt_quiet$(OBJ) \
f128_sqrt$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128_eq$(OBJ) \ f128M_to_ui32$(OBJ) \
f128_le$(OBJ) \ f128M_to_ui64$(OBJ) \
f128_lt$(OBJ) \ f128M_to_i32$(OBJ) \
f128_eq_signaling$(OBJ) \ f128M_to_i64$(OBJ) \
f128_le_quiet$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128_lt_quiet$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_add$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_sub$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_mul$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_div$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_rem$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_add$(OBJ) \ f128M_eq$(OBJ) \
f128M_sub$(OBJ) \ f128M_le$(OBJ) \
f128M_mul$(OBJ) \ f128M_lt$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_div$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_rem$(OBJ) \ f128M_lt_quiet$(OBJ) \
f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
f128M_le$(OBJ) \
f128M_lt$(OBJ) \ $(OBJS_ALL): \
f128M_eq_signaling$(OBJ) \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
f128M_le_quiet$(OBJ) \ $(SOURCE_DIR)/include/primitives.h
f128M_lt_quiet$(OBJ) \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h
$(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(SOURCE_DIR)/include/primitives.h $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
$(SOURCE_DIR)/include/softfloat.h
softfloat$(LIB): $(OBJS_ALL)
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(DELETE) $@
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(MAKELIB) $^
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c .PHONY: clean
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)
softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,56 +1,57 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
//#define INLINE inline //#define INLINE inline
#define INLINE static #define INLINE static
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC__ #ifdef __GNUC__
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1 #define SOFTFLOAT_INTRINSIC_INT128 1
#endif #endif
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086 SPECIALIZE_TYPE ?= 8086
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \ gcc -c -Werror-implicit-function-declaration $(SOFTFLOAT_OPTS) \
$(C_INCLUDES) -O2 -o $@ $(C_INCLUDES) -O2 -o $@
MAKELIB = ar crs $@ MAKELIB = ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,390 +1,390 @@
#============================================================================= #=============================================================================
# #
# This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic # This Makefile is part of the SoftFloat IEEE Floating-Point Arithmetic
# Package, Release 3e, by John R. Hauser. # Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
SOURCE_DIR ?= ../../source SOURCE_DIR ?= ../../source
SPECIALIZE_TYPE ?= 8086-SSE SPECIALIZE_TYPE ?= 8086-SSE
SOFTFLOAT_OPTS ?= \ SOFTFLOAT_OPTS ?= \
-DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
-DSOFTFLOAT_FAST_DIV64TO32 -DSOFTFLOAT_FAST_DIV64TO32
DELETE = rm -f DELETE = rm -f
C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
COMPILE_C = \ COMPILE_C = \
x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \ x86_64-w64-mingw32-gcc -c -Werror-implicit-function-declaration \
-DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
MAKELIB = x86_64-w64-mingw32-ar crs $@ MAKELIB = x86_64-w64-mingw32-ar crs $@
OBJ = .o OBJ = .o
LIB = .a LIB = .a
OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h OTHER_HEADERS = $(SOURCE_DIR)/include/opts-GCC.h
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \ s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \ s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \ s_roundToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_roundPackToF128$(OBJ) \ s_roundPackToF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \ s_normRoundPackToF128$(OBJ) \
s_addMagsF128$(OBJ) \ s_addMagsF128$(OBJ) \
s_subMagsF128$(OBJ) \ s_subMagsF128$(OBJ) \
s_mulAddF128$(OBJ) \ s_mulAddF128$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80$(OBJ) \ ui32_to_extF80$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128$(OBJ) \ ui32_to_f128$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80$(OBJ) \ ui64_to_extF80$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128$(OBJ) \ ui64_to_f128$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80$(OBJ) \ i32_to_extF80$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128$(OBJ) \ i32_to_f128$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80$(OBJ) \ i64_to_extF80$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128$(OBJ) \ i64_to_f128$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80$(OBJ) \ f16_to_extF80$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128$(OBJ) \ f16_to_f128$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80$(OBJ) \ f32_to_extF80$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128$(OBJ) \ f32_to_f128$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80$(OBJ) \ f64_to_extF80$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128$(OBJ) \ f64_to_f128$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80_to_ui32$(OBJ) \ extF80_to_ui32$(OBJ) \
extF80_to_ui64$(OBJ) \ extF80_to_ui64$(OBJ) \
extF80_to_i32$(OBJ) \ extF80_to_i32$(OBJ) \
extF80_to_i64$(OBJ) \ extF80_to_i64$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_add$(OBJ) \ extF80_add$(OBJ) \
extF80_sub$(OBJ) \ extF80_sub$(OBJ) \
extF80_mul$(OBJ) \ extF80_mul$(OBJ) \
extF80_div$(OBJ) \ extF80_div$(OBJ) \
extF80_rem$(OBJ) \ extF80_rem$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_sqrt$(OBJ) \
extF80_eq$(OBJ) \ extF80_eq$(OBJ) \
extF80_le$(OBJ) \ extF80_le$(OBJ) \
extF80_lt$(OBJ) \ extF80_lt$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128_to_ui32$(OBJ) \ f128_to_ui32$(OBJ) \
f128_to_ui64$(OBJ) \ f128_to_ui64$(OBJ) \
f128_to_i32$(OBJ) \ f128_to_i32$(OBJ) \
f128_to_i64$(OBJ) \ f128_to_i64$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_to_f16$(OBJ) \ f128_to_f16$(OBJ) \
f128_to_f32$(OBJ) \ f128_to_f32$(OBJ) \
f128_to_extF80$(OBJ) \ f128_to_extF80$(OBJ) \
f128_to_f64$(OBJ) \ f128_to_f64$(OBJ) \
f128_roundToInt$(OBJ) \ f128_roundToInt$(OBJ) \
f128_add$(OBJ) \ f128_add$(OBJ) \
f128_sub$(OBJ) \ f128_sub$(OBJ) \
f128_mul$(OBJ) \ f128_mul$(OBJ) \
f128_mulAdd$(OBJ) \ f128_mulAdd$(OBJ) \
f128_div$(OBJ) \ f128_div$(OBJ) \
f128_rem$(OBJ) \ f128_rem$(OBJ) \
f128_sqrt$(OBJ) \ f128_sqrt$(OBJ) \
f128_eq$(OBJ) \ f128_eq$(OBJ) \
f128_le$(OBJ) \ f128_le$(OBJ) \
f128_lt$(OBJ) \ f128_lt$(OBJ) \
f128_eq_signaling$(OBJ) \ f128_eq_signaling$(OBJ) \
f128_le_quiet$(OBJ) \ f128_le_quiet$(OBJ) \
f128_lt_quiet$(OBJ) \ f128_lt_quiet$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,54 +1,54 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define LITTLEENDIAN 1 #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#ifdef __GNUC_STDC_INLINE__ #ifdef __GNUC_STDC_INLINE__
#define INLINE inline #define INLINE inline
#else #else
#define INLINE extern inline #define INLINE extern inline
#endif #endif
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define SOFTFLOAT_BUILTIN_CLZ 1 #define SOFTFLOAT_BUILTIN_CLZ 1
#define SOFTFLOAT_INTRINSIC_INT128 1 #define SOFTFLOAT_INTRINSIC_INT128 1
#include "opts-GCC.h" #include "opts-GCC.h"

View File

@ -1,396 +1,391 @@
#============================================================================= #=============================================================================
# #
# This Makefile template is part of the SoftFloat IEEE Floating-Point # This Makefile template is part of the SoftFloat IEEE Floating-Point
# Arithmetic Package, Release 3e, by John R. Hauser. # Arithmetic Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
# Edit lines marked with `==>'. See "SoftFloat-source.html". # Edit lines marked with `==>'. See "SoftFloat-source.html".
==> SOURCE_DIR ?= ../../source ==> SOURCE_DIR ?= ../../source
==> SPECIALIZE_TYPE ?= 8086 ==> SPECIALIZE_TYPE ?= 8086
==> SOFTFLOAT_OPTS ?= \ ==> SOFTFLOAT_OPTS ?= \
==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ ==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
==> -DSOFTFLOAT_FAST_DIV64TO32 ==> -DSOFTFLOAT_FAST_DIV64TO32
==> DELETE = rm -f ==> DELETE = rm -f
==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include ==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
==> COMPILE_C = \ ==> COMPILE_C = \
==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ ==> cc -c -DSOFTFLOAT_FAST_INT64 $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
==> MAKELIB = ar crs $@ ==> MAKELIB = ar crs $@
==> OBJ = .o ==> OBJ = .o
==> LIB = .a ==> LIB = .a
==> OTHER_HEADERS = ==> OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_eq128$(OBJ) \ s_eq128$(OBJ) \
s_le128$(OBJ) \ s_le128$(OBJ) \
s_lt128$(OBJ) \ s_lt128$(OBJ) \
s_shortShiftLeft128$(OBJ) \ s_shortShiftLeft128$(OBJ) \
s_shortShiftRight128$(OBJ) \ s_shortShiftRight128$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJam64Extra$(OBJ) \ s_shortShiftRightJam64Extra$(OBJ) \
s_shortShiftRightJam128$(OBJ) \ s_shortShiftRightJam128$(OBJ) \
s_shortShiftRightJam128Extra$(OBJ) \ s_shortShiftRightJam128Extra$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJam64Extra$(OBJ) \ s_shiftRightJam64Extra$(OBJ) \
s_shiftRightJam128$(OBJ) \ s_shiftRightJam128$(OBJ) \
s_shiftRightJam128Extra$(OBJ) \ s_shiftRightJam128Extra$(OBJ) \
s_shiftRightJam256M$(OBJ) \ s_shiftRightJam256M$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_add128$(OBJ) \ s_add128$(OBJ) \
s_add256M$(OBJ) \ s_add256M$(OBJ) \
s_sub128$(OBJ) \ s_sub128$(OBJ) \
s_sub256M$(OBJ) \ s_sub256M$(OBJ) \
s_mul64ByShifted32To128$(OBJ) \ s_mul64ByShifted32To128$(OBJ) \
s_mul64To128$(OBJ) \ s_mul64To128$(OBJ) \
s_mul128By32$(OBJ) \ s_mul128By32$(OBJ) \
s_mul128To256M$(OBJ) \ s_mul128To256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80UIToCommonNaN$(OBJ) \ s_extF80UIToCommonNaN$(OBJ) \
s_commonNaNToExtF80UI$(OBJ) \ s_commonNaNToExtF80UI$(OBJ) \
s_propagateNaNExtF80UI$(OBJ) \ s_propagateNaNExtF80UI$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128UIToCommonNaN$(OBJ) \ s_f128UIToCommonNaN$(OBJ) \
s_commonNaNToF128UI$(OBJ) \ s_commonNaNToF128UI$(OBJ) \
s_propagateNaNF128UI$(OBJ) \ s_propagateNaNF128UI$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundToUI64$(OBJ) \ s_roundToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundToI64$(OBJ) \ s_roundToI64$(OBJ) \
s_normSubnormalBF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToBF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_roundPackToF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_mulAddF16$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_roundPackToF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_mulAddF32$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_roundPackToF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_normSubnormalExtF80Sig$(OBJ) \
s_mulAddF64$(OBJ) \ s_roundPackToExtF80$(OBJ) \
s_normSubnormalExtF80Sig$(OBJ) \ s_normRoundPackToExtF80$(OBJ) \
s_roundPackToExtF80$(OBJ) \ s_addMagsExtF80$(OBJ) \
s_normRoundPackToExtF80$(OBJ) \ s_subMagsExtF80$(OBJ) \
s_addMagsExtF80$(OBJ) \ s_normSubnormalF128Sig$(OBJ) \
s_subMagsExtF80$(OBJ) \ s_roundPackToF128$(OBJ) \
s_normSubnormalF128Sig$(OBJ) \ s_normRoundPackToF128$(OBJ) \
s_roundPackToF128$(OBJ) \ s_addMagsF128$(OBJ) \
s_normRoundPackToF128$(OBJ) \ s_subMagsF128$(OBJ) \
s_addMagsF128$(OBJ) \ s_mulAddF128$(OBJ) \
s_subMagsF128$(OBJ) \ softfloat_state$(OBJ) \
s_mulAddF128$(OBJ) \ ui32_to_f16$(OBJ) \
softfloat_state$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_extF80$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_extF80$(OBJ) \ ui32_to_f128$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui32_to_f128$(OBJ) \ ui64_to_f16$(OBJ) \
ui32_to_f128M$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_extF80$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_extF80$(OBJ) \ ui64_to_f128$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_f128M$(OBJ) \
ui64_to_f128$(OBJ) \ i32_to_f16$(OBJ) \
ui64_to_f128M$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_extF80$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_extF80$(OBJ) \ i32_to_f128$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_f128M$(OBJ) \
i32_to_f128$(OBJ) \ i64_to_f16$(OBJ) \
i32_to_f128M$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_extF80$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_extF80$(OBJ) \ i64_to_f128$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_f128M$(OBJ) \
i64_to_f128$(OBJ) \ f16_to_ui32$(OBJ) \
i64_to_f128M$(OBJ) \ f16_to_ui64$(OBJ) \
bf16_isSignalingNaN$(OBJ) \ f16_to_i32$(OBJ) \
bf16_to_f32$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_extF80$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f128$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f128M$(OBJ) \
f16_to_extF80$(OBJ) \ f16_roundToInt$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_add$(OBJ) \
f16_to_f128$(OBJ) \ f16_sub$(OBJ) \
f16_to_f128M$(OBJ) \ f16_mul$(OBJ) \
f16_roundToInt$(OBJ) \ f16_mulAdd$(OBJ) \
f16_add$(OBJ) \ f16_div$(OBJ) \
f16_sub$(OBJ) \ f16_rem$(OBJ) \
f16_mul$(OBJ) \ f16_sqrt$(OBJ) \
f16_mulAdd$(OBJ) \ f16_eq$(OBJ) \
f16_div$(OBJ) \ f16_le$(OBJ) \
f16_rem$(OBJ) \ f16_lt$(OBJ) \
f16_sqrt$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_eq$(OBJ) \ f16_le_quiet$(OBJ) \
f16_le$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_lt$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f16_eq_signaling$(OBJ) \ f32_to_ui32$(OBJ) \
f16_le_quiet$(OBJ) \ f32_to_ui64$(OBJ) \
f16_lt_quiet$(OBJ) \ f32_to_i32$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_extF80$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_bf16$(OBJ) \ f32_to_f128$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f128M$(OBJ) \
f32_to_f64$(OBJ) \ f32_roundToInt$(OBJ) \
f32_to_extF80$(OBJ) \ f32_add$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_sub$(OBJ) \
f32_to_f128$(OBJ) \ f32_mul$(OBJ) \
f32_to_f128M$(OBJ) \ f32_mulAdd$(OBJ) \
f32_roundToInt$(OBJ) \ f32_div$(OBJ) \
f32_add$(OBJ) \ f32_rem$(OBJ) \
f32_sub$(OBJ) \ f32_sqrt$(OBJ) \
f32_mul$(OBJ) \ f32_eq$(OBJ) \
f32_mulAdd$(OBJ) \ f32_le$(OBJ) \
f32_div$(OBJ) \ f32_lt$(OBJ) \
f32_rem$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_sqrt$(OBJ) \ f32_le_quiet$(OBJ) \
f32_eq$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_le$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f32_lt$(OBJ) \ f64_to_ui32$(OBJ) \
f32_eq_signaling$(OBJ) \ f64_to_ui64$(OBJ) \
f32_le_quiet$(OBJ) \ f64_to_i32$(OBJ) \
f32_lt_quiet$(OBJ) \ f64_to_i64$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_extF80$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_f128$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f128M$(OBJ) \
f64_to_f32$(OBJ) \ f64_roundToInt$(OBJ) \
f64_to_extF80$(OBJ) \ f64_add$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_sub$(OBJ) \
f64_to_f128$(OBJ) \ f64_mul$(OBJ) \
f64_to_f128M$(OBJ) \ f64_mulAdd$(OBJ) \
f64_roundToInt$(OBJ) \ f64_div$(OBJ) \
f64_add$(OBJ) \ f64_rem$(OBJ) \
f64_sub$(OBJ) \ f64_sqrt$(OBJ) \
f64_mul$(OBJ) \ f64_eq$(OBJ) \
f64_mulAdd$(OBJ) \ f64_le$(OBJ) \
f64_div$(OBJ) \ f64_lt$(OBJ) \
f64_rem$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_sqrt$(OBJ) \ f64_le_quiet$(OBJ) \
f64_eq$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_le$(OBJ) \ f64_isSignalingNaN$(OBJ) \
f64_lt$(OBJ) \ extF80_to_ui32$(OBJ) \
f64_eq_signaling$(OBJ) \ extF80_to_ui64$(OBJ) \
f64_le_quiet$(OBJ) \ extF80_to_i32$(OBJ) \
f64_lt_quiet$(OBJ) \ extF80_to_i64$(OBJ) \
f64_isSignalingNaN$(OBJ) \ extF80_to_ui32_r_minMag$(OBJ) \
extF80_to_ui32$(OBJ) \ extF80_to_ui64_r_minMag$(OBJ) \
extF80_to_ui64$(OBJ) \ extF80_to_i32_r_minMag$(OBJ) \
extF80_to_i32$(OBJ) \ extF80_to_i64_r_minMag$(OBJ) \
extF80_to_i64$(OBJ) \ extF80_to_f16$(OBJ) \
extF80_to_ui32_r_minMag$(OBJ) \ extF80_to_f32$(OBJ) \
extF80_to_ui64_r_minMag$(OBJ) \ extF80_to_f64$(OBJ) \
extF80_to_i32_r_minMag$(OBJ) \ extF80_to_f128$(OBJ) \
extF80_to_i64_r_minMag$(OBJ) \ extF80_roundToInt$(OBJ) \
extF80_to_f16$(OBJ) \ extF80_add$(OBJ) \
extF80_to_f32$(OBJ) \ extF80_sub$(OBJ) \
extF80_to_f64$(OBJ) \ extF80_mul$(OBJ) \
extF80_to_f128$(OBJ) \ extF80_div$(OBJ) \
extF80_roundToInt$(OBJ) \ extF80_rem$(OBJ) \
extF80_add$(OBJ) \ extF80_sqrt$(OBJ) \
extF80_sub$(OBJ) \ extF80_eq$(OBJ) \
extF80_mul$(OBJ) \ extF80_le$(OBJ) \
extF80_div$(OBJ) \ extF80_lt$(OBJ) \
extF80_rem$(OBJ) \ extF80_eq_signaling$(OBJ) \
extF80_sqrt$(OBJ) \ extF80_le_quiet$(OBJ) \
extF80_eq$(OBJ) \ extF80_lt_quiet$(OBJ) \
extF80_le$(OBJ) \ extF80_isSignalingNaN$(OBJ) \
extF80_lt$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80_eq_signaling$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80_le_quiet$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80_lt_quiet$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80_isSignalingNaN$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_add$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_div$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_add$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_le$(OBJ) \
extF80M_div$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_lt_quiet$(OBJ) \
extF80M_le$(OBJ) \ f128_to_ui32$(OBJ) \
extF80M_lt$(OBJ) \ f128_to_ui64$(OBJ) \
extF80M_eq_signaling$(OBJ) \ f128_to_i32$(OBJ) \
extF80M_le_quiet$(OBJ) \ f128_to_i64$(OBJ) \
extF80M_lt_quiet$(OBJ) \ f128_to_ui32_r_minMag$(OBJ) \
f128_to_ui32$(OBJ) \ f128_to_ui64_r_minMag$(OBJ) \
f128_to_ui64$(OBJ) \ f128_to_i32_r_minMag$(OBJ) \
f128_to_i32$(OBJ) \ f128_to_i64_r_minMag$(OBJ) \
f128_to_i64$(OBJ) \ f128_to_f16$(OBJ) \
f128_to_ui32_r_minMag$(OBJ) \ f128_to_f32$(OBJ) \
f128_to_ui64_r_minMag$(OBJ) \ f128_to_extF80$(OBJ) \
f128_to_i32_r_minMag$(OBJ) \ f128_to_f64$(OBJ) \
f128_to_i64_r_minMag$(OBJ) \ f128_roundToInt$(OBJ) \
f128_to_f16$(OBJ) \ f128_add$(OBJ) \
f128_to_f32$(OBJ) \ f128_sub$(OBJ) \
f128_to_extF80$(OBJ) \ f128_mul$(OBJ) \
f128_to_f64$(OBJ) \ f128_mulAdd$(OBJ) \
f128_roundToInt$(OBJ) \ f128_div$(OBJ) \
f128_add$(OBJ) \ f128_rem$(OBJ) \
f128_sub$(OBJ) \ f128_sqrt$(OBJ) \
f128_mul$(OBJ) \ f128_eq$(OBJ) \
f128_mulAdd$(OBJ) \ f128_le$(OBJ) \
f128_div$(OBJ) \ f128_lt$(OBJ) \
f128_rem$(OBJ) \ f128_eq_signaling$(OBJ) \
f128_sqrt$(OBJ) \ f128_le_quiet$(OBJ) \
f128_eq$(OBJ) \ f128_lt_quiet$(OBJ) \
f128_le$(OBJ) \ f128_isSignalingNaN$(OBJ) \
f128_lt$(OBJ) \ f128M_to_ui32$(OBJ) \
f128_eq_signaling$(OBJ) \ f128M_to_ui64$(OBJ) \
f128_le_quiet$(OBJ) \ f128M_to_i32$(OBJ) \
f128_lt_quiet$(OBJ) \ f128M_to_i64$(OBJ) \
f128_isSignalingNaN$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_add$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_sub$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_mul$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_div$(OBJ) \
f128M_add$(OBJ) \ f128M_rem$(OBJ) \
f128M_sub$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_mul$(OBJ) \ f128M_eq$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_le$(OBJ) \
f128M_div$(OBJ) \ f128M_lt$(OBJ) \
f128M_rem$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_eq$(OBJ) \ f128M_lt_quiet$(OBJ) \
f128M_le$(OBJ) \
f128M_lt$(OBJ) \ OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ $(OBJS_ALL): \
f128M_lt_quiet$(OBJ) \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(OBJS_ALL): \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(SOURCE_DIR)/include/softfloat.h
$(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(MAKELIB) $^
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
.PHONY: clean
softfloat$(LIB): $(OBJS_ALL) clean:
$(DELETE) $@ $(DELETE) $(OBJS_ALL) softfloat$(LIB)
$(MAKELIB) $^
.PHONY: clean
clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,50 +1,50 @@
/*============================================================================ /*============================================================================
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
// Edit lines marked with `==>'. See "SoftFloat-source.html". // Edit lines marked with `==>'. See "SoftFloat-source.html".
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define LITTLEENDIAN 1 ==> #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define INLINE inline ==> #define INLINE inline
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define THREAD_LOCAL _Thread_local ==> #define THREAD_LOCAL _Thread_local

View File

@ -1,325 +1,325 @@
#============================================================================= #=============================================================================
# #
# This Makefile template is part of the SoftFloat IEEE Floating-Point # This Makefile template is part of the SoftFloat IEEE Floating-Point
# Arithmetic Package, Release 3e, by John R. Hauser. # Arithmetic Package, Release 3e, by John R. Hauser.
# #
# Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the # Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2017 The Regents of the
# University of California. All rights reserved. # University of California. All rights reserved.
# #
# Redistribution and use in source and binary forms, with or without # Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are met: # modification, are permitted provided that the following conditions are met:
# #
# 1. Redistributions of source code must retain the above copyright notice, # 1. Redistributions of source code must retain the above copyright notice,
# this list of conditions, and the following disclaimer. # this list of conditions, and the following disclaimer.
# #
# 2. Redistributions in binary form must reproduce the above copyright # 2. Redistributions in binary form must reproduce the above copyright
# notice, this list of conditions, and the following disclaimer in the # notice, this list of conditions, and the following disclaimer in the
# documentation and/or other materials provided with the distribution. # documentation and/or other materials provided with the distribution.
# #
# 3. Neither the name of the University nor the names of its contributors # 3. Neither the name of the University nor the names of its contributors
# may be used to endorse or promote products derived from this software # may be used to endorse or promote products derived from this software
# without specific prior written permission. # without specific prior written permission.
# #
# THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY # THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
# EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED # EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
# WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE # WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
# DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY # DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
# DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES # DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
# (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
# LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND # LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
# ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT # ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF # (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. # THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
# #
#============================================================================= #=============================================================================
# Edit lines marked with `==>'. See "SoftFloat-source.html". # Edit lines marked with `==>'. See "SoftFloat-source.html".
==> SOURCE_DIR ?= ../../source ==> SOURCE_DIR ?= ../../source
==> SPECIALIZE_TYPE ?= 8086 ==> SPECIALIZE_TYPE ?= 8086
==> SOFTFLOAT_OPTS ?= \ ==> SOFTFLOAT_OPTS ?= \
==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \ ==> -DSOFTFLOAT_ROUND_ODD -DINLINE_LEVEL=5 -DSOFTFLOAT_FAST_DIV32TO16 \
==> -DSOFTFLOAT_FAST_DIV64TO32 ==> -DSOFTFLOAT_FAST_DIV64TO32
==> DELETE = rm -f ==> DELETE = rm -f
==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include ==> C_INCLUDES = -I. -I$(SOURCE_DIR)/$(SPECIALIZE_TYPE) -I$(SOURCE_DIR)/include
==> COMPILE_C = cc -c $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@ ==> COMPILE_C = cc -c $(SOFTFLOAT_OPTS) $(C_INCLUDES) -O2 -o $@
==> MAKELIB = ar crs $@ ==> MAKELIB = ar crs $@
==> OBJ = .o ==> OBJ = .o
==> LIB = .a ==> LIB = .a
==> OTHER_HEADERS = ==> OTHER_HEADERS =
.PHONY: all .PHONY: all
all: softfloat$(LIB) all: softfloat$(LIB)
OBJS_PRIMITIVES = \ OBJS_PRIMITIVES = \
s_compare96M$(OBJ) \ s_compare96M$(OBJ) \
s_compare128M$(OBJ) \ s_compare128M$(OBJ) \
s_shortShiftLeft64To96M$(OBJ) \ s_shortShiftLeft64To96M$(OBJ) \
s_shortShiftLeftM$(OBJ) \ s_shortShiftLeftM$(OBJ) \
s_shiftLeftM$(OBJ) \ s_shiftLeftM$(OBJ) \
s_shortShiftRightM$(OBJ) \ s_shortShiftRightM$(OBJ) \
s_shortShiftRightJam64$(OBJ) \ s_shortShiftRightJam64$(OBJ) \
s_shortShiftRightJamM$(OBJ) \ s_shortShiftRightJamM$(OBJ) \
s_shiftRightJam32$(OBJ) \ s_shiftRightJam32$(OBJ) \
s_shiftRightJam64$(OBJ) \ s_shiftRightJam64$(OBJ) \
s_shiftRightJamM$(OBJ) \ s_shiftRightJamM$(OBJ) \
s_shiftRightM$(OBJ) \ s_shiftRightM$(OBJ) \
s_countLeadingZeros8$(OBJ) \ s_countLeadingZeros8$(OBJ) \
s_countLeadingZeros16$(OBJ) \ s_countLeadingZeros16$(OBJ) \
s_countLeadingZeros32$(OBJ) \ s_countLeadingZeros32$(OBJ) \
s_countLeadingZeros64$(OBJ) \ s_countLeadingZeros64$(OBJ) \
s_addM$(OBJ) \ s_addM$(OBJ) \
s_addCarryM$(OBJ) \ s_addCarryM$(OBJ) \
s_addComplCarryM$(OBJ) \ s_addComplCarryM$(OBJ) \
s_negXM$(OBJ) \ s_negXM$(OBJ) \
s_sub1XM$(OBJ) \ s_sub1XM$(OBJ) \
s_subM$(OBJ) \ s_subM$(OBJ) \
s_mul64To128M$(OBJ) \ s_mul64To128M$(OBJ) \
s_mul128MTo256M$(OBJ) \ s_mul128MTo256M$(OBJ) \
s_approxRecip_1Ks$(OBJ) \ s_approxRecip_1Ks$(OBJ) \
s_approxRecip32_1$(OBJ) \ s_approxRecip32_1$(OBJ) \
s_approxRecipSqrt_1Ks$(OBJ) \ s_approxRecipSqrt_1Ks$(OBJ) \
s_approxRecipSqrt32_1$(OBJ) \ s_approxRecipSqrt32_1$(OBJ) \
s_remStepMBy32$(OBJ) \ s_remStepMBy32$(OBJ) \
OBJS_SPECIALIZE = \ OBJS_SPECIALIZE = \
softfloat_raiseFlags$(OBJ) \ softfloat_raiseFlags$(OBJ) \
s_f16UIToCommonNaN$(OBJ) \ s_f16UIToCommonNaN$(OBJ) \
s_commonNaNToF16UI$(OBJ) \ s_commonNaNToF16UI$(OBJ) \
s_propagateNaNF16UI$(OBJ) \ s_propagateNaNF16UI$(OBJ) \
s_f32UIToCommonNaN$(OBJ) \ s_f32UIToCommonNaN$(OBJ) \
s_commonNaNToF32UI$(OBJ) \ s_commonNaNToF32UI$(OBJ) \
s_propagateNaNF32UI$(OBJ) \ s_propagateNaNF32UI$(OBJ) \
s_f64UIToCommonNaN$(OBJ) \ s_f64UIToCommonNaN$(OBJ) \
s_commonNaNToF64UI$(OBJ) \ s_commonNaNToF64UI$(OBJ) \
s_propagateNaNF64UI$(OBJ) \ s_propagateNaNF64UI$(OBJ) \
extF80M_isSignalingNaN$(OBJ) \ extF80M_isSignalingNaN$(OBJ) \
s_extF80MToCommonNaN$(OBJ) \ s_extF80MToCommonNaN$(OBJ) \
s_commonNaNToExtF80M$(OBJ) \ s_commonNaNToExtF80M$(OBJ) \
s_propagateNaNExtF80M$(OBJ) \ s_propagateNaNExtF80M$(OBJ) \
f128M_isSignalingNaN$(OBJ) \ f128M_isSignalingNaN$(OBJ) \
s_f128MToCommonNaN$(OBJ) \ s_f128MToCommonNaN$(OBJ) \
s_commonNaNToF128M$(OBJ) \ s_commonNaNToF128M$(OBJ) \
s_propagateNaNF128M$(OBJ) \ s_propagateNaNF128M$(OBJ) \
OBJS_OTHERS = \ OBJS_OTHERS = \
s_roundToUI32$(OBJ) \ s_roundToUI32$(OBJ) \
s_roundMToUI64$(OBJ) \ s_roundMToUI64$(OBJ) \
s_roundToI32$(OBJ) \ s_roundToI32$(OBJ) \
s_roundMToI64$(OBJ) \ s_roundMToI64$(OBJ) \
s_normSubnormalF16Sig$(OBJ) \ s_normSubnormalF16Sig$(OBJ) \
s_roundPackToF16$(OBJ) \ s_roundPackToF16$(OBJ) \
s_normRoundPackToF16$(OBJ) \ s_normRoundPackToF16$(OBJ) \
s_addMagsF16$(OBJ) \ s_addMagsF16$(OBJ) \
s_subMagsF16$(OBJ) \ s_subMagsF16$(OBJ) \
s_mulAddF16$(OBJ) \ s_mulAddF16$(OBJ) \
s_normSubnormalF32Sig$(OBJ) \ s_normSubnormalF32Sig$(OBJ) \
s_roundPackToF32$(OBJ) \ s_roundPackToF32$(OBJ) \
s_normRoundPackToF32$(OBJ) \ s_normRoundPackToF32$(OBJ) \
s_addMagsF32$(OBJ) \ s_addMagsF32$(OBJ) \
s_subMagsF32$(OBJ) \ s_subMagsF32$(OBJ) \
s_mulAddF32$(OBJ) \ s_mulAddF32$(OBJ) \
s_normSubnormalF64Sig$(OBJ) \ s_normSubnormalF64Sig$(OBJ) \
s_roundPackToF64$(OBJ) \ s_roundPackToF64$(OBJ) \
s_normRoundPackToF64$(OBJ) \ s_normRoundPackToF64$(OBJ) \
s_addMagsF64$(OBJ) \ s_addMagsF64$(OBJ) \
s_subMagsF64$(OBJ) \ s_subMagsF64$(OBJ) \
s_mulAddF64$(OBJ) \ s_mulAddF64$(OBJ) \
s_tryPropagateNaNExtF80M$(OBJ) \ s_tryPropagateNaNExtF80M$(OBJ) \
s_invalidExtF80M$(OBJ) \ s_invalidExtF80M$(OBJ) \
s_normExtF80SigM$(OBJ) \ s_normExtF80SigM$(OBJ) \
s_roundPackMToExtF80M$(OBJ) \ s_roundPackMToExtF80M$(OBJ) \
s_normRoundPackMToExtF80M$(OBJ) \ s_normRoundPackMToExtF80M$(OBJ) \
s_addExtF80M$(OBJ) \ s_addExtF80M$(OBJ) \
s_compareNonnormExtF80M$(OBJ) \ s_compareNonnormExtF80M$(OBJ) \
s_isNaNF128M$(OBJ) \ s_isNaNF128M$(OBJ) \
s_tryPropagateNaNF128M$(OBJ) \ s_tryPropagateNaNF128M$(OBJ) \
s_invalidF128M$(OBJ) \ s_invalidF128M$(OBJ) \
s_shiftNormSigF128M$(OBJ) \ s_shiftNormSigF128M$(OBJ) \
s_roundPackMToF128M$(OBJ) \ s_roundPackMToF128M$(OBJ) \
s_normRoundPackMToF128M$(OBJ) \ s_normRoundPackMToF128M$(OBJ) \
s_addF128M$(OBJ) \ s_addF128M$(OBJ) \
s_mulAddF128M$(OBJ) \ s_mulAddF128M$(OBJ) \
softfloat_state$(OBJ) \ softfloat_state$(OBJ) \
ui32_to_f16$(OBJ) \ ui32_to_f16$(OBJ) \
ui32_to_f32$(OBJ) \ ui32_to_f32$(OBJ) \
ui32_to_f64$(OBJ) \ ui32_to_f64$(OBJ) \
ui32_to_extF80M$(OBJ) \ ui32_to_extF80M$(OBJ) \
ui32_to_f128M$(OBJ) \ ui32_to_f128M$(OBJ) \
ui64_to_f16$(OBJ) \ ui64_to_f16$(OBJ) \
ui64_to_f32$(OBJ) \ ui64_to_f32$(OBJ) \
ui64_to_f64$(OBJ) \ ui64_to_f64$(OBJ) \
ui64_to_extF80M$(OBJ) \ ui64_to_extF80M$(OBJ) \
ui64_to_f128M$(OBJ) \ ui64_to_f128M$(OBJ) \
i32_to_f16$(OBJ) \ i32_to_f16$(OBJ) \
i32_to_f32$(OBJ) \ i32_to_f32$(OBJ) \
i32_to_f64$(OBJ) \ i32_to_f64$(OBJ) \
i32_to_extF80M$(OBJ) \ i32_to_extF80M$(OBJ) \
i32_to_f128M$(OBJ) \ i32_to_f128M$(OBJ) \
i64_to_f16$(OBJ) \ i64_to_f16$(OBJ) \
i64_to_f32$(OBJ) \ i64_to_f32$(OBJ) \
i64_to_f64$(OBJ) \ i64_to_f64$(OBJ) \
i64_to_extF80M$(OBJ) \ i64_to_extF80M$(OBJ) \
i64_to_f128M$(OBJ) \ i64_to_f128M$(OBJ) \
f16_to_ui32$(OBJ) \ f16_to_ui32$(OBJ) \
f16_to_ui64$(OBJ) \ f16_to_ui64$(OBJ) \
f16_to_i32$(OBJ) \ f16_to_i32$(OBJ) \
f16_to_i64$(OBJ) \ f16_to_i64$(OBJ) \
f16_to_ui32_r_minMag$(OBJ) \ f16_to_ui32_r_minMag$(OBJ) \
f16_to_ui64_r_minMag$(OBJ) \ f16_to_ui64_r_minMag$(OBJ) \
f16_to_i32_r_minMag$(OBJ) \ f16_to_i32_r_minMag$(OBJ) \
f16_to_i64_r_minMag$(OBJ) \ f16_to_i64_r_minMag$(OBJ) \
f16_to_f32$(OBJ) \ f16_to_f32$(OBJ) \
f16_to_f64$(OBJ) \ f16_to_f64$(OBJ) \
f16_to_extF80M$(OBJ) \ f16_to_extF80M$(OBJ) \
f16_to_f128M$(OBJ) \ f16_to_f128M$(OBJ) \
f16_roundToInt$(OBJ) \ f16_roundToInt$(OBJ) \
f16_add$(OBJ) \ f16_add$(OBJ) \
f16_sub$(OBJ) \ f16_sub$(OBJ) \
f16_mul$(OBJ) \ f16_mul$(OBJ) \
f16_mulAdd$(OBJ) \ f16_mulAdd$(OBJ) \
f16_div$(OBJ) \ f16_div$(OBJ) \
f16_rem$(OBJ) \ f16_rem$(OBJ) \
f16_sqrt$(OBJ) \ f16_sqrt$(OBJ) \
f16_eq$(OBJ) \ f16_eq$(OBJ) \
f16_le$(OBJ) \ f16_le$(OBJ) \
f16_lt$(OBJ) \ f16_lt$(OBJ) \
f16_eq_signaling$(OBJ) \ f16_eq_signaling$(OBJ) \
f16_le_quiet$(OBJ) \ f16_le_quiet$(OBJ) \
f16_lt_quiet$(OBJ) \ f16_lt_quiet$(OBJ) \
f16_isSignalingNaN$(OBJ) \ f16_isSignalingNaN$(OBJ) \
f32_to_ui32$(OBJ) \ f32_to_ui32$(OBJ) \
f32_to_ui64$(OBJ) \ f32_to_ui64$(OBJ) \
f32_to_i32$(OBJ) \ f32_to_i32$(OBJ) \
f32_to_i64$(OBJ) \ f32_to_i64$(OBJ) \
f32_to_ui32_r_minMag$(OBJ) \ f32_to_ui32_r_minMag$(OBJ) \
f32_to_ui64_r_minMag$(OBJ) \ f32_to_ui64_r_minMag$(OBJ) \
f32_to_i32_r_minMag$(OBJ) \ f32_to_i32_r_minMag$(OBJ) \
f32_to_i64_r_minMag$(OBJ) \ f32_to_i64_r_minMag$(OBJ) \
f32_to_f16$(OBJ) \ f32_to_f16$(OBJ) \
f32_to_f64$(OBJ) \ f32_to_f64$(OBJ) \
f32_to_extF80M$(OBJ) \ f32_to_extF80M$(OBJ) \
f32_to_f128M$(OBJ) \ f32_to_f128M$(OBJ) \
f32_roundToInt$(OBJ) \ f32_roundToInt$(OBJ) \
f32_add$(OBJ) \ f32_add$(OBJ) \
f32_sub$(OBJ) \ f32_sub$(OBJ) \
f32_mul$(OBJ) \ f32_mul$(OBJ) \
f32_mulAdd$(OBJ) \ f32_mulAdd$(OBJ) \
f32_div$(OBJ) \ f32_div$(OBJ) \
f32_rem$(OBJ) \ f32_rem$(OBJ) \
f32_sqrt$(OBJ) \ f32_sqrt$(OBJ) \
f32_eq$(OBJ) \ f32_eq$(OBJ) \
f32_le$(OBJ) \ f32_le$(OBJ) \
f32_lt$(OBJ) \ f32_lt$(OBJ) \
f32_eq_signaling$(OBJ) \ f32_eq_signaling$(OBJ) \
f32_le_quiet$(OBJ) \ f32_le_quiet$(OBJ) \
f32_lt_quiet$(OBJ) \ f32_lt_quiet$(OBJ) \
f32_isSignalingNaN$(OBJ) \ f32_isSignalingNaN$(OBJ) \
f64_to_ui32$(OBJ) \ f64_to_ui32$(OBJ) \
f64_to_ui64$(OBJ) \ f64_to_ui64$(OBJ) \
f64_to_i32$(OBJ) \ f64_to_i32$(OBJ) \
f64_to_i64$(OBJ) \ f64_to_i64$(OBJ) \
f64_to_ui32_r_minMag$(OBJ) \ f64_to_ui32_r_minMag$(OBJ) \
f64_to_ui64_r_minMag$(OBJ) \ f64_to_ui64_r_minMag$(OBJ) \
f64_to_i32_r_minMag$(OBJ) \ f64_to_i32_r_minMag$(OBJ) \
f64_to_i64_r_minMag$(OBJ) \ f64_to_i64_r_minMag$(OBJ) \
f64_to_f16$(OBJ) \ f64_to_f16$(OBJ) \
f64_to_f32$(OBJ) \ f64_to_f32$(OBJ) \
f64_to_extF80M$(OBJ) \ f64_to_extF80M$(OBJ) \
f64_to_f128M$(OBJ) \ f64_to_f128M$(OBJ) \
f64_roundToInt$(OBJ) \ f64_roundToInt$(OBJ) \
f64_add$(OBJ) \ f64_add$(OBJ) \
f64_sub$(OBJ) \ f64_sub$(OBJ) \
f64_mul$(OBJ) \ f64_mul$(OBJ) \
f64_mulAdd$(OBJ) \ f64_mulAdd$(OBJ) \
f64_div$(OBJ) \ f64_div$(OBJ) \
f64_rem$(OBJ) \ f64_rem$(OBJ) \
f64_sqrt$(OBJ) \ f64_sqrt$(OBJ) \
f64_eq$(OBJ) \ f64_eq$(OBJ) \
f64_le$(OBJ) \ f64_le$(OBJ) \
f64_lt$(OBJ) \ f64_lt$(OBJ) \
f64_eq_signaling$(OBJ) \ f64_eq_signaling$(OBJ) \
f64_le_quiet$(OBJ) \ f64_le_quiet$(OBJ) \
f64_lt_quiet$(OBJ) \ f64_lt_quiet$(OBJ) \
f64_isSignalingNaN$(OBJ) \ f64_isSignalingNaN$(OBJ) \
extF80M_to_ui32$(OBJ) \ extF80M_to_ui32$(OBJ) \
extF80M_to_ui64$(OBJ) \ extF80M_to_ui64$(OBJ) \
extF80M_to_i32$(OBJ) \ extF80M_to_i32$(OBJ) \
extF80M_to_i64$(OBJ) \ extF80M_to_i64$(OBJ) \
extF80M_to_ui32_r_minMag$(OBJ) \ extF80M_to_ui32_r_minMag$(OBJ) \
extF80M_to_ui64_r_minMag$(OBJ) \ extF80M_to_ui64_r_minMag$(OBJ) \
extF80M_to_i32_r_minMag$(OBJ) \ extF80M_to_i32_r_minMag$(OBJ) \
extF80M_to_i64_r_minMag$(OBJ) \ extF80M_to_i64_r_minMag$(OBJ) \
extF80M_to_f16$(OBJ) \ extF80M_to_f16$(OBJ) \
extF80M_to_f32$(OBJ) \ extF80M_to_f32$(OBJ) \
extF80M_to_f64$(OBJ) \ extF80M_to_f64$(OBJ) \
extF80M_to_f128M$(OBJ) \ extF80M_to_f128M$(OBJ) \
extF80M_roundToInt$(OBJ) \ extF80M_roundToInt$(OBJ) \
extF80M_add$(OBJ) \ extF80M_add$(OBJ) \
extF80M_sub$(OBJ) \ extF80M_sub$(OBJ) \
extF80M_mul$(OBJ) \ extF80M_mul$(OBJ) \
extF80M_div$(OBJ) \ extF80M_div$(OBJ) \
extF80M_rem$(OBJ) \ extF80M_rem$(OBJ) \
extF80M_sqrt$(OBJ) \ extF80M_sqrt$(OBJ) \
extF80M_eq$(OBJ) \ extF80M_eq$(OBJ) \
extF80M_le$(OBJ) \ extF80M_le$(OBJ) \
extF80M_lt$(OBJ) \ extF80M_lt$(OBJ) \
extF80M_eq_signaling$(OBJ) \ extF80M_eq_signaling$(OBJ) \
extF80M_le_quiet$(OBJ) \ extF80M_le_quiet$(OBJ) \
extF80M_lt_quiet$(OBJ) \ extF80M_lt_quiet$(OBJ) \
f128M_to_ui32$(OBJ) \ f128M_to_ui32$(OBJ) \
f128M_to_ui64$(OBJ) \ f128M_to_ui64$(OBJ) \
f128M_to_i32$(OBJ) \ f128M_to_i32$(OBJ) \
f128M_to_i64$(OBJ) \ f128M_to_i64$(OBJ) \
f128M_to_ui32_r_minMag$(OBJ) \ f128M_to_ui32_r_minMag$(OBJ) \
f128M_to_ui64_r_minMag$(OBJ) \ f128M_to_ui64_r_minMag$(OBJ) \
f128M_to_i32_r_minMag$(OBJ) \ f128M_to_i32_r_minMag$(OBJ) \
f128M_to_i64_r_minMag$(OBJ) \ f128M_to_i64_r_minMag$(OBJ) \
f128M_to_f16$(OBJ) \ f128M_to_f16$(OBJ) \
f128M_to_f32$(OBJ) \ f128M_to_f32$(OBJ) \
f128M_to_f64$(OBJ) \ f128M_to_f64$(OBJ) \
f128M_to_extF80M$(OBJ) \ f128M_to_extF80M$(OBJ) \
f128M_roundToInt$(OBJ) \ f128M_roundToInt$(OBJ) \
f128M_add$(OBJ) \ f128M_add$(OBJ) \
f128M_sub$(OBJ) \ f128M_sub$(OBJ) \
f128M_mul$(OBJ) \ f128M_mul$(OBJ) \
f128M_mulAdd$(OBJ) \ f128M_mulAdd$(OBJ) \
f128M_div$(OBJ) \ f128M_div$(OBJ) \
f128M_rem$(OBJ) \ f128M_rem$(OBJ) \
f128M_sqrt$(OBJ) \ f128M_sqrt$(OBJ) \
f128M_eq$(OBJ) \ f128M_eq$(OBJ) \
f128M_le$(OBJ) \ f128M_le$(OBJ) \
f128M_lt$(OBJ) \ f128M_lt$(OBJ) \
f128M_eq_signaling$(OBJ) \ f128M_eq_signaling$(OBJ) \
f128M_le_quiet$(OBJ) \ f128M_le_quiet$(OBJ) \
f128M_lt_quiet$(OBJ) \ f128M_lt_quiet$(OBJ) \
OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS) OBJS_ALL = $(OBJS_PRIMITIVES) $(OBJS_SPECIALIZE) $(OBJS_OTHERS)
$(OBJS_ALL): \ $(OBJS_ALL): \
$(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \ $(OTHER_HEADERS) platform.h $(SOURCE_DIR)/include/primitiveTypes.h \
$(SOURCE_DIR)/include/primitives.h $(SOURCE_DIR)/include/primitives.h
$(OBJS_SPECIALIZE) $(OBJS_OTHERS): \ $(OBJS_SPECIALIZE) $(OBJS_OTHERS): \
$(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \ $(SOURCE_DIR)/include/softfloat_types.h $(SOURCE_DIR)/include/internals.h \
$(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \ $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/specialize.h \
$(SOURCE_DIR)/include/softfloat.h $(SOURCE_DIR)/include/softfloat.h
$(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c $(OBJS_PRIMITIVES) $(OBJS_OTHERS): %$(OBJ): $(SOURCE_DIR)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$*.c
$(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c $(OBJS_SPECIALIZE): %$(OBJ): $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/%.c
$(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c $(COMPILE_C) $(SOURCE_DIR)/$(SPECIALIZE_TYPE)/$*.c
softfloat$(LIB): $(OBJS_ALL) softfloat$(LIB): $(OBJS_ALL)
$(DELETE) $@ $(DELETE) $@
$(MAKELIB) $^ $(MAKELIB) $^
.PHONY: clean .PHONY: clean
clean: clean:
$(DELETE) $(OBJS_ALL) softfloat$(LIB) $(DELETE) $(OBJS_ALL) softfloat$(LIB)

View File

@ -1,50 +1,50 @@
/*============================================================================ /*============================================================================
This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic This C header template is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015, 2016 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
// Edit lines marked with `==>'. See "SoftFloat-source.html". // Edit lines marked with `==>'. See "SoftFloat-source.html".
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define LITTLEENDIAN 1 ==> #define LITTLEENDIAN 1
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define INLINE inline ==> #define INLINE inline
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
==> #define THREAD_LOCAL _Thread_local ==> #define THREAD_LOCAL _Thread_local

View File

@ -1,258 +1,258 @@
<HTML> <HTML>
<HEAD> <HEAD>
<TITLE>Berkeley SoftFloat History</TITLE> <TITLE>Berkeley SoftFloat History</TITLE>
</HEAD> </HEAD>
<BODY> <BODY>
<H1>History of Berkeley SoftFloat, to Release 3e</H1> <H1>History of Berkeley SoftFloat, to Release 3e</H1>
<P> <P>
John R. Hauser<BR> John R. Hauser<BR>
2018 January 20<BR> 2018 January 20<BR>
</P> </P>
<H3>Release 3e (2018 January)</H3> <H3>Release 3e (2018 January)</H3>
<UL> <UL>
<LI> <LI>
Changed the default numeric code for optional rounding mode <CODE>odd</CODE> Changed the default numeric code for optional rounding mode <CODE>odd</CODE>
(round to odd, also known as <EM>jamming</EM>) from 5 to 6. (round to odd, also known as <EM>jamming</EM>) from 5 to 6.
<LI> <LI>
Modified the behavior of rounding mode <CODE>odd</CODE> when rounding to an Modified the behavior of rounding mode <CODE>odd</CODE> when rounding to an
integer value (either conversion to an integer format or a integer value (either conversion to an integer format or a
&lsquo;<CODE>roundToInt</CODE>&rsquo; function). &lsquo;<CODE>roundToInt</CODE>&rsquo; function).
Previously, for those cases only, rounding mode <CODE>odd</CODE> acted the same Previously, for those cases only, rounding mode <CODE>odd</CODE> acted the same
as rounding to minimum magnitude. as rounding to minimum magnitude.
Now all operations are rounded consistently. Now all operations are rounded consistently.
<LI> <LI>
Fixed some errors in the specialization code modeling Intel x86 floating-point, Fixed some errors in the specialization code modeling Intel x86 floating-point,
specifically the integers returned on invalid operations and the propagation of specifically the integers returned on invalid operations and the propagation of
NaN payloads in a few rare cases. NaN payloads in a few rare cases.
<LI> <LI>
Added specialization code modeling ARM floating-point, conforming to VFPv2 or Added specialization code modeling ARM floating-point, conforming to VFPv2 or
later. later.
<LI> <LI>
Added an example target for ARM processors. Added an example target for ARM processors.
<LI> <LI>
Fixed a minor bug whereby function <CODE>f16_to_ui64</CODE> might return a Fixed a minor bug whereby function <CODE>f16_to_ui64</CODE> might return a
different integer than expected in the case that the floating-point operand is different integer than expected in the case that the floating-point operand is
negative. negative.
<LI> <LI>
Added example target-specific optimization for GCC, employing GCC instrinsics Added example target-specific optimization for GCC, employing GCC instrinsics
and support for <NOBR>128-bit</NOBR> integer arithmetic. and support for <NOBR>128-bit</NOBR> integer arithmetic.
<LI> <LI>
Made other minor improvements. Made other minor improvements.
</UL> </UL>
<H3>Release 3d (2017 August)</H3> <H3>Release 3d (2017 August)</H3>
<UL> <UL>
<LI> <LI>
Fixed bugs in the square root functions for <NOBR>64-bit</NOBR> Fixed bugs in the square root functions for <NOBR>64-bit</NOBR>
double-precision, <NOBR>80-bit</NOBR> double-extended-precision, and double-precision, <NOBR>80-bit</NOBR> double-extended-precision, and
<NOBR>128-bit</NOBR> quadruple-precision. <NOBR>128-bit</NOBR> quadruple-precision.
For <NOBR>64-bit</NOBR> double-precision (<CODE>f64_sqrt</CODE>), the result For <NOBR>64-bit</NOBR> double-precision (<CODE>f64_sqrt</CODE>), the result
could sometimes be off by <NOBR>1 unit</NOBR> in the last place could sometimes be off by <NOBR>1 unit</NOBR> in the last place
(<NOBR>1 ulp</NOBR>) from what it should be. (<NOBR>1 ulp</NOBR>) from what it should be.
For the larger formats, the square root could be wrong in a large portion of For the larger formats, the square root could be wrong in a large portion of
the less-significant bits. the less-significant bits.
(A bug in <CODE>f128_sqrt</CODE> was first reported by Alexei Sibidanov.) (A bug in <CODE>f128_sqrt</CODE> was first reported by Alexei Sibidanov.)
</UL> </UL>
<H3>Release 3c (2017 February)</H3> <H3>Release 3c (2017 February)</H3>
<UL> <UL>
<LI> <LI>
Added optional rounding mode <CODE>odd</CODE> (round to odd, also known as Added optional rounding mode <CODE>odd</CODE> (round to odd, also known as
<EM>jamming</EM>). <EM>jamming</EM>).
<LI> <LI>
Corrected the documentation concerning non-canonical representations in Corrected the documentation concerning non-canonical representations in
<NOBR>80-bit</NOBR> double-extended-precision. <NOBR>80-bit</NOBR> double-extended-precision.
</UL> </UL>
<H3>Release 3b (2016 July)</H3> <H3>Release 3b (2016 July)</H3>
<UL> <UL>
<LI> <LI>
Implemented the common <NOBR>16-bit</NOBR> &ldquo;half-precision&rdquo; Implemented the common <NOBR>16-bit</NOBR> &ldquo;half-precision&rdquo;
floating-point format (<CODE>float16_t</CODE>). floating-point format (<CODE>float16_t</CODE>).
<LI> <LI>
Made the integer values returned on invalid conversions to integer formats Made the integer values returned on invalid conversions to integer formats
be determined by the port-specific specialization instead of being the same for be determined by the port-specific specialization instead of being the same for
all ports. all ports.
<LI> <LI>
Added preprocessor macro <CODE>THREAD_LOCAL</CODE> to allow the floating-point Added preprocessor macro <CODE>THREAD_LOCAL</CODE> to allow the floating-point
state (modes and exception flags) to be made per-thread. state (modes and exception flags) to be made per-thread.
<LI> <LI>
Modified the provided Makefiles to allow some options to be overridden from the Modified the provided Makefiles to allow some options to be overridden from the
<CODE>make</CODE> command. <CODE>make</CODE> command.
<LI> <LI>
Made other minor improvements. Made other minor improvements.
</UL> </UL>
<H3>Release 3a (2015 October)</H3> <H3>Release 3a (2015 October)</H3>
<UL> <UL>
<LI> <LI>
Replaced the license text supplied by the University of California, Berkeley. Replaced the license text supplied by the University of California, Berkeley.
</UL> </UL>
<H3>Release 3 (2015 February)</H3> <H3>Release 3 (2015 February)</H3>
<UL> <UL>
<LI> <LI>
Complete rewrite, funded by the University of California, Berkeley, and Complete rewrite, funded by the University of California, Berkeley, and
consequently having a different use license than earlier releases. consequently having a different use license than earlier releases.
Major changes included renaming most types and functions, upgrading some Major changes included renaming most types and functions, upgrading some
algorithms, restructuring the source files, and making SoftFloat into a true algorithms, restructuring the source files, and making SoftFloat into a true
library. library.
<LI> <LI>
Added functions to convert between floating-point and unsigned integers, both Added functions to convert between floating-point and unsigned integers, both
<NOBR>32-bit</NOBR> and <NOBR>64-bit</NOBR> (<CODE>uint32_t</CODE> and <NOBR>32-bit</NOBR> and <NOBR>64-bit</NOBR> (<CODE>uint32_t</CODE> and
<CODE>uint64_t</CODE>). <CODE>uint64_t</CODE>).
<LI> <LI>
Added functions for fused multiply-add, for all supported floating-point Added functions for fused multiply-add, for all supported floating-point
formats except <NOBR>80-bit</NOBR> double-extended-precision. formats except <NOBR>80-bit</NOBR> double-extended-precision.
<LI> <LI>
Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to Added support for a fifth rounding mode, <CODE>near_maxMag</CODE> (round to
nearest, with ties to maximum magnitude, away from zero). nearest, with ties to maximum magnitude, away from zero).
<LI> <LI>
Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley Dropped the <CODE>timesoftfloat</CODE> program (now part of the Berkeley
TestFloat package). TestFloat package).
</UL> </UL>
<H3>Release 2c (2015 January)</H3> <H3>Release 2c (2015 January)</H3>
<UL> <UL>
<LI> <LI>
Fixed mistakes affecting some <NOBR>64-bit</NOBR> processors. Fixed mistakes affecting some <NOBR>64-bit</NOBR> processors.
<LI> <LI>
Further improved the documentation and the wording for the legal restrictions Further improved the documentation and the wording for the legal restrictions
on using SoftFloat releases <NOBR>through 2c</NOBR> (not applicable to on using SoftFloat releases <NOBR>through 2c</NOBR> (not applicable to
<NOBR>Release 3</NOBR> or later). <NOBR>Release 3</NOBR> or later).
</UL> </UL>
<H3>Release 2b (2002 May)</H3> <H3>Release 2b (2002 May)</H3>
<UL> <UL>
<LI> <LI>
Made minor updates to the documentation, including improved wording for the Made minor updates to the documentation, including improved wording for the
legal restrictions on using SoftFloat. legal restrictions on using SoftFloat.
</UL> </UL>
<H3>Release 2a (1998 December)</H3> <H3>Release 2a (1998 December)</H3>
<UL> <UL>
<LI> <LI>
Added functions to convert between <NOBR>64-bit</NOBR> integers Added functions to convert between <NOBR>64-bit</NOBR> integers
(<CODE>int64</CODE>) and all supported floating-point formats. (<CODE>int64</CODE>) and all supported floating-point formats.
<LI> <LI>
Fixed a bug in all <NOBR>64-bit</NOBR>-version square root functions except Fixed a bug in all <NOBR>64-bit</NOBR>-version square root functions except
<CODE>float32_sqrt</CODE> that caused the result sometimes to be off by <CODE>float32_sqrt</CODE> that caused the result sometimes to be off by
<NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should <NOBR>1 unit</NOBR> in the last place (<NOBR>1 ulp</NOBR>) from what it should
be. be.
(Bug discovered by Paul Donahue.) (Bug discovered by Paul Donahue.)
<LI> <LI>
Improved the Makefiles. Improved the Makefiles.
</UL> </UL>
<H3>Release 2 (1997 June)</H3> <H3>Release 2 (1997 June)</H3>
<UL> <UL>
<LI> <LI>
Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the Created the <NOBR>64-bit</NOBR> (<CODE>bits64</CODE>) version, adding the
<CODE>floatx80</CODE> and <CODE>float128</CODE> formats. <CODE>floatx80</CODE> and <CODE>float128</CODE> formats.
<LI> <LI>
Changed the source directory structure, splitting the sources into a Changed the source directory structure, splitting the sources into a
<CODE>bits32</CODE> and a <CODE>bits64</CODE> version. <CODE>bits32</CODE> and a <CODE>bits64</CODE> version.
Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion Renamed <CODE>environment.h</CODE> to <CODE>milieu.h</CODE> to avoid confusion
with environment variables. with environment variables.
<LI> <LI>
Fixed a small error that caused <CODE>float64_round_to_int</CODE> often to Fixed a small error that caused <CODE>float64_round_to_int</CODE> often to
round the wrong way in nearest/even mode when the operand was between round the wrong way in nearest/even mode when the operand was between
2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers. 2<SUP>20</SUP> and 2<SUP>21</SUP> and halfway between two integers.
</UL> </UL>
<H3>Release 1a (1996 July)</H3> <H3>Release 1a (1996 July)</H3>
<UL> <UL>
<LI> <LI>
Corrected a mistake that caused borderline underflow cases not to raise the Corrected a mistake that caused borderline underflow cases not to raise the
underflow flag when they should have. underflow flag when they should have.
(Problem reported by Doug Priest.) (Problem reported by Doug Priest.)
<LI> <LI>
Added the <CODE>float_detect_tininess</CODE> variable to control whether Added the <CODE>float_detect_tininess</CODE> variable to control whether
tininess is detected before or after rounding. tininess is detected before or after rounding.
</UL> </UL>
<H3>Release 1 (1996 July)</H3> <H3>Release 1 (1996 July)</H3>
<UL> <UL>
<LI> <LI>
Original release, based on work done for the International Computer Science Original release, based on work done for the International Computer Science
Institute (ICSI) in Berkeley, California. Institute (ICSI) in Berkeley, California.
</UL> </UL>
</BODY> </BODY>

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr ) bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
{ {
const struct extFloat80M *aSPtr; const struct extFloat80M *aSPtr;
uint64_t uiA0; uint64_t uiA0;
aSPtr = (const struct extFloat80M *) aPtr; aSPtr = (const struct extFloat80M *) aPtr;
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false; if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
return return
! (uiA0 & UINT64_C( 0x4000000000000000 )) ! (uiA0 & UINT64_C( 0x4000000000000000 ))
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF)); && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool f128M_isSignalingNaN( const float128_t *aPtr ) bool f128M_isSignalingNaN( const float128_t *aPtr )
{ {
const uint32_t *aWPtr; const uint32_t *aWPtr;
uint32_t uiA96; uint32_t uiA96;
aWPtr = (const uint32_t *) aPtr; aWPtr = (const uint32_t *) aPtr;
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false; if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
return return
((uiA96 & 0x00007FFF) != 0) ((uiA96 & 0x00007FFF) != 0)
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )] || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
| aWPtr[indexWord( 4, 0 )]) | aWPtr[indexWord( 4, 0 )])
!= 0); != 0);
} }

View File

@ -1,59 +0,0 @@
/*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#include <stdint.h>
#include "platform.h"
#include "specialize.h"
#include "softfloat.h"
/*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a BF16 NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised.
*----------------------------------------------------------------------------*/
void softfloat_bf16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
{
if ( softfloat_isSigNaNBF16UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid );
}
zPtr->sign = uiA>>15;
zPtr->v64 = (uint_fast64_t) uiA<<56;
zPtr->v0 = 0;
}

View File

@ -1,51 +0,0 @@
/*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved.
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without
specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/
#include <stdint.h>
#include "platform.h"
#include "specialize.h"
/*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a BF16 NaN, and
| returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToBF16UI( const struct commonNaN *aPtr )
{
return (uint_fast16_t) aPtr->sign<<15 | 0x7FC0 | aPtr->v64>>56;
}

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| `zSPtr'. | `zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToExtF80M( softfloat_commonNaNToExtF80M(
const struct commonNaN *aPtr, struct extFloat80M *zSPtr ) const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
{ {
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF ); zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF; uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
return uiZ; return uiZ;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
| `zWPtr' points to an array of four 32-bit elements that concatenate in the | `zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr ) softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
{ {
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr ); softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000; zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
} }

View File

@ -1,55 +1,55 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 ); uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 ); uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr ) uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
{ {
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54; return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr ) uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
{ {
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41; return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
} }

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr ) uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
{ {
return return
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 ) (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
| aPtr->v64>>12; | aPtr->v64>>12;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is | Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
| a NaN, converts this NaN to the common NaN form, and stores the resulting | a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling | common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised. | NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80MToCommonNaN( softfloat_extF80MToCommonNaN(
const struct extFloat80M *aSPtr, struct commonNaN *zPtr ) const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
{ {
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) { if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = signExtF80UI64( aSPtr->signExp ); zPtr->sign = signExtF80UI64( aSPtr->signExp );
zPtr->v64 = aSPtr->signif<<1; zPtr->v64 = aSPtr->signif<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of an 80-bit extended floating-point NaN, converts | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80UIToCommonNaN( softfloat_extF80UIToCommonNaN(
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA64>>15; zPtr->sign = uiA64>>15;
zPtr->v64 = uiA0<<1; zPtr->v64 = uiA0<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN, | Assuming the 128-bit floating-point value pointed to by `aWPtr' is a NaN,
| converts this NaN to the common NaN form, and stores the resulting common | converts this NaN to the common NaN form, and stores the resulting common
| NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN, | NaN at the location pointed to by `zPtr'. If the NaN is a signaling NaN,
| the invalid exception is raised. Argument `aWPtr' points to an array of | the invalid exception is raised. Argument `aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order | four 32-bit elements that concatenate in the platform's normal endian order
| to form a 128-bit floating-point value. | to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr ) softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr )
{ {
if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) { if ( f128M_isSignalingNaN( (const float128_t *) aWPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = aWPtr[indexWordHi( 4 )]>>31; zPtr->sign = aWPtr[indexWordHi( 4 )]>>31;
softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 ); softfloat_shortShiftLeft128M( aWPtr, 16, (uint32_t *) &zPtr->v0 );
} }

View File

@ -1,65 +1,65 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
| the common NaN form, and stores the resulting common NaN at the location | the common NaN form, and stores the resulting common NaN at the location
| pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception | pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid exception
| is raised. | is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_f128UIToCommonNaN( softfloat_f128UIToCommonNaN(
uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
struct uint128 NaNSig; struct uint128 NaNSig;
if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNF128UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 ); NaNSig = softfloat_shortShiftLeft128( uiA64, uiA0, 16 );
zPtr->sign = uiA64>>63; zPtr->sign = uiA64>>63;
zPtr->v64 = NaNSig.v64; zPtr->v64 = NaNSig.v64;
zPtr->v0 = NaNSig.v0; zPtr->v0 = NaNSig.v0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr ) void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF16UI( uiA ) ) { if ( softfloat_isSigNaNF16UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>15; zPtr->sign = uiA>>15;
zPtr->v64 = (uint_fast64_t) uiA<<54; zPtr->v64 = (uint_fast64_t) uiA<<54;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 32-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr ) void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF32UI( uiA ) ) { if ( softfloat_isSigNaNF32UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>31; zPtr->sign = uiA>>31;
zPtr->v64 = (uint_fast64_t) uiA<<41; zPtr->v64 = (uint_fast64_t) uiA<<41;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,59 +1,59 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts | Assuming `uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr ) void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNF64UI( uiA ) ) { if ( softfloat_isSigNaNF64UI( uiA ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA>>63; zPtr->sign = uiA>>63;
zPtr->v64 = uiA<<12; zPtr->v64 = uiA<<12;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,107 +1,107 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 80-bit extended floating-point values | Assuming at least one of the two 80-bit extended floating-point values
| pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result | pointed to by `aSPtr' and `bSPtr' is a NaN, stores the combined NaN result
| at the location pointed to by `zSPtr'. If either original floating-point | at the location pointed to by `zSPtr'. If either original floating-point
| value is a signaling NaN, the invalid exception is raised. | value is a signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNExtF80M( softfloat_propagateNaNExtF80M(
const struct extFloat80M *aSPtr, const struct extFloat80M *aSPtr,
const struct extFloat80M *bSPtr, const struct extFloat80M *bSPtr,
struct extFloat80M *zSPtr struct extFloat80M *zSPtr
) )
{ {
bool isSigNaNA; bool isSigNaNA;
const struct extFloat80M *sPtr; const struct extFloat80M *sPtr;
bool isSigNaNB; bool isSigNaNB;
uint_fast16_t uiB64; uint_fast16_t uiB64;
uint64_t uiB0; uint64_t uiB0;
uint_fast16_t uiA64; uint_fast16_t uiA64;
uint64_t uiA0; uint64_t uiA0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ); isSigNaNA = extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr );
sPtr = aSPtr; sPtr = aSPtr;
if ( ! bSPtr ) { if ( ! bSPtr ) {
if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid ); if ( isSigNaNA ) softfloat_raiseFlags( softfloat_flag_invalid );
goto copy; goto copy;
} }
isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr ); isSigNaNB = extF80M_isSignalingNaN( (const extFloat80_t *) bSPtr );
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
if ( isSigNaNB ) goto returnLargerUIMag; if ( isSigNaNB ) goto returnLargerUIMag;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto copyB;
goto copy; goto copy;
} else { } else {
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto copy;
goto copyB; goto copyB;
} }
} }
uiB64 = bSPtr->signExp; uiB64 = bSPtr->signExp;
returnLargerUIMag: returnLargerUIMag:
uiA64 = aSPtr->signExp; uiA64 = aSPtr->signExp;
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto copyB; if ( uiMagA64 < uiMagB64 ) goto copyB;
if ( uiMagB64 < uiMagA64 ) goto copy; if ( uiMagB64 < uiMagA64 ) goto copy;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
uiB0 = bSPtr->signif; uiB0 = bSPtr->signif;
if ( uiA0 < uiB0 ) goto copyB; if ( uiA0 < uiB0 ) goto copyB;
if ( uiB0 < uiA0 ) goto copy; if ( uiB0 < uiA0 ) goto copy;
if ( uiA64 < uiB64 ) goto copy; if ( uiA64 < uiB64 ) goto copy;
copyB: copyB:
sPtr = bSPtr; sPtr = bSPtr;
copy: copy:
zSPtr->signExp = sPtr->signExp; zSPtr->signExp = sPtr->signExp;
zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 ); zSPtr->signif = sPtr->signif | UINT64_C( 0xC000000000000000 );
} }

View File

@ -1,106 +1,106 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2018 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and | Interpreting the unsigned integer formed from concatenating 'uiA64' and
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 80-bit extended floating-point value, and assuming at least on of these | 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN | floating-point values is a NaN, returns the bit pattern of the combined NaN
| result. If either original floating-point value is a signaling NaN, the | result. If either original floating-point value is a signaling NaN, the
| invalid exception is raised. | invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNExtF80UI( softfloat_propagateNaNExtF80UI(
uint_fast16_t uiA64, uint_fast16_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast16_t uiB64, uint_fast16_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA, isSigNaNB; bool isSigNaNA, isSigNaNB;
uint_fast64_t uiNonsigA0, uiNonsigB0; uint_fast64_t uiNonsigA0, uiNonsigB0;
uint_fast16_t uiMagA64, uiMagB64; uint_fast16_t uiMagA64, uiMagB64;
struct uint128 uiZ; struct uint128 uiZ;
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNExtF80UI( uiA64, uiA0 );
isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 ); isSigNaNB = softfloat_isSigNaNExtF80UI( uiB64, uiB0 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
| Make NaNs non-signaling. | Make NaNs non-signaling.
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 ); uiNonsigA0 = uiA0 | UINT64_C( 0xC000000000000000 );
uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 ); uiNonsigB0 = uiB0 | UINT64_C( 0xC000000000000000 );
/*------------------------------------------------------------------------ /*------------------------------------------------------------------------
*------------------------------------------------------------------------*/ *------------------------------------------------------------------------*/
if ( isSigNaNA | isSigNaNB ) { if ( isSigNaNA | isSigNaNB ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) { if ( isSigNaNA ) {
if ( isSigNaNB ) goto returnLargerMag; if ( isSigNaNB ) goto returnLargerMag;
if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB; if ( isNaNExtF80UI( uiB64, uiB0 ) ) goto returnB;
goto returnA; goto returnA;
} else { } else {
if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA; if ( isNaNExtF80UI( uiA64, uiA0 ) ) goto returnA;
goto returnB; goto returnB;
} }
} }
returnLargerMag: returnLargerMag:
uiMagA64 = uiA64 & 0x7FFF; uiMagA64 = uiA64 & 0x7FFF;
uiMagB64 = uiB64 & 0x7FFF; uiMagB64 = uiB64 & 0x7FFF;
if ( uiMagA64 < uiMagB64 ) goto returnB; if ( uiMagA64 < uiMagB64 ) goto returnB;
if ( uiMagB64 < uiMagA64 ) goto returnA; if ( uiMagB64 < uiMagA64 ) goto returnA;
if ( uiA0 < uiB0 ) goto returnB; if ( uiA0 < uiB0 ) goto returnB;
if ( uiB0 < uiA0 ) goto returnA; if ( uiB0 < uiA0 ) goto returnA;
if ( uiA64 < uiB64 ) goto returnA; if ( uiA64 < uiB64 ) goto returnA;
returnB: returnB:
uiZ.v64 = uiB64; uiZ.v64 = uiB64;
uiZ.v0 = uiNonsigB0; uiZ.v0 = uiNonsigB0;
return uiZ; return uiZ;
returnA: returnA:
uiZ.v64 = uiA64; uiZ.v64 = uiA64;
uiZ.v0 = uiNonsigA0; uiZ.v0 = uiNonsigA0;
return uiZ; return uiZ;
} }

View File

@ -1,76 +1,76 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming at least one of the two 128-bit floating-point values pointed to by | Assuming at least one of the two 128-bit floating-point values pointed to by
| `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location | `aWPtr' and `bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by `zWPtr'. If either original floating-point value is a | pointed to by `zWPtr'. If either original floating-point value is a
| signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr', | signaling NaN, the invalid exception is raised. Each of `aWPtr', `bWPtr',
| and `zWPtr' points to an array of four 32-bit elements that concatenate in | and `zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value. | the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_propagateNaNF128M( softfloat_propagateNaNF128M(
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr ) const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr )
{ {
bool isSigNaNA; bool isSigNaNA;
const uint32_t *ptr; const uint32_t *ptr;
ptr = aWPtr; ptr = aWPtr;
isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr ); isSigNaNA = f128M_isSignalingNaN( (const float128_t *) aWPtr );
if ( if (
isSigNaNA isSigNaNA
|| (bWPtr && f128M_isSignalingNaN( (const float128_t *) bWPtr )) || (bWPtr && f128M_isSignalingNaN( (const float128_t *) bWPtr ))
) { ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) goto copy; if ( isSigNaNA ) goto copy;
} }
if ( ! softfloat_isNaNF128M( aWPtr ) ) ptr = bWPtr; if ( ! softfloat_isNaNF128M( aWPtr ) ) ptr = bWPtr;
copy: copy:
zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000; zWPtr[indexWordHi( 4 )] = ptr[indexWordHi( 4 )] | 0x00008000;
zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )]; zWPtr[indexWord( 4, 2 )] = ptr[indexWord( 4, 2 )];
zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )]; zWPtr[indexWord( 4, 1 )] = ptr[indexWord( 4, 1 )];
zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )]; zWPtr[indexWord( 4, 0 )] = ptr[indexWord( 4, 0 )];
} }

View File

@ -1,81 +1,81 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating `uiA64' and | Interpreting the unsigned integer formed from concatenating `uiA64' and
| `uiA0' as a 128-bit floating-point value, and likewise interpreting the | `uiA0' as a 128-bit floating-point value, and likewise interpreting the
| unsigned integer formed from concatenating `uiB64' and `uiB0' as another | unsigned integer formed from concatenating `uiB64' and `uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating- | 128-bit floating-point value, and assuming at least on of these floating-
| point values is a NaN, returns the bit pattern of the combined NaN result. | point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid | If either original floating-point value is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 struct uint128
softfloat_propagateNaNF128UI( softfloat_propagateNaNF128UI(
uint_fast64_t uiA64, uint_fast64_t uiA64,
uint_fast64_t uiA0, uint_fast64_t uiA0,
uint_fast64_t uiB64, uint_fast64_t uiB64,
uint_fast64_t uiB0 uint_fast64_t uiB0
) )
{ {
bool isSigNaNA; bool isSigNaNA;
struct uint128 uiZ; struct uint128 uiZ;
isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 ); isSigNaNA = softfloat_isSigNaNF128UI( uiA64, uiA0 );
if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) { if ( isSigNaNA || softfloat_isSigNaNF128UI( uiB64, uiB0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) goto returnNonsigA; if ( isSigNaNA ) goto returnNonsigA;
} }
if ( isNaNF128UI( uiA64, uiA0 ) ) { if ( isNaNF128UI( uiA64, uiA0 ) ) {
returnNonsigA: returnNonsigA:
uiZ.v64 = uiA64; uiZ.v64 = uiA64;
uiZ.v0 = uiA0; uiZ.v0 = uiA0;
} else { } else {
uiZ.v64 = uiB64; uiZ.v64 = uiB64;
uiZ.v0 = uiB0; uiZ.v0 = uiB0;
} }
uiZ.v64 |= UINT64_C( 0x0000800000000000 ); uiZ.v64 |= UINT64_C( 0x0000800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 16-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t uint_fast16_t
softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB ) softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF16UI( uiA ); isSigNaNA = softfloat_isSigNaNF16UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF16UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | 0x0200; if ( isSigNaNA ) return uiA | 0x0200;
} }
return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200; return (isNaNF16UI( uiA ) ? uiA : uiB) | 0x0200;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 32-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t uint_fast32_t
softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB ) softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF32UI( uiA ); isSigNaNA = softfloat_isSigNaNF32UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF32UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | 0x00400000; if ( isSigNaNA ) return uiA | 0x00400000;
} }
return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000; return (isNaNF32UI( uiA ) ? uiA : uiB) | 0x00400000;
} }

View File

@ -1,63 +1,63 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating- | Interpreting `uiA' and `uiB' as the bit patterns of two 64-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either `uiA' or `uiB' has the pattern of a | the combined NaN result. If either `uiA' or `uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t uint_fast64_t
softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB ) softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB )
{ {
bool isSigNaNA; bool isSigNaNA;
isSigNaNA = softfloat_isSigNaNF64UI( uiA ); isSigNaNA = softfloat_isSigNaNF64UI( uiA );
if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) { if ( isSigNaNA || softfloat_isSigNaNF64UI( uiB ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 ); if ( isSigNaNA ) return uiA | UINT64_C( 0x0008000000000000 );
} }
return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 ); return (isNaNF64UI( uiA ) ? uiA : uiB) | UINT64_C( 0x0008000000000000 );
} }

View File

@ -1,52 +1,52 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Raises the exceptions specified by `flags'. Floating-point traps can be | Raises the exceptions specified by `flags'. Floating-point traps can be
| defined here if desired. It is currently not possible for such a trap | defined here if desired. It is currently not possible for such a trap
| to substitute a result value. If traps are not implemented, this routine | to substitute a result value. If traps are not implemented, this routine
| should be simply `softfloat_exceptionFlags |= flags;'. | should be simply `softfloat_exceptionFlags |= flags;'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_raiseFlags( uint_fast8_t flags ) void softfloat_raiseFlags( uint_fast8_t flags )
{ {
softfloat_exceptionFlags |= flags; softfloat_exceptionFlags |= flags;
} }

View File

@ -1,367 +1,376 @@
/*============================================================================ /*============================================================================
This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic This C header file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the Copyright 2011, 2012, 2013, 2014, 2015, 2016, 2018 The Regents of the
University of California. All rights reserved. University of California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#ifndef specialize_h #ifndef specialize_h
#define specialize_h 1 #define specialize_h 1
#include "primitiveTypes.h" #include <stdbool.h>
#include "softfloat.h" #include <stdint.h>
#include <stdbool.h> #include "primitiveTypes.h"
#include <stdint.h> #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Default value for 'softfloat_detectTininess'. | Default value for 'softfloat_detectTininess'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define init_detectTininess softfloat_tininess_afterRounding #define init_detectTininess softfloat_tininess_afterRounding
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 32-bit integer formats that raise an | The values to return on conversions to 32-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui32_fromPosOverflow 0xFFFFFFFF #define ui32_fromPosOverflow 0xFFFFFFFF
#define ui32_fromNegOverflow 0xFFFFFFFF #define ui32_fromNegOverflow 0xFFFFFFFF
#define ui32_fromNaN 0xFFFFFFFF #define ui32_fromNaN 0xFFFFFFFF
#define i32_fromPosOverflow (-0x7FFFFFFF - 1) #define i32_fromPosOverflow (-0x7FFFFFFF - 1)
#define i32_fromNegOverflow (-0x7FFFFFFF - 1) #define i32_fromNegOverflow (-0x7FFFFFFF - 1)
#define i32_fromNaN (-0x7FFFFFFF - 1) #define i32_fromNaN (-0x7FFFFFFF - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The values to return on conversions to 64-bit integer formats that raise an | The values to return on conversions to 64-bit integer formats that raise an
| invalid exception. | invalid exception.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define ui64_fromPosOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromPosOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
#define ui64_fromNegOverflow UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNegOverflow UINT64_C( 0xFFFFFFFFFFFFFFFF )
#define ui64_fromNaN UINT64_C(0xFFFFFFFFFFFFFFFF) #define ui64_fromNaN UINT64_C( 0xFFFFFFFFFFFFFFFF )
#define i64_fromPosOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromPosOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
#define i64_fromNegOverflow (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNegOverflow (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
#define i64_fromNaN (-INT64_C(0x7FFFFFFFFFFFFFFF) - 1) #define i64_fromNaN (-INT64_C( 0x7FFFFFFFFFFFFFFF ) - 1)
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| "Common NaN" structure, used to transfer NaN representations from one format | "Common NaN" structure, used to transfer NaN representations from one format
| to another. | to another.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct commonNaN { struct commonNaN {
bool sign; bool sign;
#ifdef LITTLEENDIAN #ifdef LITTLEENDIAN
uint64_t v0, v64; uint64_t v0, v64;
#else #else
uint64_t v64, v0; uint64_t v64, v0;
#endif #endif
}; };
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 16-bit floating-point NaN. | The bit pattern for a default generated 16-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define defaultNaNF16UI 0xFE00 #define defaultNaNF16UI 0xFE00
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a | Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a
| 16-bit floating-point signaling NaN. | 16-bit floating-point signaling NaN.
| Note: This macro evaluates its argument more than once. | Note: This macro evaluates its argument more than once.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF16UI(uiA) ((((uiA)&0x7E00) == 0x7C00) && ((uiA)&0x01FF)) #define softfloat_isSigNaNF16UI( uiA ) ((((uiA) & 0x7E00) == 0x7C00) && ((uiA) & 0x01FF))
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts | Assuming 'uiA' has the bit pattern of a 16-bit floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr); void softfloat_f16UIToCommonNaN( uint_fast16_t uiA, struct commonNaN *zPtr );
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI(const struct commonNaN* aPtr); uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr );
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating- | Interpreting 'uiA' and 'uiB' as the bit patterns of two 16-bit floating-
| point values, at least one of which is a NaN, returns the bit pattern of | point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
| signaling NaN, the invalid exception is raised. | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_propagateNaNF16UI(uint_fast16_t uiA, uint_fast16_t uiB); uint_fast16_t
softfloat_propagateNaNF16UI( uint_fast16_t uiA, uint_fast16_t uiB );
/*----------------------------------------------------------------------------
| Returns true when 16-bit unsigned integer 'uiA' has the bit pattern of a /*----------------------------------------------------------------------------
| 16-bit brain floating-point (BF16) signaling NaN. | The bit pattern for a default generated 32-bit floating-point NaN.
| Note: This macro evaluates its argument more than once. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ #define defaultNaNF32UI 0xFFC00000
#define softfloat_isSigNaNBF16UI(uiA) ((((uiA)&0x7FC0) == 0x7F80) && ((uiA)&0x003F))
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a
| Assuming 'uiA' has the bit pattern of a 16-bit BF16 floating-point NaN, converts | 32-bit floating-point signaling NaN.
| this NaN to the common NaN form, and stores the resulting common NaN at the | Note: This macro evaluates its argument more than once.
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid *----------------------------------------------------------------------------*/
| exception is raised. #define softfloat_isSigNaNF32UI( uiA ) ((((uiA) & 0x7FC00000) == 0x7F800000) && ((uiA) & 0x003FFFFF))
*----------------------------------------------------------------------------*/
void softfloat_bf16UIToCommonNaN(uint_fast16_t uiA, struct commonNaN* zPtr); /*----------------------------------------------------------------------------
| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts
/*---------------------------------------------------------------------------- | this NaN to the common NaN form, and stores the resulting common NaN at the
| Converts the common NaN pointed to by 'aPtr' into a 16-bit floating-point | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| NaN, and returns the bit pattern of this value as an unsigned integer. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToBF16UI(const struct commonNaN* aPtr); void softfloat_f32UIToCommonNaN( uint_fast32_t uiA, struct commonNaN *zPtr );
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The bit pattern for a default generated 32-bit floating-point NaN. | Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point
*----------------------------------------------------------------------------*/ | NaN, and returns the bit pattern of this value as an unsigned integer.
#define defaultNaNF32UI 0xFFC00000 *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr );
/*----------------------------------------------------------------------------
| Returns true when 32-bit unsigned integer 'uiA' has the bit pattern of a /*----------------------------------------------------------------------------
| 32-bit floating-point signaling NaN. | Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating-
| Note: This macro evaluates its argument more than once. | point values, at least one of which is a NaN, returns the bit pattern of
*----------------------------------------------------------------------------*/ | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
#define softfloat_isSigNaNF32UI(uiA) ((((uiA)&0x7FC00000) == 0x7F800000) && ((uiA)&0x003FFFFF)) | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- uint_fast32_t
| Assuming 'uiA' has the bit pattern of a 32-bit floating-point NaN, converts softfloat_propagateNaNF32UI( uint_fast32_t uiA, uint_fast32_t uiB );
| this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid /*----------------------------------------------------------------------------
| exception is raised. | The bit pattern for a default generated 64-bit floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f32UIToCommonNaN(uint_fast32_t uiA, struct commonNaN* zPtr); #define defaultNaNF64UI UINT64_C( 0xFFF8000000000000 )
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 32-bit floating-point | Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
| NaN, and returns the bit pattern of this value as an unsigned integer. | 64-bit floating-point signaling NaN.
*----------------------------------------------------------------------------*/ | Note: This macro evaluates its argument more than once.
uint_fast32_t softfloat_commonNaNToF32UI(const struct commonNaN* aPtr); *----------------------------------------------------------------------------*/
#define softfloat_isSigNaNF64UI( uiA ) ((((uiA) & UINT64_C( 0x7FF8000000000000 )) == UINT64_C( 0x7FF0000000000000 )) && ((uiA) & UINT64_C( 0x0007FFFFFFFFFFFF )))
/*----------------------------------------------------------------------------
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 32-bit floating- /*----------------------------------------------------------------------------
| point values, at least one of which is a NaN, returns the bit pattern of | Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a | this NaN to the common NaN form, and stores the resulting common NaN at the
| signaling NaN, the invalid exception is raised. | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
*----------------------------------------------------------------------------*/ | exception is raised.
uint_fast32_t softfloat_propagateNaNF32UI(uint_fast32_t uiA, uint_fast32_t uiB); *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN( uint_fast64_t uiA, struct commonNaN *zPtr );
/*----------------------------------------------------------------------------
| The bit pattern for a default generated 64-bit floating-point NaN. /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ | Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point
#define defaultNaNF64UI UINT64_C(0xFFF8000000000000) | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr );
| Returns true when 64-bit unsigned integer 'uiA' has the bit pattern of a
| 64-bit floating-point signaling NaN. /*----------------------------------------------------------------------------
| Note: This macro evaluates its argument more than once. | Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating-
*----------------------------------------------------------------------------*/ | point values, at least one of which is a NaN, returns the bit pattern of
#define softfloat_isSigNaNF64UI(uiA) \ | the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a
((((uiA)&UINT64_C(0x7FF8000000000000)) == UINT64_C(0x7FF0000000000000)) && ((uiA)&UINT64_C(0x0007FFFFFFFFFFFF))) | signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- uint_fast64_t
| Assuming 'uiA' has the bit pattern of a 64-bit floating-point NaN, converts softfloat_propagateNaNF64UI( uint_fast64_t uiA, uint_fast64_t uiB );
| this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid /*----------------------------------------------------------------------------
| exception is raised. | The bit pattern for a default generated 80-bit extended floating-point NaN.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_f64UIToCommonNaN(uint_fast64_t uiA, struct commonNaN* zPtr); #define defaultNaNExtF80UI64 0xFFFF
#define defaultNaNExtF80UI0 UINT64_C( 0xC000000000000000 )
/*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 64-bit floating-point /*----------------------------------------------------------------------------
| NaN, and returns the bit pattern of this value as an unsigned integer. | Returns true when the 80-bit unsigned integer formed from concatenating
*----------------------------------------------------------------------------*/ | 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended
uint_fast64_t softfloat_commonNaNToF64UI(const struct commonNaN* aPtr); | floating-point signaling NaN.
| Note: This macro evaluates its arguments more than once.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| Interpreting 'uiA' and 'uiB' as the bit patterns of two 64-bit floating- #define softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ((((uiA64) & 0x7FFF) == 0x7FFF) && ! ((uiA0) & UINT64_C( 0x4000000000000000 )) && ((uiA0) & UINT64_C( 0x3FFFFFFFFFFFFFFF )))
| point values, at least one of which is a NaN, returns the bit pattern of
| the combined NaN result. If either 'uiA' or 'uiB' has the pattern of a #ifdef SOFTFLOAT_FAST_INT64
| signaling NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
uint_fast64_t softfloat_propagateNaNF64UI(uint_fast64_t uiA, uint_fast64_t uiB); | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is
| defined.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| The bit pattern for a default generated 80-bit extended floating-point NaN.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
#define defaultNaNExtF80UI64 0xFFFF | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
#define defaultNaNExtF80UI0 UINT64_C(0xC000000000000000) | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the
/*---------------------------------------------------------------------------- | location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid
| Returns true when the 80-bit unsigned integer formed from concatenating | exception is raised.
| 16-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of an 80-bit extended *----------------------------------------------------------------------------*/
| floating-point signaling NaN. void
| Note: This macro evaluates its arguments more than once. softfloat_extF80UIToCommonNaN(
*----------------------------------------------------------------------------*/ uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
#define softfloat_isSigNaNExtF80UI(uiA64, uiA0) \
((((uiA64)&0x7FFF) == 0x7FFF) && !((uiA0)&UINT64_C(0x4000000000000000)) && ((uiA0)&UINT64_C(0x3FFFFFFFFFFFFFFF))) /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
#ifdef SOFTFLOAT_FAST_INT64 | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr );
| defined.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
| Interpreting the unsigned integer formed from concatenating 'uiA64' and
/*---------------------------------------------------------------------------- | 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' | the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| has the bit pattern of an 80-bit extended floating-point NaN, converts | 80-bit extended floating-point value, and assuming at least on of these
| this NaN to the common NaN form, and stores the resulting common NaN at the | floating-point values is a NaN, returns the bit pattern of the combined NaN
| location pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid | result. If either original floating-point value is a signaling NaN, the
| exception is raised. | invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void softfloat_extF80UIToCommonNaN(uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); struct uint128
softfloat_propagateNaNExtF80UI(
/*---------------------------------------------------------------------------- uint_fast16_t uiA64,
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended uint_fast64_t uiA0,
| floating-point NaN, and returns the bit pattern of this value as an unsigned uint_fast16_t uiB64,
| integer. uint_fast64_t uiB0
*----------------------------------------------------------------------------*/ );
struct uint128 softfloat_commonNaNToExtF80UI(const struct commonNaN* aPtr);
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | The bit pattern for a default generated 128-bit floating-point NaN.
| Interpreting the unsigned integer formed from concatenating 'uiA64' and *----------------------------------------------------------------------------*/
| 'uiA0' as an 80-bit extended floating-point value, and likewise interpreting #define defaultNaNF128UI64 UINT64_C( 0xFFFF800000000000 )
| the unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another #define defaultNaNF128UI0 UINT64_C( 0 )
| 80-bit extended floating-point value, and assuming at least on of these
| floating-point values is a NaN, returns the bit pattern of the combined NaN /*----------------------------------------------------------------------------
| result. If either original floating-point value is a signaling NaN, the | Returns true when the 128-bit unsigned integer formed from concatenating
| invalid exception is raised. | 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating-
*----------------------------------------------------------------------------*/ | point signaling NaN.
struct uint128 softfloat_propagateNaNExtF80UI(uint_fast16_t uiA64, uint_fast64_t uiA0, uint_fast16_t uiB64, uint_fast64_t uiB0); | Note: This macro evaluates its arguments more than once.
*----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- #define softfloat_isSigNaNF128UI( uiA64, uiA0 ) ((((uiA64) & UINT64_C( 0x7FFF800000000000 )) == UINT64_C( 0x7FFF000000000000 )) && ((uiA0) || ((uiA64) & UINT64_C( 0x00007FFFFFFFFFFF ))))
| The bit pattern for a default generated 128-bit floating-point NaN.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
#define defaultNaNF128UI64 UINT64_C(0xFFFF800000000000) | Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0'
#define defaultNaNF128UI0 UINT64_C(0) | has the bit pattern of a 128-bit floating-point NaN, converts this NaN to
| the common NaN form, and stores the resulting common NaN at the location
/*---------------------------------------------------------------------------- | pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception
| Returns true when the 128-bit unsigned integer formed from concatenating | is raised.
| 64-bit 'uiA64' and 64-bit 'uiA0' has the bit pattern of a 128-bit floating- *----------------------------------------------------------------------------*/
| point signaling NaN. void
| Note: This macro evaluates its arguments more than once. softfloat_f128UIToCommonNaN(
*----------------------------------------------------------------------------*/ uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr );
#define softfloat_isSigNaNF128UI(uiA64, uiA0) \
((((uiA64)&UINT64_C(0x7FFF800000000000)) == UINT64_C(0x7FFF000000000000)) && ((uiA0) || ((uiA64)&UINT64_C(0x00007FFFFFFFFFFF)))) /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
/*---------------------------------------------------------------------------- | NaN, and returns the bit pattern of this value as an unsigned integer.
| Assuming the unsigned integer formed from concatenating 'uiA64' and 'uiA0' *----------------------------------------------------------------------------*/
| has the bit pattern of a 128-bit floating-point NaN, converts this NaN to struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN * );
| the common NaN form, and stores the resulting common NaN at the location
| pointed to by 'zPtr'. If the NaN is a signaling NaN, the invalid exception /*----------------------------------------------------------------------------
| is raised. | Interpreting the unsigned integer formed from concatenating 'uiA64' and
*----------------------------------------------------------------------------*/ | 'uiA0' as a 128-bit floating-point value, and likewise interpreting the
void softfloat_f128UIToCommonNaN(uint_fast64_t uiA64, uint_fast64_t uiA0, struct commonNaN* zPtr); | unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another
| 128-bit floating-point value, and assuming at least on of these floating-
/*---------------------------------------------------------------------------- | point values is a NaN, returns the bit pattern of the combined NaN result.
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point | If either original floating-point value is a signaling NaN, the invalid
| NaN, and returns the bit pattern of this value as an unsigned integer. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI(const struct commonNaN*); struct uint128
softfloat_propagateNaNF128UI(
/*---------------------------------------------------------------------------- uint_fast64_t uiA64,
| Interpreting the unsigned integer formed from concatenating 'uiA64' and uint_fast64_t uiA0,
| 'uiA0' as a 128-bit floating-point value, and likewise interpreting the uint_fast64_t uiB64,
| unsigned integer formed from concatenating 'uiB64' and 'uiB0' as another uint_fast64_t uiB0
| 128-bit floating-point value, and assuming at least on of these floating- );
| point values is a NaN, returns the bit pattern of the combined NaN result.
| If either original floating-point value is a signaling NaN, the invalid #else
| exception is raised.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
struct uint128 softfloat_propagateNaNF128UI(uint_fast64_t uiA64, uint_fast64_t uiA0, uint_fast64_t uiB64, uint_fast64_t uiB0); | The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not
| defined.
#else *----------------------------------------------------------------------------*/
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| The following functions are needed only when 'SOFTFLOAT_FAST_INT64' is not | Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is
| defined. | a NaN, converts this NaN to the common NaN form, and stores the resulting
*----------------------------------------------------------------------------*/ | common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised.
/*---------------------------------------------------------------------------- *----------------------------------------------------------------------------*/
| Assuming the 80-bit extended floating-point value pointed to by 'aSPtr' is void
| a NaN, converts this NaN to the common NaN form, and stores the resulting softfloat_extF80MToCommonNaN(
| common NaN at the location pointed to by 'zPtr'. If the NaN is a signaling const struct extFloat80M *aSPtr, struct commonNaN *zPtr );
| NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
void softfloat_extF80MToCommonNaN(const struct extFloat80M* aSPtr, struct commonNaN* zPtr); | Converts the common NaN pointed to by 'aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by
/*---------------------------------------------------------------------------- | 'zSPtr'.
| Converts the common NaN pointed to by 'aPtr' into an 80-bit extended *----------------------------------------------------------------------------*/
| floating-point NaN, and stores this NaN at the location pointed to by void
| 'zSPtr'. softfloat_commonNaNToExtF80M(
*----------------------------------------------------------------------------*/ const struct commonNaN *aPtr, struct extFloat80M *zSPtr );
void softfloat_commonNaNToExtF80M(const struct commonNaN* aPtr, struct extFloat80M* zSPtr);
/*----------------------------------------------------------------------------
/*---------------------------------------------------------------------------- | Assuming at least one of the two 80-bit extended floating-point values
| Assuming at least one of the two 80-bit extended floating-point values | pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result
| pointed to by 'aSPtr' and 'bSPtr' is a NaN, stores the combined NaN result | at the location pointed to by 'zSPtr'. If either original floating-point
| at the location pointed to by 'zSPtr'. If either original floating-point | value is a signaling NaN, the invalid exception is raised.
| value is a signaling NaN, the invalid exception is raised. *----------------------------------------------------------------------------*/
*----------------------------------------------------------------------------*/ void
void softfloat_propagateNaNExtF80M(const struct extFloat80M* aSPtr, const struct extFloat80M* bSPtr, struct extFloat80M* zSPtr); softfloat_propagateNaNExtF80M(
const struct extFloat80M *aSPtr,
/*---------------------------------------------------------------------------- const struct extFloat80M *bSPtr,
| The bit pattern for a default generated 128-bit floating-point NaN. struct extFloat80M *zSPtr
*----------------------------------------------------------------------------*/ );
#define defaultNaNF128UI96 0xFFFF8000
#define defaultNaNF128UI64 0 /*----------------------------------------------------------------------------
#define defaultNaNF128UI32 0 | The bit pattern for a default generated 128-bit floating-point NaN.
#define defaultNaNF128UI0 0 *----------------------------------------------------------------------------*/
#define defaultNaNF128UI96 0xFFFF8000
/*---------------------------------------------------------------------------- #define defaultNaNF128UI64 0
| Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN, #define defaultNaNF128UI32 0
| converts this NaN to the common NaN form, and stores the resulting common #define defaultNaNF128UI0 0
| NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN,
| the invalid exception is raised. Argument 'aWPtr' points to an array of /*----------------------------------------------------------------------------
| four 32-bit elements that concatenate in the platform's normal endian order | Assuming the 128-bit floating-point value pointed to by 'aWPtr' is a NaN,
| to form a 128-bit floating-point value. | converts this NaN to the common NaN form, and stores the resulting common
*----------------------------------------------------------------------------*/ | NaN at the location pointed to by 'zPtr'. If the NaN is a signaling NaN,
void softfloat_f128MToCommonNaN(const uint32_t* aWPtr, struct commonNaN* zPtr); | the invalid exception is raised. Argument 'aWPtr' points to an array of
| four 32-bit elements that concatenate in the platform's normal endian order
/*---------------------------------------------------------------------------- | to form a 128-bit floating-point value.
| Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point *----------------------------------------------------------------------------*/
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument void
| 'zWPtr' points to an array of four 32-bit elements that concatenate in the softfloat_f128MToCommonNaN( const uint32_t *aWPtr, struct commonNaN *zPtr );
| platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ /*----------------------------------------------------------------------------
void softfloat_commonNaNToF128M(const struct commonNaN* aPtr, uint32_t* zWPtr); | Converts the common NaN pointed to by 'aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by 'zWPtr'. Argument
/*---------------------------------------------------------------------------- | 'zWPtr' points to an array of four 32-bit elements that concatenate in the
| Assuming at least one of the two 128-bit floating-point values pointed to by | platform's normal endian order to form a 128-bit floating-point value.
| 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location *----------------------------------------------------------------------------*/
| pointed to by 'zWPtr'. If either original floating-point value is a void
| signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr', softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr );
| and 'zWPtr' points to an array of four 32-bit elements that concatenate in
| the platform's normal endian order to form a 128-bit floating-point value. /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ | Assuming at least one of the two 128-bit floating-point values pointed to by
void softfloat_propagateNaNF128M(const uint32_t* aWPtr, const uint32_t* bWPtr, uint32_t* zWPtr); | 'aWPtr' and 'bWPtr' is a NaN, stores the combined NaN result at the location
| pointed to by 'zWPtr'. If either original floating-point value is a
#endif | signaling NaN, the invalid exception is raised. Each of 'aWPtr', 'bWPtr',
| and 'zWPtr' points to an array of four 32-bit elements that concatenate in
#endif | the platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/
void
softfloat_propagateNaNF128M(
const uint32_t *aWPtr, const uint32_t *bWPtr, uint32_t *zWPtr );
#endif
#endif

View File

@ -1,57 +1,57 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool extF80M_isSignalingNaN( const extFloat80_t *aPtr ) bool extF80M_isSignalingNaN( const extFloat80_t *aPtr )
{ {
const struct extFloat80M *aSPtr; const struct extFloat80M *aSPtr;
uint64_t uiA0; uint64_t uiA0;
aSPtr = (const struct extFloat80M *) aPtr; aSPtr = (const struct extFloat80M *) aPtr;
if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false; if ( (aSPtr->signExp & 0x7FFF) != 0x7FFF ) return false;
uiA0 = aSPtr->signif; uiA0 = aSPtr->signif;
return return
! (uiA0 & UINT64_C( 0x4000000000000000 )) ! (uiA0 & UINT64_C( 0x4000000000000000 ))
&& (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF)); && (uiA0 & UINT64_C( 0x3FFFFFFFFFFFFFFF));
} }

View File

@ -1,60 +1,60 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdbool.h> #include <stdbool.h>
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
bool f128M_isSignalingNaN( const float128_t *aPtr ) bool f128M_isSignalingNaN( const float128_t *aPtr )
{ {
const uint32_t *aWPtr; const uint32_t *aWPtr;
uint32_t uiA96; uint32_t uiA96;
aWPtr = (const uint32_t *) aPtr; aWPtr = (const uint32_t *) aPtr;
uiA96 = aWPtr[indexWordHi( 4 )]; uiA96 = aWPtr[indexWordHi( 4 )];
if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false; if ( (uiA96 & 0x7FFF8000) != 0x7FFF0000 ) return false;
return return
((uiA96 & 0x00007FFF) != 0) ((uiA96 & 0x00007FFF) != 0)
|| ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )] || ((aWPtr[indexWord( 4, 2 )] | aWPtr[indexWord( 4, 1 )]
| aWPtr[indexWord( 4, 0 )]) | aWPtr[indexWord( 4, 0 )])
!= 0); != 0);
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and stores this NaN at the location pointed to by | floating-point NaN, and stores this NaN at the location pointed to by
| `zSPtr'. | `zSPtr'.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToExtF80M( softfloat_commonNaNToExtF80M(
const struct commonNaN *aPtr, struct extFloat80M *zSPtr ) const struct commonNaN *aPtr, struct extFloat80M *zSPtr )
{ {
zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF ); zSPtr->signExp = packToExtF80UI64( aPtr->sign, 0x7FFF );
zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; zSPtr->signif = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into an 80-bit extended | Converts the common NaN pointed to by `aPtr' into an 80-bit extended
| floating-point NaN, and returns the bit pattern of this value as an unsigned | floating-point NaN, and returns the bit pattern of this value as an unsigned
| integer. | integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToExtF80UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF; uiZ.v64 = (uint_fast16_t) aPtr->sign<<15 | 0x7FFF;
uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1; uiZ.v0 = UINT64_C( 0xC000000000000000 ) | aPtr->v64>>1;
return uiZ; return uiZ;
} }

View File

@ -1,56 +1,56 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument | NaN, and stores this NaN at the location pointed to by `zWPtr'. Argument
| `zWPtr' points to an array of four 32-bit elements that concatenate in the | `zWPtr' points to an array of four 32-bit elements that concatenate in the
| platform's normal endian order to form a 128-bit floating-point value. | platform's normal endian order to form a 128-bit floating-point value.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr ) softfloat_commonNaNToF128M( const struct commonNaN *aPtr, uint32_t *zWPtr )
{ {
softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr ); softfloat_shortShiftRight128M( (const uint32_t *) &aPtr->v0, 16, zWPtr );
zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000; zWPtr[indexWordHi( 4 )] |= (uint32_t) aPtr->sign<<31 | 0x7FFF8000;
} }

View File

@ -1,55 +1,55 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "primitives.h" #include "primitives.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 128-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr ) struct uint128 softfloat_commonNaNToF128UI( const struct commonNaN *aPtr )
{ {
struct uint128 uiZ; struct uint128 uiZ;
uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 ); uiZ = softfloat_shortShiftRight128( aPtr->v64, aPtr->v0, 16 );
uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 ); uiZ.v64 |= (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FFF800000000000 );
return uiZ; return uiZ;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of Copyright 2011, 2012, 2013, 2014, 2015 The Regents of the University of
California. All rights reserved. California. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 16-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr ) uint_fast16_t softfloat_commonNaNToF16UI( const struct commonNaN *aPtr )
{ {
return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54; return (uint_fast16_t) aPtr->sign<<15 | 0x7E00 | aPtr->v64>>54;
} }

View File

@ -1,51 +1,51 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 32-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr ) uint_fast32_t softfloat_commonNaNToF32UI( const struct commonNaN *aPtr )
{ {
return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41; return (uint_fast32_t) aPtr->sign<<31 | 0x7FC00000 | aPtr->v64>>41;
} }

View File

@ -1,53 +1,53 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point | Converts the common NaN pointed to by `aPtr' into a 64-bit floating-point
| NaN, and returns the bit pattern of this value as an unsigned integer. | NaN, and returns the bit pattern of this value as an unsigned integer.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr ) uint_fast64_t softfloat_commonNaNToF64UI( const struct commonNaN *aPtr )
{ {
return return
(uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 ) (uint_fast64_t) aPtr->sign<<63 | UINT64_C( 0x7FF8000000000000 )
| aPtr->v64>>12; | aPtr->v64>>12;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "internals.h" #include "internals.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is | Assuming the 80-bit extended floating-point value pointed to by `aSPtr' is
| a NaN, converts this NaN to the common NaN form, and stores the resulting | a NaN, converts this NaN to the common NaN form, and stores the resulting
| common NaN at the location pointed to by `zPtr'. If the NaN is a signaling | common NaN at the location pointed to by `zPtr'. If the NaN is a signaling
| NaN, the invalid exception is raised. | NaN, the invalid exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80MToCommonNaN( softfloat_extF80MToCommonNaN(
const struct extFloat80M *aSPtr, struct commonNaN *zPtr ) const struct extFloat80M *aSPtr, struct commonNaN *zPtr )
{ {
if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) { if ( extF80M_isSignalingNaN( (const extFloat80_t *) aSPtr ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = signExtF80UI64( aSPtr->signExp ); zPtr->sign = signExtF80UI64( aSPtr->signExp );
zPtr->v64 = aSPtr->signif<<1; zPtr->v64 = aSPtr->signif<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

View File

@ -1,62 +1,62 @@
/*============================================================================ /*============================================================================
This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic This C source file is part of the SoftFloat IEEE Floating-Point Arithmetic
Package, Release 3e, by John R. Hauser. Package, Release 3e, by John R. Hauser.
Copyright 2011, 2012, 2013, 2014 The Regents of the University of California. Copyright 2011, 2012, 2013, 2014 The Regents of the University of California.
All rights reserved. All rights reserved.
Redistribution and use in source and binary forms, with or without Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met: modification, are permitted provided that the following conditions are met:
1. Redistributions of source code must retain the above copyright notice, 1. Redistributions of source code must retain the above copyright notice,
this list of conditions, and the following disclaimer. this list of conditions, and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright notice, 2. Redistributions in binary form must reproduce the above copyright notice,
this list of conditions, and the following disclaimer in the documentation this list of conditions, and the following disclaimer in the documentation
and/or other materials provided with the distribution. and/or other materials provided with the distribution.
3. Neither the name of the University nor the names of its contributors may 3. Neither the name of the University nor the names of its contributors may
be used to endorse or promote products derived from this software without be used to endorse or promote products derived from this software without
specific prior written permission. specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS "AS IS", AND ANY
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ARE
DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
=============================================================================*/ =============================================================================*/
#include <stdint.h> #include <stdint.h>
#include "platform.h" #include "platform.h"
#include "specialize.h" #include "specialize.h"
#include "softfloat.h" #include "softfloat.h"
/*---------------------------------------------------------------------------- /*----------------------------------------------------------------------------
| Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0' | Assuming the unsigned integer formed from concatenating `uiA64' and `uiA0'
| has the bit pattern of an 80-bit extended floating-point NaN, converts | has the bit pattern of an 80-bit extended floating-point NaN, converts
| this NaN to the common NaN form, and stores the resulting common NaN at the | this NaN to the common NaN form, and stores the resulting common NaN at the
| location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid | location pointed to by `zPtr'. If the NaN is a signaling NaN, the invalid
| exception is raised. | exception is raised.
*----------------------------------------------------------------------------*/ *----------------------------------------------------------------------------*/
void void
softfloat_extF80UIToCommonNaN( softfloat_extF80UIToCommonNaN(
uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr ) uint_fast16_t uiA64, uint_fast64_t uiA0, struct commonNaN *zPtr )
{ {
if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) { if ( softfloat_isSigNaNExtF80UI( uiA64, uiA0 ) ) {
softfloat_raiseFlags( softfloat_flag_invalid ); softfloat_raiseFlags( softfloat_flag_invalid );
} }
zPtr->sign = uiA64>>15; zPtr->sign = uiA64>>15;
zPtr->v64 = uiA0<<1; zPtr->v64 = uiA0<<1;
zPtr->v0 = 0; zPtr->v0 = 0;
} }

Some files were not shown because too many files have changed in this diff Show More