mirror of
https://github.com/bulletphysics/bullet3
synced 2025-01-10 17:30:12 +00:00
Added IBM Cell SDK 2.x software_cache to Bullet/Extras. There is an option to enable it for the BulletMultiThreaded Cell version.
See USE_SOFTWARE_CACHE in Bullet\src\BulletMultiThreaded\SpuNarrowPhaseCollisionTask\SpuGatheringCollisionTask.cpp It improves the Bullet midphase collision detection (triangle/vertex fetch) The license is CommonPublicLicense-1.0, see included license docs.
This commit is contained in:
parent
50f475feb5
commit
dc8692ba94
14
Extras/software_cache/Makefile
Normal file
14
Extras/software_cache/Makefile
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
# SCE CONFIDENTIAL
|
||||||
|
# PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
# Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
CELL_MK_DIR ?= $(CELL_SDK)/samples/mk
|
||||||
|
include $(CELL_MK_DIR)/sdk.makedef.mk
|
||||||
|
|
||||||
|
MK_TARGET = spu_thr_printf.ppu.mk hello.spu.mk
|
||||||
|
|
||||||
|
include $(CELL_MK_DIR)/sdk.target.mk
|
||||||
|
|
||||||
|
|
239
Extras/software_cache/SPU_printf/SPU_printf.vcproj
Normal file
239
Extras/software_cache/SPU_printf/SPU_printf.vcproj
Normal file
@ -0,0 +1,239 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="SPU_printf"
|
||||||
|
ProjectGUID="{47EE939D-CB3D-4600-B8B6-79FDF607E133}"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="PS3 Debug|Win32"
|
||||||
|
OutputDirectory="PS3_Debug"
|
||||||
|
IntermediateDirectory="PS3_Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
DeleteExtensionsOnClean="*.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);$(TargetDir)$(TargetName).self"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="-g -O0 -Wall -fno-exceptions"
|
||||||
|
AdditionalIncludeDirectories=""$(SN_PS3_PATH)\spu\include\sn";"$(SCE_PS3_ROOT)\target\spu\include";"$(SCE_PS3_ROOT)\target\common\include";"$(TargetDir)/cache/include""
|
||||||
|
PreprocessorDefinitions="SN_TARGET_PS3_SPU;_DEBUG;__GCC__;SPU"
|
||||||
|
ProgramDataBaseFileName="$(IntDir)/"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions=""
|
||||||
|
AdditionalDependencies=""
|
||||||
|
OutputFile="../$(ProjectName).spu.elf"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
GenerateManifest="false"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
Description="Fake Signing ELF "$(TargetDir)$(TargetName).self""
|
||||||
|
CommandLine="$(SCE_PS3_ROOT)\host-win32\bin\make_fself "$(TargetPath)" "$(TargetDir)$(TargetName).self""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="PS3 Release|Win32"
|
||||||
|
OutputDirectory="PS3_Release"
|
||||||
|
IntermediateDirectory="PS3_Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
DeleteExtensionsOnClean="*.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);$(TargetDir)$(TargetName).self"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="-O2 -Wall -fno-exceptions"
|
||||||
|
AdditionalIncludeDirectories=""$(SN_PS3_PATH)\spu\include\sn";"$(SCE_PS3_ROOT)\target\spu\include";"$(SCE_PS3_ROOT)\target\common\include";"$(TargetDir)/cache/include""
|
||||||
|
PreprocessorDefinitions="SN_TARGET_PS3_SPU;NDEBUG;__GCC__;SPU"
|
||||||
|
ProgramDataBaseFileName="$(IntDir)/"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions=""
|
||||||
|
AdditionalDependencies=""
|
||||||
|
OutputFile="../$(ProjectName).spu.elf"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
GenerateManifest="false"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
Description="Fake Signing ELF "$(TargetDir)$(TargetName).self""
|
||||||
|
CommandLine="$(SCE_PS3_ROOT)\host-win32\bin\make_fself "$(TargetPath)" "$(TargetDir)$(TargetName).self""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;cc;s;asm"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\hello.spu.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\api.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\cbe_mfc.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\defs.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\dma.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\ilog2.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\memset.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\nway-lookup.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\nway-miss.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\nway-opt.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\nway-replace.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\nway.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\spe_cache.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath="..\cache\include\vec_literal.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
213
Extras/software_cache/cache/CommonPublicLicense-1.0
vendored
Normal file
213
Extras/software_cache/cache/CommonPublicLicense-1.0
vendored
Normal file
@ -0,0 +1,213 @@
|
|||||||
|
Common Public License Version 1.0
|
||||||
|
|
||||||
|
THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC
|
||||||
|
LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM
|
||||||
|
CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.
|
||||||
|
|
||||||
|
1. DEFINITIONS
|
||||||
|
|
||||||
|
"Contribution" means:
|
||||||
|
|
||||||
|
a) in the case of the initial Contributor, the initial code and
|
||||||
|
documentation distributed under this Agreement, and
|
||||||
|
|
||||||
|
b) in the case of each subsequent Contributor:
|
||||||
|
|
||||||
|
i) changes to the Program, and
|
||||||
|
|
||||||
|
ii) additions to the Program;
|
||||||
|
|
||||||
|
where such changes and/or additions to the Program originate from and are
|
||||||
|
distributed by that particular Contributor. A Contribution 'originates' from a
|
||||||
|
Contributor if it was added to the Program by such Contributor itself or anyone
|
||||||
|
acting on such Contributor's behalf. Contributions do not include additions to
|
||||||
|
the Program which: (i) are separate modules of software distributed in
|
||||||
|
conjunction with the Program under their own license agreement, and (ii) are not
|
||||||
|
derivative works of the Program.
|
||||||
|
|
||||||
|
"Contributor" means any person or entity that distributes the Program.
|
||||||
|
|
||||||
|
"Licensed Patents " mean patent claims licensable by a Contributor which are
|
||||||
|
necessarily infringed by the use or sale of its Contribution alone or when
|
||||||
|
combined with the Program.
|
||||||
|
|
||||||
|
"Program" means the Contributions distributed in accordance with this Agreement.
|
||||||
|
|
||||||
|
"Recipient" means anyone who receives the Program under this Agreement,
|
||||||
|
including all Contributors.
|
||||||
|
|
||||||
|
2. GRANT OF RIGHTS
|
||||||
|
|
||||||
|
a) Subject to the terms of this Agreement, each Contributor hereby grants
|
||||||
|
Recipient a non-exclusive, worldwide, royalty-free copyright license to
|
||||||
|
reproduce, prepare derivative works of, publicly display, publicly perform,
|
||||||
|
distribute and sublicense the Contribution of such Contributor, if any, and such
|
||||||
|
derivative works, in source code and object code form.
|
||||||
|
|
||||||
|
b) Subject to the terms of this Agreement, each Contributor hereby grants
|
||||||
|
Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed
|
||||||
|
Patents to make, use, sell, offer to sell, import and otherwise transfer the
|
||||||
|
Contribution of such Contributor, if any, in source code and object code form.
|
||||||
|
This patent license shall apply to the combination of the Contribution and the
|
||||||
|
Program if, at the time the Contribution is added by the Contributor, such
|
||||||
|
addition of the Contribution causes such combination to be covered by the
|
||||||
|
Licensed Patents. The patent license shall not apply to any other combinations
|
||||||
|
which include the Contribution. No hardware per se is licensed hereunder.
|
||||||
|
|
||||||
|
c) Recipient understands that although each Contributor grants the licenses
|
||||||
|
to its Contributions set forth herein, no assurances are provided by any
|
||||||
|
Contributor that the Program does not infringe the patent or other intellectual
|
||||||
|
property rights of any other entity. Each Contributor disclaims any liability to
|
||||||
|
Recipient for claims brought by any other entity based on infringement of
|
||||||
|
intellectual property rights or otherwise. As a condition to exercising the
|
||||||
|
rights and licenses granted hereunder, each Recipient hereby assumes sole
|
||||||
|
responsibility to secure any other intellectual property rights needed, if any.
|
||||||
|
For example, if a third party patent license is required to allow Recipient to
|
||||||
|
distribute the Program, it is Recipient's responsibility to acquire that license
|
||||||
|
before distributing the Program.
|
||||||
|
|
||||||
|
d) Each Contributor represents that to its knowledge it has sufficient
|
||||||
|
copyright rights in its Contribution, if any, to grant the copyright license set
|
||||||
|
forth in this Agreement.
|
||||||
|
|
||||||
|
3. REQUIREMENTS
|
||||||
|
|
||||||
|
A Contributor may choose to distribute the Program in object code form under its
|
||||||
|
own license agreement, provided that:
|
||||||
|
|
||||||
|
a) it complies with the terms and conditions of this Agreement; and
|
||||||
|
|
||||||
|
b) its license agreement:
|
||||||
|
|
||||||
|
i) effectively disclaims on behalf of all Contributors all warranties and
|
||||||
|
conditions, express and implied, including warranties or conditions of title and
|
||||||
|
non-infringement, and implied warranties or conditions of merchantability and
|
||||||
|
fitness for a particular purpose;
|
||||||
|
|
||||||
|
ii) effectively excludes on behalf of all Contributors all liability for
|
||||||
|
damages, including direct, indirect, special, incidental and consequential
|
||||||
|
damages, such as lost profits;
|
||||||
|
|
||||||
|
iii) states that any provisions which differ from this Agreement are offered
|
||||||
|
by that Contributor alone and not by any other party; and
|
||||||
|
|
||||||
|
iv) states that source code for the Program is available from such
|
||||||
|
Contributor, and informs licensees how to obtain it in a reasonable manner on or
|
||||||
|
through a medium customarily used for software exchange.
|
||||||
|
|
||||||
|
When the Program is made available in source code form:
|
||||||
|
|
||||||
|
a) it must be made available under this Agreement; and
|
||||||
|
|
||||||
|
b) a copy of this Agreement must be included with each copy of the Program.
|
||||||
|
|
||||||
|
Contributors may not remove or alter any copyright notices contained within the
|
||||||
|
Program.
|
||||||
|
|
||||||
|
Each Contributor must identify itself as the originator of its Contribution, if
|
||||||
|
any, in a manner that reasonably allows subsequent Recipients to identify the
|
||||||
|
originator of the Contribution.
|
||||||
|
|
||||||
|
4. COMMERCIAL DISTRIBUTION
|
||||||
|
|
||||||
|
Commercial distributors of software may accept certain responsibilities with
|
||||||
|
respect to end users, business partners and the like. While this license is
|
||||||
|
intended to facilitate the commercial use of the Program, the Contributor who
|
||||||
|
includes the Program in a commercial product offering should do so in a manner
|
||||||
|
which does not create potential liability for other Contributors. Therefore, if
|
||||||
|
a Contributor includes the Program in a commercial product offering, such
|
||||||
|
Contributor ("Commercial Contributor") hereby agrees to defend and indemnify
|
||||||
|
every other Contributor ("Indemnified Contributor") against any losses, damages
|
||||||
|
and costs (collectively "Losses") arising from claims, lawsuits and other legal
|
||||||
|
actions brought by a third party against the Indemnified Contributor to the
|
||||||
|
extent caused by the acts or omissions of such Commercial Contributor in
|
||||||
|
connection with its distribution of the Program in a commercial product
|
||||||
|
offering. The obligations in this section do not apply to any claims or Losses
|
||||||
|
relating to any actual or alleged intellectual property infringement. In order
|
||||||
|
to qualify, an Indemnified Contributor must: a) promptly notify the Commercial
|
||||||
|
Contributor in writing of such claim, and b) allow the Commercial Contributor to
|
||||||
|
control, and cooperate with the Commercial Contributor in, the defense and any
|
||||||
|
related settlement negotiations. The Indemnified Contributor may participate in
|
||||||
|
any such claim at its own expense.
|
||||||
|
|
||||||
|
For example, a Contributor might include the Program in a commercial product
|
||||||
|
offering, Product X. That Contributor is then a Commercial Contributor. If that
|
||||||
|
Commercial Contributor then makes performance claims, or offers warranties
|
||||||
|
related to Product X, those performance claims and warranties are such
|
||||||
|
Commercial Contributor's responsibility alone. Under this section, the
|
||||||
|
Commercial Contributor would have to defend claims against the other
|
||||||
|
Contributors related to those performance claims and warranties, and if a court
|
||||||
|
requires any other Contributor to pay any damages as a result, the Commercial
|
||||||
|
Contributor must pay those damages.
|
||||||
|
|
||||||
|
5. NO WARRANTY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN
|
||||||
|
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR
|
||||||
|
IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE,
|
||||||
|
NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each
|
||||||
|
Recipient is solely responsible for determining the appropriateness of using and
|
||||||
|
distributing the Program and assumes all risks associated with its exercise of
|
||||||
|
rights under this Agreement, including but not limited to the risks and costs of
|
||||||
|
program errors, compliance with applicable laws, damage to or loss of data,
|
||||||
|
programs or equipment, and unavailability or interruption of operations.
|
||||||
|
|
||||||
|
6. DISCLAIMER OF LIABILITY
|
||||||
|
|
||||||
|
EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY
|
||||||
|
CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||||
|
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST
|
||||||
|
PROFITS), 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 OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
|
||||||
|
GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
|
||||||
|
|
||||||
|
7. GENERAL
|
||||||
|
|
||||||
|
If any provision of this Agreement is invalid or unenforceable under applicable
|
||||||
|
law, it shall not affect the validity or enforceability of the remainder of the
|
||||||
|
terms of this Agreement, and without further action by the parties hereto, such
|
||||||
|
provision shall be reformed to the minimum extent necessary to make such
|
||||||
|
provision valid and enforceable.
|
||||||
|
|
||||||
|
If Recipient institutes patent litigation against a Contributor with respect to
|
||||||
|
a patent applicable to software (including a cross-claim or counterclaim in a
|
||||||
|
lawsuit), then any patent licenses granted by that Contributor to such Recipient
|
||||||
|
under this Agreement shall terminate as of the date such litigation is filed. In
|
||||||
|
addition, if Recipient institutes patent litigation against any entity
|
||||||
|
(including a cross-claim or counterclaim in a lawsuit) alleging that the Program
|
||||||
|
itself (excluding combinations of the Program with other software or hardware)
|
||||||
|
infringes such Recipient's patent(s), then such Recipient's rights granted under
|
||||||
|
Section 2(b) shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
All Recipient's rights under this Agreement shall terminate if it fails to
|
||||||
|
comply with any of the material terms or conditions of this Agreement and does
|
||||||
|
not cure such failure in a reasonable period of time after becoming aware of
|
||||||
|
such noncompliance. If all Recipient's rights under this Agreement terminate,
|
||||||
|
Recipient agrees to cease use and distribution of the Program as soon as
|
||||||
|
reasonably practicable. However, Recipient's obligations under this Agreement
|
||||||
|
and any licenses granted by Recipient relating to the Program shall continue and
|
||||||
|
survive.
|
||||||
|
|
||||||
|
Everyone is permitted to copy and distribute copies of this Agreement, but in
|
||||||
|
order to avoid inconsistency the Agreement is copyrighted and may only be
|
||||||
|
modified in the following manner. The Agreement Steward reserves the right to
|
||||||
|
publish new versions (including revisions) of this Agreement from time to time.
|
||||||
|
No one other than the Agreement Steward has the right to modify this Agreement.
|
||||||
|
IBM is the initial Agreement Steward. IBM may assign the responsibility to serve
|
||||||
|
as the Agreement Steward to a suitable separate entity. Each new version of the
|
||||||
|
Agreement will be given a distinguishing version number. The Program (including
|
||||||
|
Contributions) may always be distributed subject to the version of the Agreement
|
||||||
|
under which it was received. In addition, after a new version of the Agreement
|
||||||
|
is published, Contributor may elect to distribute the Program (including its
|
||||||
|
Contributions) under the new version. Except as expressly stated in Sections
|
||||||
|
2(a) and 2(b) above, Recipient receives no rights or licenses to the
|
||||||
|
intellectual property of any Contributor under this Agreement, whether
|
||||||
|
expressly, by implication, estoppel or otherwise. All rights in the Program not
|
||||||
|
expressly granted under this Agreement are reserved.
|
||||||
|
|
||||||
|
This Agreement is governed by the laws of the State of New York and the
|
||||||
|
intellectual property laws of the United States of America. No party to this
|
||||||
|
Agreement will bring a legal action under this Agreement more than one year
|
||||||
|
after the cause of action arose. Each party waives its rights to a jury trial in
|
||||||
|
any resulting litigation.
|
28
Extras/software_cache/cache/include/Makefile
vendored
Normal file
28
Extras/software_cache/cache/include/Makefile
vendored
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
# ---------------------------------------------------------------
|
||||||
|
# PLEASE DO NOT MODIFY THIS SECTION
|
||||||
|
# This prolog section is automatically generated.
|
||||||
|
#
|
||||||
|
# (C) Copyright 2001,2006,
|
||||||
|
# International Business Machines Corporation,
|
||||||
|
#
|
||||||
|
# All Rights Reserved.
|
||||||
|
# ---------------------------------------------------------------
|
||||||
|
# PROLOG END TAG zYx
|
||||||
|
|
||||||
|
########################################################################
|
||||||
|
# Common Makefile
|
||||||
|
########################################################################
|
||||||
|
|
||||||
|
INSTALL_DIR = $(SDKINC_spu)/cache
|
||||||
|
|
||||||
|
INSTALL_FILES := api.h \
|
||||||
|
defs.h \
|
||||||
|
dma.h \
|
||||||
|
nway.h \
|
||||||
|
nway-lookup.h \
|
||||||
|
nway-miss.h \
|
||||||
|
nway-opt.h \
|
||||||
|
nway-replace.h \
|
||||||
|
spe_cache.h
|
||||||
|
|
||||||
|
include ../../../../../make.footer
|
32
Extras/software_cache/cache/include/README
vendored
Normal file
32
Extras/software_cache/cache/include/README
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
%% ---------------------------------------------------------------
|
||||||
|
%% PLEASE DO NOT MODIFY THIS SECTION
|
||||||
|
%% This prolog section is automatically generated.
|
||||||
|
%%
|
||||||
|
%% (C) Copyright 2001,2006,
|
||||||
|
%% International Business Machines Corporation,
|
||||||
|
%%
|
||||||
|
%% All Rights Reserved.
|
||||||
|
%% ---------------------------------------------------------------
|
||||||
|
%% PROLOG END TAG zYx
|
||||||
|
This directory contains implementation of software managed cache for
|
||||||
|
SPE. Whenever possible, the cache interfaces are implemented as macros
|
||||||
|
or inline-able functions.
|
||||||
|
|
||||||
|
Depending on compile-time settings, different cache implementations can
|
||||||
|
be selected.
|
||||||
|
|
||||||
|
The include file heirarchy is:
|
||||||
|
|
||||||
|
+ spe_cache.h Top level header.
|
||||||
|
|
|
||||||
|
+ defs.h Common definitions.
|
||||||
|
+ dma.h Initiate DMA transfers.
|
||||||
|
+ nway.h Top level n-way header.
|
||||||
|
|
|
||||||
|
+ nway-lookup.h n-way lookup operations.
|
||||||
|
+ nway-miss.h n-way cache miss handler.
|
||||||
|
+ nway-replace.h n-way cache replace handler.
|
||||||
|
+ nway-opt.h "optimized" n-way interfaces.
|
||||||
|
|
|
||||||
|
+ api.h Basic application interfaces.
|
||||||
|
|
31
Extras/software_cache/cache/include/api.h
vendored
Normal file
31
Extras/software_cache/cache/include/api.h
vendored
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* api.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Simple API for software managed cache on SPEs.
|
||||||
|
* A sophisticated application would not use these,
|
||||||
|
* but rather use the low-level lookup functions.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_API_H__
|
||||||
|
#define __SPE_CACHE_API_H__
|
||||||
|
|
||||||
|
typedef void *spe_cache_entry_t;
|
||||||
|
|
||||||
|
#define spe_cache_rd(ea) _spe_cache_lookup_xfer_wait_(ea, 0, 1)
|
||||||
|
#define spe_cache_tr(ea) _spe_cache_lookup_xfer_(ea, 0, 1)
|
||||||
|
#define spe_cache_lr(ea) _spe_cache_lookup_(ea, 0)
|
||||||
|
|
||||||
|
#define spe_cache_wait(entry) _spe_cache_wait_(entry)
|
||||||
|
|
||||||
|
#endif
|
245
Extras/software_cache/cache/include/cbe_mfc.h
vendored
Normal file
245
Extras/software_cache/cache/include/cbe_mfc.h
vendored
Normal file
@ -0,0 +1,245 @@
|
|||||||
|
/* @(#)17 1.4 src/include/cbe_mfc.h, sw.includes, sdk_pub 10/11/05 16:00:25 */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* (C) Copyright 2001,2005, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* Sony Computer Entertainment Incorporated, */
|
||||||
|
/* Toshiba Corporation. */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
#ifndef _CBEA_MFC_H_
|
||||||
|
#define _CBEA_MFC_H_
|
||||||
|
|
||||||
|
/* This header file contains various definitions related to the Memory Flow
|
||||||
|
* Controller (MFC) portion of the Cell Broadband Engine Architecture (CBEA).
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**************************************/
|
||||||
|
/* MFC DMA Command Opcode Definitions */
|
||||||
|
/**************************************/
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* MFC DMA Command flags which identify classes of operations. */
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Note: These flags may be used in conjunction with the base command types
|
||||||
|
* (i.e. MFC_PUT_CMD, MFC_PUTR_CMD, MFC_GET_CMD, and MFC_SNDSIG_CMD)
|
||||||
|
* to construct the various command permutations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MFC_BARRIER_ENABLE 0x01
|
||||||
|
#define MFC_FENCE_ENABLE 0x02
|
||||||
|
#define MFC_LIST_ENABLE 0x04 /* SPU Only */
|
||||||
|
#define MFC_START_ENABLE 0x08 /* proxy Only */
|
||||||
|
#define MFC_RESULT_ENABLE 0x10
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* MFC DMA Put Commands */
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define MFC_PUT_CMD 0x20
|
||||||
|
#define MFC_PUTS_CMD 0x28 /* proxy Only */
|
||||||
|
#define MFC_PUTR_CMD 0x30
|
||||||
|
#define MFC_PUTF_CMD 0x22
|
||||||
|
#define MFC_PUTB_CMD 0x21
|
||||||
|
#define MFC_PUTFS_CMD 0x2A /* proxy Only */
|
||||||
|
#define MFC_PUTBS_CMD 0x29 /* proxy Only */
|
||||||
|
#define MFC_PUTRF_CMD 0x32
|
||||||
|
#define MFC_PUTRB_CMD 0x31
|
||||||
|
#define MFC_PUTL_CMD 0x24 /* SPU Only */
|
||||||
|
#define MFC_PUTRL_CMD 0x34 /* SPU Only */
|
||||||
|
#define MFC_PUTLF_CMD 0x26 /* SPU Only */
|
||||||
|
#define MFC_PUTLB_CMD 0x25 /* SPU Only */
|
||||||
|
#define MFC_PUTRLF_CMD 0x36 /* SPU Only */
|
||||||
|
#define MFC_PUTRLB_CMD 0x35 /* SPU Only */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* MFC DMA Get Commands */
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define MFC_GET_CMD 0x40
|
||||||
|
#define MFC_GETS_CMD 0x48 /* proxy Only */
|
||||||
|
#define MFC_GETF_CMD 0x42
|
||||||
|
#define MFC_GETB_CMD 0x41
|
||||||
|
#define MFC_GETFS_CMD 0x4A /* proxy Only */
|
||||||
|
#define MFC_GETBS_CMD 0x49 /* proxy Only */
|
||||||
|
#define MFC_GETL_CMD 0x44 /* SPU Only */
|
||||||
|
#define MFC_GETLF_CMD 0x46 /* SPU Only */
|
||||||
|
#define MFC_GETLB_CMD 0x45 /* SPU Only */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* MFC DMA Storage Control Commands */
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Note: These are only supported on implementations with a SL1 cache
|
||||||
|
* They are no-ops on the initial (CBE) implementation.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define MFC_SDCRT_CMD 0x80
|
||||||
|
#define MFC_SDCRTST_CMD 0x81
|
||||||
|
#define MFC_SDCRZ_CMD 0x89
|
||||||
|
#define MFC_SDCRS_CMD 0x8D
|
||||||
|
#define MFC_SDCRF_CMD 0x8F
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* MFC Synchronization Commands */
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define MFC_GETLLAR_CMD 0xD0 /* SPU Only */
|
||||||
|
#define MFC_PUTLLC_CMD 0xB4 /* SPU Only */
|
||||||
|
#define MFC_PUTLLUC_CMD 0xB0 /* SPU Only */
|
||||||
|
#define MFC_PUTQLLUC_CMD 0xB8 /* SPU Only */
|
||||||
|
|
||||||
|
#define MFC_SNDSIG_CMD 0xA0
|
||||||
|
#define MFC_SNDSIGB_CMD 0xA1
|
||||||
|
#define MFC_SNDSIGF_CMD 0xA2
|
||||||
|
#define MFC_BARRIER_CMD 0xC0
|
||||||
|
#define MFC_EIEIO_CMD 0xC8
|
||||||
|
#define MFC_SYNC_CMD 0xCC
|
||||||
|
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions for constructing a 32-bit command word including the transfer
|
||||||
|
* and replacement class id and the command opcode.
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_TCLASS(_tid) ((_tid) << 24)
|
||||||
|
#define MFC_RCLASS(_rid) ((_rid) << 16)
|
||||||
|
|
||||||
|
#define MFC_CMD_WORD(_tid, _rid, _cmd) (MFC_TCLASS(_tid) | MFC_RCLASS(_rid) | (_cmd))
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions for constructing a 64-bit command word including the size, tag,
|
||||||
|
* transfer and replacement class id and the command opcode.
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_SIZE(_size) ((unsigned long long)(_size) << 48)
|
||||||
|
#define MFC_TAG(_tag_id) ((unsigned long long)(_tag_id) << 32)
|
||||||
|
#define MFC_TR_CMD(_trcmd) ((unsigned long long)(_trcmd))
|
||||||
|
|
||||||
|
#define MFC_CMD_DWORD(_size, _tag_id, _trcmd) (MFC_SIZE(_size) | MFC_TAG(_tag_id) | MFC_TR_CMD(_trcmd))
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Mask definitions for obtaining DMA commands and class ids from packed words.
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_CMD_MASK 0x0000FFFF
|
||||||
|
#define MFC_CLASS_MASK 0x000000FF
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* DMA max/min size definitions. */
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_MIN_DMA_SIZE_SHIFT 4 /* 16 bytes */
|
||||||
|
#define MFC_MAX_DMA_SIZE_SHIFT 14 /* 16384 bytes */
|
||||||
|
|
||||||
|
#define MFC_MIN_DMA_SIZE (1 << MFC_MIN_DMA_SIZE_SHIFT)
|
||||||
|
#define MFC_MAX_DMA_SIZE (1 << MFC_MAX_DMA_SIZE_SHIFT)
|
||||||
|
|
||||||
|
#define MFC_MIN_DMA_SIZE_MASK (MFC_MIN_DMA_SIZE - 1)
|
||||||
|
#define MFC_MAX_DMA_SIZE_MASK (MFC_MAX_DMA_SIZE - 1)
|
||||||
|
|
||||||
|
#define MFC_MIN_DMA_LIST_SIZE 0x0008 /* 8 bytes */
|
||||||
|
#define MFC_MAX_DMA_LIST_SIZE 0x4000 /* 16K bytes */
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Mask definition for checking proper address alignment. */
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_ADDR_MATCH_MASK 0xF
|
||||||
|
#define MFC_BEST_ADDR_ALIGNMENT 0x80
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the Proxy DMA Command Status register (DMA_CMDStatus).
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_PROXY_DMA_CMD_ENQUEUE_SUCCESSFUL 0x00
|
||||||
|
#define MFC_PROXY_DMA_CMD_SEQUENCE_ERROR 0x01
|
||||||
|
#define MFC_PROXY_DMA_QUEUE_FULL 0x02
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the DMA Queue Status register (DMA_QStatus). */
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_PROXY_MAX_QUEUE_SPACE 0x08
|
||||||
|
#define MFC_PROXY_DMA_Q_EMPTY 0x80000000
|
||||||
|
#define MFC_PROXY_DMA_Q_FREE_SPACE_MASK 0x0000FFFF
|
||||||
|
|
||||||
|
#define MFC_SPU_MAX_QUEUE_SPACE 0x10
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the Proxy Tag-Group Query-Type register
|
||||||
|
* (Prxy_QueryType).
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_PROXY_DMA_QUERYTYPE_ANY 0x1
|
||||||
|
#define MFC_PROXY_DMA_QUERYTYPE_ALL 0x2
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the Proxy Tag-Group Query-Mask (Prxy_QueryMask)
|
||||||
|
* and PU Tag Status (DMA_TagStatus) registers.
|
||||||
|
*
|
||||||
|
* NOTE: The only use the bottom 5 bits of the tag id value passed to insure
|
||||||
|
* a valid tag id is used.
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
|
||||||
|
#define MFC_TAGID_TO_TAGMASK(tag_id) (1 << (tag_id & 0x1F))
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the Mailbox Status register (SPU_Mbox_Stat) and the
|
||||||
|
* depths of the outbound Mailbox Register (SPU_OutMbox), the outbound
|
||||||
|
* interrupting Mailbox Register (SPU_OutIntrMbox), and the inbound Mailbox
|
||||||
|
* Register (SPU_In_Mbox).
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_SPU_OUT_MBOX_COUNT_STATUS_MASK 0x000000FF
|
||||||
|
#define MFC_SPU_OUT_MBOX_COUNT_STATUS_SHIFT 0x0
|
||||||
|
#define MFC_SPU_IN_MBOX_COUNT_STATUS_MASK 0x0000FF00
|
||||||
|
#define MFC_SPU_IN_MBOX_COUNT_STATUS_SHIFT 0x8
|
||||||
|
#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_MASK 0x00FF0000
|
||||||
|
#define MFC_SPU_OUT_INTR_MBOX_COUNT_STATUS_SHIFT 0x10
|
||||||
|
|
||||||
|
/****************************************************************************/
|
||||||
|
/* Definitions related to the SPC Multi Source Syncronization register
|
||||||
|
* (MFC_MSSync).
|
||||||
|
*/
|
||||||
|
/****************************************************************************/
|
||||||
|
#define MFC_SPC_MSS_STATUS_MASK 0x1
|
||||||
|
#define MFC_SPC_MSS_COMPLETE 0x0
|
||||||
|
#define MFC_SPC_MSS_NOT_COMPLETE 0x1
|
||||||
|
|
||||||
|
|
||||||
|
/*******************************************
|
||||||
|
* Channel Defines
|
||||||
|
*******************************************/
|
||||||
|
|
||||||
|
/* Events Defines for channels:
|
||||||
|
* 0 (SPU_RdEventStat),
|
||||||
|
* 1 (SPU_WrEventMask), and
|
||||||
|
* 2 (SPU_WrEventAck).
|
||||||
|
*/
|
||||||
|
#define MFC_TAG_STATUS_UPDATE_EVENT 0x00000001
|
||||||
|
#define MFC_LIST_STALL_NOTIFY_EVENT 0x00000002
|
||||||
|
#define MFC_COMMAND_QUEUE_AVAILABLE_EVENT 0x00000008
|
||||||
|
#define MFC_IN_MBOX_AVAILABLE_EVENT 0x00000010
|
||||||
|
#define MFC_DECREMENTER_EVENT 0x00000020
|
||||||
|
#define MFC_OUT_INTR_MBOX_AVAILABLE_EVENT 0x00000040
|
||||||
|
#define MFC_OUT_MBOX_AVAILABLE_EVENT 0x00000080
|
||||||
|
#define MFC_SIGNAL_NOTIFY_2_EVENT 0x00000100
|
||||||
|
#define MFC_SIGNAL_NOTIFY_1_EVENT 0x00000200
|
||||||
|
#define MFC_LLR_LOST_EVENT 0x00000400
|
||||||
|
#define MFC_PRIV_ATTN_EVENT 0x00000800
|
||||||
|
#define MFC_MULTI_SRC_SYNC_EVENT 0x00001000
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/* Tag Status Update defines for channel 23 (MFC_WrTagUpdate)
|
||||||
|
*/
|
||||||
|
#define MFC_TAG_UPDATE_IMMEDIATE 0x0
|
||||||
|
#define MFC_TAG_UPDATE_ANY 0x1
|
||||||
|
#define MFC_TAG_UPDATE_ALL 0x2
|
||||||
|
|
||||||
|
/* Atomic Command Status defines for channel 27 (MFC_RdAtomicStat)
|
||||||
|
*/
|
||||||
|
#define MFC_PUTLLC_STATUS 0x00000001
|
||||||
|
#define MFC_PUTLLUC_STATUS 0x00000002
|
||||||
|
#define MFC_GETLLAR_STATUS 0x00000004
|
||||||
|
|
||||||
|
#endif /* _CBEA_MFC_H_ */
|
149
Extras/software_cache/cache/include/defs.h
vendored
Normal file
149
Extras/software_cache/cache/include/defs.h
vendored
Normal file
@ -0,0 +1,149 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* spe_cache_defs.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Internal definitions for software managed cache.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_DEFS_H__
|
||||||
|
#define __SPE_CACHE_DEFS_H__
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Defn's for number of cache sets.
|
||||||
|
** Default is 64 sets.
|
||||||
|
*/
|
||||||
|
#if (SPE_CACHE_NSETS==1024)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 10
|
||||||
|
#elif (SPE_CACHE_NSETS==512)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 9
|
||||||
|
#elif (SPE_CACHE_NSETS==256)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 8
|
||||||
|
#elif (SPE_CACHE_NSETS==128)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 7
|
||||||
|
#elif (SPE_CACHE_NSETS==64)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 6
|
||||||
|
#elif (SPE_CACHE_NSETS==32)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 5
|
||||||
|
#elif (SPE_CACHE_NSETS==16)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 4
|
||||||
|
#elif (SPE_CACHE_NSETS==8)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 3
|
||||||
|
#elif (SPE_CACHE_NSETS==4)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 2
|
||||||
|
#elif (SPE_CACHE_NSETS==2)
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 1
|
||||||
|
#else
|
||||||
|
#undef SPE_CACHE_NSETS
|
||||||
|
#define SPE_CACHE_NSETS 64
|
||||||
|
#define SPE_CACHE_NSETS_SHIFT 6
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Defn's for cachline size (bytes).
|
||||||
|
** Default is 128 bytes.
|
||||||
|
*/
|
||||||
|
#if (SPE_CACHELINE_SIZE==512)
|
||||||
|
#define SPE_CACHELINE_SHIFT 9
|
||||||
|
#elif (SPE_CACHELINE_SIZE==256)
|
||||||
|
#define SPE_CACHELINE_SHIFT 8
|
||||||
|
#elif (SPE_CACHELINE_SIZE==128)
|
||||||
|
#define SPE_CACHELINE_SHIFT 7
|
||||||
|
#elif (SPE_CACHELINE_SIZE==64)
|
||||||
|
#define SPE_CACHELINE_SHIFT 6
|
||||||
|
#elif (SPE_CACHELINE_SIZE==32)
|
||||||
|
#define SPE_CACHELINE_SHIFT 5
|
||||||
|
#else
|
||||||
|
#undef SPE_CACHELINE_SIZE
|
||||||
|
#define SPE_CACHELINE_SIZE 128
|
||||||
|
#define SPE_CACHELINE_SHIFT 7
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Defn's derived from above settings.
|
||||||
|
*/
|
||||||
|
#define SPE_CACHE_NSETS_MASK (SPE_CACHE_NSETS - 1)
|
||||||
|
#define SPE_CACHELINE_MASK (SPE_CACHELINE_SIZE - 1)
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Defn's for managing cacheline state.
|
||||||
|
*/
|
||||||
|
#define SPE_CACHELINE_DIRTY 0x1
|
||||||
|
#define SPE_CACHELINE_LOCKED 0x2
|
||||||
|
#define SPE_CACHELINE_STATE_MASK (SPE_CACHELINE_DIRTY | SPE_CACHELINE_LOCKED)
|
||||||
|
|
||||||
|
#ifdef _XLC
|
||||||
|
/**
|
||||||
|
* FIXME: For now disable manual branch hints
|
||||||
|
* on XLC due to performance degradation.
|
||||||
|
*/
|
||||||
|
#ifndef likely
|
||||||
|
#define likely(_c) (_c)
|
||||||
|
#define unlikely(_c) (_c)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#else /* !_XLC */
|
||||||
|
|
||||||
|
#ifndef likely
|
||||||
|
#define likely(_c) __builtin_expect((_c), 1)
|
||||||
|
#define unlikely(_c) __builtin_expect((_c), 0)
|
||||||
|
#endif
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Debug controls. Set -DNDEBUG to
|
||||||
|
** disable both panic and assert.
|
||||||
|
*/
|
||||||
|
#include <assert.h>
|
||||||
|
#define _spe_cache_panic_(c) assert(c)
|
||||||
|
#ifdef SPE_CACHE_DBG
|
||||||
|
#define _spe_cache_assert_(c) assert(c)
|
||||||
|
#else
|
||||||
|
#define _spe_cache_assert_(c) /* No-op. */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define _spe_cacheline_byte_offset_(ea) \
|
||||||
|
((ea) & SPE_CACHELINE_MASK)
|
||||||
|
|
||||||
|
#define _spe_cacheline_byte_offset_x4(ea) \
|
||||||
|
spu_and ((ea), SPE_CACHELINE_MASK)
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
static __inline vector unsigned int _load_vec_uint4(unsigned int ui1, unsigned int ui2, unsigned int ui3, unsigned int ui4)
|
||||||
|
{
|
||||||
|
vector unsigned int result;
|
||||||
|
vector unsigned int iv1, iv2, iv3, iv4;
|
||||||
|
|
||||||
|
vector unsigned char shuffle = VEC_LITERAL(vector unsigned char,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
|
||||||
|
iv1 = spu_promote(ui1, 0);
|
||||||
|
iv2 = spu_promote(ui2, 0);
|
||||||
|
iv3 = spu_promote(ui3, 0);
|
||||||
|
iv4 = spu_promote(ui4, 0);
|
||||||
|
|
||||||
|
result = spu_or(spu_shuffle(iv1, iv2, shuffle), spu_shuffle(iv3, iv4, spu_rlqwbyte(shuffle, 8)));
|
||||||
|
return (result);
|
||||||
|
}
|
||||||
|
|
||||||
|
static __inline vector unsigned int _pack_vec_uint4(vector unsigned int ui1, vector unsigned int ui2, vector unsigned int ui3, vector unsigned int ui4)
|
||||||
|
{
|
||||||
|
vector unsigned int result;
|
||||||
|
vector unsigned char shuffle = VEC_LITERAL(vector unsigned char,
|
||||||
|
0x00, 0x01, 0x02, 0x03, 0x10, 0x11, 0x12, 0x13,
|
||||||
|
0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80, 0x80);
|
||||||
|
|
||||||
|
result = spu_or(spu_shuffle(ui1, ui2, shuffle), spu_shuffle(ui3, ui4, spu_rlqwbyte(shuffle, 8)));
|
||||||
|
return (result);
|
||||||
|
}
|
40
Extras/software_cache/cache/include/dma.h
vendored
Normal file
40
Extras/software_cache/cache/include/dma.h
vendored
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* dma.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Internal DMA utilities for software
|
||||||
|
* managed cache.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_DMA_H__
|
||||||
|
#define __SPE_CACHE_DMA_H__
|
||||||
|
|
||||||
|
#define SPE_CACHE_TAGID_SHIFT (SPE_CACHELINE_SHIFT + SPE_CACHE_NWAY_SHIFT)
|
||||||
|
|
||||||
|
#define _SPE_CACHELINE_TAGID(_ptr) (16)
|
||||||
|
#define _SPE_CACHELINE_TAGMASK(_ptr) (1 << 16)
|
||||||
|
|
||||||
|
#define SPE_CACHELINE_TAGID(_line) \
|
||||||
|
_SPE_CACHELINE_TAGID(&spe_cache_mem[_line])
|
||||||
|
#define SPE_CACHELINE_TAGMASK(_line) \
|
||||||
|
_SPE_CACHELINE_TAGMASK(&spe_cache_mem[_line])
|
||||||
|
|
||||||
|
#ifndef SPE_CACHE_SET_TAGID
|
||||||
|
#define SPE_CACHE_SET_TAGID(set) ((set) & 0x1f)
|
||||||
|
#endif
|
||||||
|
#define SPE_CACHE_SET_TAGMASK(set) (1 << SPE_CACHE_SET_TAGID(set))
|
||||||
|
|
||||||
|
#define SPE_CACHE_PUT MFC_PUTF_CMD
|
||||||
|
#define SPE_CACHE_GET MFC_GET_CMD
|
||||||
|
|
||||||
|
#endif
|
35
Extras/software_cache/cache/include/ilog2.h
vendored
Normal file
35
Extras/software_cache/cache/include/ilog2.h
vendored
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
/* @(#)12 1.5 src/lib/math/ilog2.h, sw.lib, sdk_pub 10/11/05 15:35:56 */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* (C) Copyright 2001,2005, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* Sony Computer Entertainment Incorporated, */
|
||||||
|
/* Toshiba Corporation. */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
#ifndef _ILOG2_H_
|
||||||
|
#define _ILOG2_H_ 1
|
||||||
|
|
||||||
|
/*
|
||||||
|
* FUNCTION
|
||||||
|
* signed int _ilog2(signed int x)
|
||||||
|
*
|
||||||
|
* DESCRIPTION
|
||||||
|
* _ilog2 computes ceiling of log (base 2) of the input value x.
|
||||||
|
* The input value, x, must be a non-zero positive value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static __inline signed int _ilog2(signed int x)
|
||||||
|
{
|
||||||
|
#ifdef __SPU__
|
||||||
|
return (32 - spu_extract(spu_cntlz(spu_promote(x - 1, 0)), 0));
|
||||||
|
#else
|
||||||
|
signed int result;
|
||||||
|
|
||||||
|
for (result=0, x--; x > 0; result++, x>>=1);
|
||||||
|
return (result);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif /* _ILOG2_H_ */
|
68
Extras/software_cache/cache/include/memset.h
vendored
Normal file
68
Extras/software_cache/cache/include/memset.h
vendored
Normal file
@ -0,0 +1,68 @@
|
|||||||
|
/* @(#)85 1.4 src/lib/c/memset.h, sw.lib, sdk_pub 10/13/05 10:17:09 */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* (C) Copyright 2001,2005, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* Sony Computer Entertainment Incorporated, */
|
||||||
|
/* Toshiba Corporation. */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
#include <spu_intrinsics.h>
|
||||||
|
#include <stddef.h>
|
||||||
|
|
||||||
|
/* Fills the first n bytes of the memory area pointed to by s
|
||||||
|
* with the constant byte c. Returns a pointer to the memory area s.
|
||||||
|
*/
|
||||||
|
static __inline void * _memset(void *s, int c, size_t n)
|
||||||
|
{
|
||||||
|
int skip, cnt, i;
|
||||||
|
vec_uchar16 *vs;
|
||||||
|
vec_uchar16 vc, mask;
|
||||||
|
|
||||||
|
vs = (vec_uchar16 *)(s);
|
||||||
|
vc = spu_splats((unsigned char)c);
|
||||||
|
cnt = (int)(n);
|
||||||
|
|
||||||
|
/* Handle any leading partial quadwords as well a
|
||||||
|
* very short settings (ie, such that the n characters
|
||||||
|
* all reside in a single quadword.
|
||||||
|
*/
|
||||||
|
skip = (int)(s) & 15;
|
||||||
|
if (skip) {
|
||||||
|
mask = spu_rlmaskqwbyte((vec_uchar16)(-1), 0-skip);
|
||||||
|
cnt -= 16 - skip;
|
||||||
|
if (cnt < 0) {
|
||||||
|
mask = spu_and(mask, spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(-cnt)));
|
||||||
|
}
|
||||||
|
*vs = spu_sel(*vs, vc, mask);
|
||||||
|
vs++;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Handle 8 quadwords at a time
|
||||||
|
*/
|
||||||
|
for (i=127; i<cnt; cnt-=8*16) {
|
||||||
|
vs[0] = vc;
|
||||||
|
vs[1] = vc;
|
||||||
|
vs[2] = vc;
|
||||||
|
vs[3] = vc;
|
||||||
|
vs[4] = vc;
|
||||||
|
vs[5] = vc;
|
||||||
|
vs[6] = vc;
|
||||||
|
vs[7] = vc;
|
||||||
|
vs += 8;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Finish all remaining complete quadwords
|
||||||
|
*/
|
||||||
|
for (i=15; i<cnt; cnt-=16) *vs++ = vc;
|
||||||
|
|
||||||
|
/* Handle any trailing partial quadwords
|
||||||
|
*/
|
||||||
|
if (cnt > 0) {
|
||||||
|
mask = spu_slqwbyte((vec_uchar16)(-1), (unsigned int)(16-cnt));
|
||||||
|
*vs = spu_sel(*vs, vc, mask);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (s);
|
||||||
|
}
|
194
Extras/software_cache/cache/include/nway-lookup.h
vendored
Normal file
194
Extras/software_cache/cache/include/nway-lookup.h
vendored
Normal file
@ -0,0 +1,194 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* nway-lookup.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Internal lookup operations for software
|
||||||
|
* managed cache.
|
||||||
|
*
|
||||||
|
* See nway-opt.h for "optimized" nway
|
||||||
|
* lookup operations.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_NWAY_LOOKUP_H_
|
||||||
|
#define __SPE_CACHE_NWAY_LOOKUP_H_
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _decl_set_entries_
|
||||||
|
* Load up set entries (by 4) from an n-way
|
||||||
|
* set associative cache. Mask off the dirty
|
||||||
|
* bit, as needed.
|
||||||
|
*/
|
||||||
|
#define _decl_set_entries_(set, name, index) \
|
||||||
|
vec_uint4 name = *((vec_uint4 *) &spe_cache_dir[set][index])
|
||||||
|
|
||||||
|
|
||||||
|
#define _spe_cache_4_way_lookup_(set, ea) \
|
||||||
|
({ \
|
||||||
|
_decl_set_entries_(set, e0123, 0); \
|
||||||
|
spu_gather(spu_cmpeq(e0123, ea)); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_set_lookup_
|
||||||
|
* Compare 'ea' against all entries of
|
||||||
|
* a set, and return a result that is
|
||||||
|
* consistent with spu_gather().
|
||||||
|
*/
|
||||||
|
#define _spe_cache_set_lookup_(set, ea) \
|
||||||
|
_spe_cache_4_way_lookup_(set, ea)
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_nway_lookup_x4_
|
||||||
|
* Declare local variables and lookup four addresses
|
||||||
|
* in the n-way set associative cache. Upon return,
|
||||||
|
* 'idx_x4' contains the matching elements in the sets,
|
||||||
|
* or -1 if not found.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_nway_lookup_x4(ea_x4, set_x4, idx_x4) \
|
||||||
|
({ \
|
||||||
|
vector unsigned int ea_aligned_x4 = spu_and ((ea_x4), ~SPE_CACHELINE_MASK); \
|
||||||
|
vector unsigned char splat0 = VEC_LITERAL(vector unsigned char, \
|
||||||
|
0x00, 0x01, 0x02, 0x03, \
|
||||||
|
0x00, 0x01, 0x02, 0x03, \
|
||||||
|
0x00, 0x01, 0x02, 0x03, \
|
||||||
|
0x00, 0x01, 0x02, 0x03); \
|
||||||
|
vector unsigned char splat1 = VEC_LITERAL(vector unsigned char, \
|
||||||
|
0x04, 0x05, 0x06, 0x07, \
|
||||||
|
0x04, 0x05, 0x06, 0x07, \
|
||||||
|
0x04, 0x05, 0x06, 0x07, \
|
||||||
|
0x04, 0x05, 0x06, 0x07); \
|
||||||
|
vector unsigned char splat2 = VEC_LITERAL(vector unsigned char, \
|
||||||
|
0x08, 0x09, 0x0a, 0x0b, \
|
||||||
|
0x08, 0x09, 0x0a, 0x0b, \
|
||||||
|
0x08, 0x09, 0x0a, 0x0b, \
|
||||||
|
0x08, 0x09, 0x0a, 0x0b); \
|
||||||
|
vector unsigned char splat3 = VEC_LITERAL(vector unsigned char, \
|
||||||
|
0x0c, 0x0d, 0x0e, 0x0f, \
|
||||||
|
0x0c, 0x0d, 0x0e, 0x0f, \
|
||||||
|
0x0c, 0x0d, 0x0e, 0x0f, \
|
||||||
|
0x0c, 0x0d, 0x0e, 0x0f); \
|
||||||
|
vec_uint4 ea_aligned0 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat0); \
|
||||||
|
vec_uint4 ea_aligned1 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat1); \
|
||||||
|
vec_uint4 ea_aligned2 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat2); \
|
||||||
|
vec_uint4 ea_aligned3 = spu_shuffle(ea_aligned_x4, ea_aligned_x4, splat3); \
|
||||||
|
vec_uint4 found0, found1, found2, found3; \
|
||||||
|
vec_uint4 found_x4; \
|
||||||
|
(set_x4) = _spe_cache_set_num_x4(ea_x4); \
|
||||||
|
found0 = _spe_cache_set_lookup_(spu_extract (set_x4, 0), ea_aligned0); \
|
||||||
|
found1 = _spe_cache_set_lookup_(spu_extract (set_x4, 1), ea_aligned1); \
|
||||||
|
found2 = _spe_cache_set_lookup_(spu_extract (set_x4, 2), ea_aligned2); \
|
||||||
|
found3 = _spe_cache_set_lookup_(spu_extract (set_x4, 3), ea_aligned3); \
|
||||||
|
found_x4 = _pack_vec_uint4 (found0, found1, found2, found3); \
|
||||||
|
(idx_x4) = (vector signed int)_spe_cache_idx_num_x4(found_x4); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define _spe_cache_nway_lookup_(ea, set, idx) \
|
||||||
|
({ \
|
||||||
|
unsigned int ea_aligned = (ea) & ~SPE_CACHELINE_MASK; \
|
||||||
|
vec_uint4 ea_aligned4 = spu_splats(ea_aligned); \
|
||||||
|
vec_uint4 found; \
|
||||||
|
(set) = _spe_cache_set_num_(ea); \
|
||||||
|
found = _spe_cache_set_lookup_(set, ea_aligned4); \
|
||||||
|
(idx) = _spe_cache_idx_num_(found); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_lookup_
|
||||||
|
* Lookup and return the LSA of an EA
|
||||||
|
* that is known to be in the cache.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_lookup_(ea, is_write) \
|
||||||
|
({ \
|
||||||
|
int set, idx, line, byte; \
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx); \
|
||||||
|
\
|
||||||
|
line = _spe_cacheline_num_(set, idx); \
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea); \
|
||||||
|
(void *) &spe_cache_mem[line + byte]; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_wait_
|
||||||
|
* Wait for transfer of a cache line
|
||||||
|
* to complete.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_wait_(_lsa) \
|
||||||
|
({ \
|
||||||
|
spu_writech(22, _SPE_CACHELINE_TAGMASK(_lsa)); \
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL); \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_lookup_wait_
|
||||||
|
* Lookup and return the LSA of an EA
|
||||||
|
* that is known to be in the cache,
|
||||||
|
* and guarantee that its transfer is
|
||||||
|
* complete.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_lookup_wait_(ea, is_write) \
|
||||||
|
({ \
|
||||||
|
int set, idx, line, byte; \
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx); \
|
||||||
|
\
|
||||||
|
line = _spe_cacheline_num_(set, idx); \
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea); \
|
||||||
|
spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL); \
|
||||||
|
(void *) &spe_cache_mem[line + byte]; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_lookup_xfer_
|
||||||
|
* Lookup and return the LSA of an EA, where
|
||||||
|
* the line may either be in the cache or not.
|
||||||
|
* If not, initiate transfer but do not wait
|
||||||
|
* for completion.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_lookup_xfer_(ea, is_write, rb) \
|
||||||
|
({ \
|
||||||
|
int set, idx, line, byte; \
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx); \
|
||||||
|
\
|
||||||
|
if (unlikely(idx < 0)) { \
|
||||||
|
idx = _spe_cache_miss_(ea, set, -1); \
|
||||||
|
} \
|
||||||
|
line = _spe_cacheline_num_(set, idx); \
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea); \
|
||||||
|
(void *) &spe_cache_mem[line + byte]; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* _spe_cache_lookup_xfer_wait_
|
||||||
|
* Lookup and return the LSA of an EA, where
|
||||||
|
* the line may either be in the cache or not.
|
||||||
|
* If not, initiate transfer and guarantee
|
||||||
|
* completion.
|
||||||
|
*/
|
||||||
|
#define _spe_cache_lookup_xfer_wait_(ea, is_write, rb) \
|
||||||
|
({ \
|
||||||
|
int set, idx, line, byte; \
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx); \
|
||||||
|
\
|
||||||
|
if (unlikely(idx < 0)) { \
|
||||||
|
idx = _spe_cache_miss_(ea, set, -1); \
|
||||||
|
spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL); \
|
||||||
|
} \
|
||||||
|
line = _spe_cacheline_num_(set, idx); \
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea); \
|
||||||
|
(void *) &spe_cache_mem[line + byte]; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#endif
|
51
Extras/software_cache/cache/include/nway-miss.h
vendored
Normal file
51
Extras/software_cache/cache/include/nway-miss.h
vendored
Normal file
@ -0,0 +1,51 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* nway-miss.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Internal handler for cache misses.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_NWAY_MISS_H__
|
||||||
|
#define __SPE_CACHE_NWAY_MISS_H__
|
||||||
|
|
||||||
|
static int _spe_cache_miss_(unsigned int ea, int set, int avail)
|
||||||
|
{
|
||||||
|
unsigned int ea_aligned = ea & ~SPE_CACHELINE_MASK;
|
||||||
|
vec_uint4 slot;
|
||||||
|
vec_uint4 exists = _spe_cache_set_lookup_(set, ea_aligned);
|
||||||
|
int idx, line;
|
||||||
|
|
||||||
|
/* Double check to make sure that the entry has not
|
||||||
|
* already been allocated in this set. This condition
|
||||||
|
* might occur if multiple lookups are being perfomed
|
||||||
|
* simultaneously.
|
||||||
|
*/
|
||||||
|
if (unlikely(spu_extract(exists, 0) != 0)) {
|
||||||
|
return _spe_cache_idx_num_(exists);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Now check to see if there are empty slots
|
||||||
|
* that are available in the set.
|
||||||
|
*/
|
||||||
|
slot = _spe_cache_replace_(set, avail);
|
||||||
|
idx = _spe_cache_idx_num_(slot);
|
||||||
|
line = _spe_cacheline_num_(set, idx);
|
||||||
|
|
||||||
|
spu_mfcdma32(&spe_cache_mem[line], ea_aligned, SPE_CACHELINE_SIZE,
|
||||||
|
SPE_CACHE_SET_TAGID(set), SPE_CACHE_GET);
|
||||||
|
|
||||||
|
spe_cache_dir[set][SPE_CACHE_NWAY_MASK - idx] = ea_aligned;
|
||||||
|
|
||||||
|
return idx;
|
||||||
|
}
|
||||||
|
#endif
|
153
Extras/software_cache/cache/include/nway-opt.h
vendored
Normal file
153
Extras/software_cache/cache/include/nway-opt.h
vendored
Normal file
@ -0,0 +1,153 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* nway-opt.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2006 IBM Corp.
|
||||||
|
*
|
||||||
|
* "Optimized" lookup operations for n-way set associative
|
||||||
|
* software managed cache.
|
||||||
|
*/
|
||||||
|
#include <spu_intrinsics.h>
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_NWAY_OPT_H_
|
||||||
|
#define __SPE_CACHE_NWAY_OPT_H_
|
||||||
|
|
||||||
|
/* __spe_cache_rd
|
||||||
|
* Look up and return data from the cache. If the data
|
||||||
|
* is not currently in cache then transfer it from main
|
||||||
|
* storage.
|
||||||
|
*
|
||||||
|
* This code uses a conditional branch to the cache miss
|
||||||
|
* handler in the event that the requested data is not
|
||||||
|
* in the cache. A branch hint is used to avoid paying
|
||||||
|
* the branch stall penalty.
|
||||||
|
*/
|
||||||
|
#define __spe_cache_rd(type, ea) \
|
||||||
|
({ \
|
||||||
|
int set, idx, lnum, byte; \
|
||||||
|
type ret; \
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx); \
|
||||||
|
if (unlikely(idx < 0)) { \
|
||||||
|
idx = _spe_cache_miss_(ea, set, -1); \
|
||||||
|
spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL); \
|
||||||
|
} \
|
||||||
|
lnum = _spe_cacheline_num_(set, idx); \
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea); \
|
||||||
|
ret = *((type *) (&spe_cache_mem[lnum + byte])); \
|
||||||
|
ret; \
|
||||||
|
})
|
||||||
|
|
||||||
|
/**
|
||||||
|
* __spe_cache_rd_x4
|
||||||
|
* Fetch four data elements from the cache.
|
||||||
|
*
|
||||||
|
* This code uses one conditional branch in
|
||||||
|
* the event that any of the four elements
|
||||||
|
* are missing.
|
||||||
|
*
|
||||||
|
* On a miss, light weight locking is used to
|
||||||
|
* avoid casting out entries that were found.
|
||||||
|
* Further, we wait just once for the transfers,
|
||||||
|
* allowing for parallel [rather than serial]
|
||||||
|
* transfers.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define __spe_cache_rd_x4(type, ea_x4) \
|
||||||
|
({ \
|
||||||
|
vector unsigned int missing; \
|
||||||
|
unsigned int ms; \
|
||||||
|
vector unsigned int cindex; \
|
||||||
|
unsigned int d0, d1, d2, d3; \
|
||||||
|
vector unsigned int s_x4; \
|
||||||
|
vector signed int i_x4; \
|
||||||
|
vector unsigned int ibyte, iline; \
|
||||||
|
vector unsigned int ret; \
|
||||||
|
unsigned int idx0, idx1, idx2, idx3; \
|
||||||
|
\
|
||||||
|
_spe_cache_nway_lookup_x4(ea_x4, s_x4, i_x4); \
|
||||||
|
missing = spu_rlmask ((vector unsigned int)i_x4, -8); \
|
||||||
|
ms = spu_extract (spu_gather (missing), 0); \
|
||||||
|
\
|
||||||
|
ibyte = _spe_cacheline_byte_offset_x4(ea_x4); \
|
||||||
|
\
|
||||||
|
iline = _spe_cacheline_num_x4(s_x4, \
|
||||||
|
(vector unsigned int)i_x4); \
|
||||||
|
\
|
||||||
|
cindex = spu_add (iline, ibyte); \
|
||||||
|
\
|
||||||
|
idx0 = spu_extract (cindex, 0); \
|
||||||
|
idx1 = spu_extract (cindex, 1); \
|
||||||
|
idx2 = spu_extract (cindex, 2); \
|
||||||
|
idx3 = spu_extract (cindex, 3); \
|
||||||
|
\
|
||||||
|
d0 = *((type *) (&spe_cache_mem[idx0])); \
|
||||||
|
d1 = *((type *) (&spe_cache_mem[idx1])); \
|
||||||
|
d2 = *((type *) (&spe_cache_mem[idx2])); \
|
||||||
|
d3 = *((type *) (&spe_cache_mem[idx3])); \
|
||||||
|
\
|
||||||
|
ret = _load_vec_uint4 (d0, d1, d2, d3); \
|
||||||
|
\
|
||||||
|
if (unlikely(ms)) { \
|
||||||
|
int b0 = spu_extract (ibyte, 0); \
|
||||||
|
int b1 = spu_extract (ibyte, 1); \
|
||||||
|
int b2 = spu_extract (ibyte, 2); \
|
||||||
|
int b3 = spu_extract (ibyte, 3); \
|
||||||
|
int lnum0; \
|
||||||
|
int lnum1; \
|
||||||
|
int lnum2; \
|
||||||
|
int lnum3; \
|
||||||
|
int s0 = spu_extract (s_x4, 0); \
|
||||||
|
int s1 = spu_extract (s_x4, 1); \
|
||||||
|
int s2 = spu_extract (s_x4, 2); \
|
||||||
|
int s3 = spu_extract (s_x4, 3); \
|
||||||
|
int i0 = spu_extract (i_x4, 0); \
|
||||||
|
int i1 = spu_extract (i_x4, 1); \
|
||||||
|
int i2 = spu_extract (i_x4, 2); \
|
||||||
|
int i3 = spu_extract (i_x4, 3); \
|
||||||
|
unsigned int ea0 = spu_extract(ea_x4, 0); \
|
||||||
|
unsigned int ea1 = spu_extract(ea_x4, 1); \
|
||||||
|
unsigned int ea2 = spu_extract(ea_x4, 2); \
|
||||||
|
unsigned int ea3 = spu_extract(ea_x4, 3); \
|
||||||
|
int avail = -1; \
|
||||||
|
\
|
||||||
|
avail &= ~(((i0 < 0) ? 0 : (1 << i0)) | \
|
||||||
|
((i1 < 0) ? 0 : (1 << i1)) | \
|
||||||
|
((i2 < 0) ? 0 : (1 << i2)) | \
|
||||||
|
((i3 < 0) ? 0 : (1 << i3))); \
|
||||||
|
\
|
||||||
|
i0 = _spe_cache_miss_(ea0, s0, avail); \
|
||||||
|
avail &= ~(1 << i0); \
|
||||||
|
i1 = _spe_cache_miss_(ea1, s1, avail); \
|
||||||
|
avail &= ~(1 << i1); \
|
||||||
|
i2 = _spe_cache_miss_(ea2, s2, avail); \
|
||||||
|
avail &= ~(1 << i2); \
|
||||||
|
i3 = _spe_cache_miss_(ea3, s3, avail); \
|
||||||
|
\
|
||||||
|
lnum0 = _spe_cacheline_num_(s0, i0); \
|
||||||
|
lnum1 = _spe_cacheline_num_(s1, i1); \
|
||||||
|
lnum2 = _spe_cacheline_num_(s2, i2); \
|
||||||
|
lnum3 = _spe_cacheline_num_(s3, i3); \
|
||||||
|
\
|
||||||
|
spu_writech(22, SPE_CACHE_SET_TAGMASK(set)); \
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL); \
|
||||||
|
\
|
||||||
|
d0 = *((type *) (&spe_cache_mem[lnum0 + b0])); \
|
||||||
|
d1 = *((type *) (&spe_cache_mem[lnum1 + b1])); \
|
||||||
|
d2 = *((type *) (&spe_cache_mem[lnum2 + b2])); \
|
||||||
|
d3 = *((type *) (&spe_cache_mem[lnum3 + b3])); \
|
||||||
|
\
|
||||||
|
ret = _load_vec_uint4 (d0, d1, d2, d3); \
|
||||||
|
} \
|
||||||
|
ret; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#endif /* _SPE_CACHE_NWAY_OPT_H_ */
|
38
Extras/software_cache/cache/include/nway-replace.h
vendored
Normal file
38
Extras/software_cache/cache/include/nway-replace.h
vendored
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* nway-replace.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Implement replacement for software
|
||||||
|
* managed cache.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_NWAY_REPLACE_H_
|
||||||
|
#define __SPE_CACHE_NWAY_REPLACE_H_
|
||||||
|
|
||||||
|
static vec_uint4 spe_cache_replace_cntr[SPE_CACHE_NSETS+1];
|
||||||
|
|
||||||
|
static inline vec_uint4 _spe_cache_replace_(int set, int avail)
|
||||||
|
{
|
||||||
|
unsigned int mask = ((1 << SPE_CACHE_NWAY) - 1) & avail;
|
||||||
|
unsigned int curr, currbit, next;
|
||||||
|
|
||||||
|
curr = spu_extract(spe_cache_replace_cntr[set], 0) & SPE_CACHE_NWAY_MASK;
|
||||||
|
currbit = (1 << curr);
|
||||||
|
next = (curr + 1) & SPE_CACHE_NWAY_MASK;
|
||||||
|
spe_cache_replace_cntr[set] = (vec_uint4) spu_promote(next, 0);
|
||||||
|
mask = (mask & currbit) ? currbit : mask;
|
||||||
|
|
||||||
|
return (vec_uint4) spu_promote(mask, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
105
Extras/software_cache/cache/include/nway.h
vendored
Normal file
105
Extras/software_cache/cache/include/nway.h
vendored
Normal file
@ -0,0 +1,105 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* nway.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Support for n-way set associative software
|
||||||
|
* managed cache. The 4-way associative cache
|
||||||
|
* is the only interface exposed currently.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_NWAY_H_
|
||||||
|
#define __SPE_CACHE_NWAY_H_
|
||||||
|
|
||||||
|
/**
|
||||||
|
** Defn's for n-way set associativity.
|
||||||
|
** Default is 4-way.
|
||||||
|
*/
|
||||||
|
#define SPE_CACHE_NWAY 4
|
||||||
|
#define SPE_CACHE_NWAY_SHIFT 2
|
||||||
|
|
||||||
|
#define SPE_CACHE_NWAY_MASK (SPE_CACHE_NWAY - 1)
|
||||||
|
#define SPE_CACHE_NENTRIES (SPE_CACHE_NWAY * SPE_CACHE_NSETS)
|
||||||
|
#define SPE_CACHE_MEM_SIZE (SPE_CACHE_NENTRIES * SPE_CACHELINE_SIZE)
|
||||||
|
|
||||||
|
#define _spe_cache_set_num_(ea) \
|
||||||
|
({ \
|
||||||
|
unsigned int ead, eadm, ret; \
|
||||||
|
ead = ((ea) >> SPE_CACHELINE_SHIFT); \
|
||||||
|
eadm = ((ea) >> (SPE_CACHELINE_SHIFT+2)); \
|
||||||
|
ret = (ead ^ eadm) & SPE_CACHE_NSETS_MASK; \
|
||||||
|
ret; \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define _spe_cache_set_num_x4(ea_x4) \
|
||||||
|
({ \
|
||||||
|
vector unsigned int tmp0; \
|
||||||
|
vector unsigned int tmp1; \
|
||||||
|
tmp0 = spu_rlmask (ea_x4, -SPE_CACHELINE_SHIFT); \
|
||||||
|
tmp1 = spu_rlmask (ea_x4, -(SPE_CACHELINE_SHIFT+1)); \
|
||||||
|
spu_and (spu_xor (tmp0, tmp1), SPE_CACHE_NSETS_MASK); \
|
||||||
|
})
|
||||||
|
|
||||||
|
#define _spe_cache_idx_num_x4(found) \
|
||||||
|
spu_sub((unsigned int) 31, spu_cntlz(found))
|
||||||
|
|
||||||
|
#define _spe_cache_idx_num_(found) \
|
||||||
|
spu_extract(spu_sub((unsigned int) 31, spu_cntlz(found)), 0)
|
||||||
|
|
||||||
|
#define _spe_cacheline_num_(set, idx) \
|
||||||
|
(((set << SPE_CACHE_NWAY_SHIFT) + idx) << SPE_CACHELINE_SHIFT)
|
||||||
|
|
||||||
|
#define _spe_cacheline_num_x4(set, idx) \
|
||||||
|
spu_sl (spu_add (spu_sl (set, SPE_CACHE_NWAY_SHIFT), idx), SPE_CACHELINE_SHIFT)
|
||||||
|
|
||||||
|
#define _spe_cacheline_is_dirty_(set, idx) \
|
||||||
|
(spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_DIRTY)
|
||||||
|
|
||||||
|
#define _spe_cacheline_is_locked_(set, idx) \
|
||||||
|
(spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] & SPE_CACHELINE_LOCKED)
|
||||||
|
|
||||||
|
#define _spe_lock_cacheline_(set, idx) \
|
||||||
|
spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] |= SPE_CACHELINE_LOCKED
|
||||||
|
|
||||||
|
#define _spe_unlock_cacheline_(set, idx) \
|
||||||
|
spe_cache_dir[set][SPE_CACHE_NWAY_MASK-(idx)] &= ~SPE_CACHELINE_LOCKED
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spe_cache_dir
|
||||||
|
* This is the n-way set associative cache
|
||||||
|
* directory. Entries are either zero (unused)
|
||||||
|
* or non-zero (used).
|
||||||
|
*
|
||||||
|
* State for one additional (dummy) set is
|
||||||
|
* allocated to improve efficiency of cache
|
||||||
|
* line locking.
|
||||||
|
* volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer
|
||||||
|
*/
|
||||||
|
static unsigned int spe_cache_dir[SPE_CACHE_NSETS+1][SPE_CACHE_NWAY]
|
||||||
|
__attribute__ ((aligned(16)));
|
||||||
|
|
||||||
|
/**
|
||||||
|
* spe_cache_mem
|
||||||
|
* A contiguous set of cachelines in LS memory,
|
||||||
|
* one line for each entry in the cache.
|
||||||
|
* volatile seems not to be necessary here, the SCE toolchain guarantees a barrier after dma transfer
|
||||||
|
*/
|
||||||
|
static char spe_cache_mem[SPE_CACHE_MEM_SIZE]
|
||||||
|
__attribute__ ((aligned(128)));
|
||||||
|
|
||||||
|
#include "nway-lookup.h"
|
||||||
|
#include "nway-replace.h"
|
||||||
|
#include "nway-miss.h"
|
||||||
|
#include "nway-opt.h"
|
||||||
|
|
||||||
|
#endif
|
32
Extras/software_cache/cache/include/spe_cache.h
vendored
Normal file
32
Extras/software_cache/cache/include/spe_cache.h
vendored
Normal file
@ -0,0 +1,32 @@
|
|||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PLEASE DO NOT MODIFY THIS SECTION */
|
||||||
|
/* This prolog section is automatically generated. */
|
||||||
|
/* */
|
||||||
|
/* (C) Copyright 2001,2006, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* --------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
/* spe_cache.h
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 IBM Corp.
|
||||||
|
*
|
||||||
|
* Top level include file implementing
|
||||||
|
* software managed cache.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __SPE_CACHE_H__
|
||||||
|
#define __SPE_CACHE_H__ 1
|
||||||
|
|
||||||
|
#include "vec_literal.h"
|
||||||
|
#include "ilog2.h"
|
||||||
|
#include "memset.h"
|
||||||
|
//#include <cbe_mfc.h>
|
||||||
|
|
||||||
|
#include "defs.h"
|
||||||
|
#include "dma.h"
|
||||||
|
#include "nway.h"
|
||||||
|
#include "api.h"
|
||||||
|
|
||||||
|
#endif
|
74
Extras/software_cache/cache/include/vec_literal.h
vendored
Normal file
74
Extras/software_cache/cache/include/vec_literal.h
vendored
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
/* @(#)86 1.3 src/include/vec_literal.h, sw.includes, sdk_pub 10/11/05 16:00:27 */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* (C) Copyright 2001,2005, */
|
||||||
|
/* International Business Machines Corporation, */
|
||||||
|
/* Sony Computer Entertainment Incorporated, */
|
||||||
|
/* Toshiba Corporation. */
|
||||||
|
/* */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
/* -------------------------------------------------------------- */
|
||||||
|
/* PROLOG END TAG zYx */
|
||||||
|
#ifndef _VEC_LITERAL_H_
|
||||||
|
#define _VEC_LITERAL_H_
|
||||||
|
|
||||||
|
/* This header files provides an abstraction for the various implementations
|
||||||
|
* of vector literal construction. The two formats are:
|
||||||
|
*
|
||||||
|
* 1) Altivec styled using parenthesis
|
||||||
|
* 2) C grammer friendly styled using curly braces
|
||||||
|
*
|
||||||
|
* The macro, VEC_LITERAL has been developed to provide some portability
|
||||||
|
* in these two styles. To achieve true portability, user must specify all
|
||||||
|
* elements of the vector being initialized. A single element can be provided
|
||||||
|
* but only the first element guarenteed across both construction styles.
|
||||||
|
*
|
||||||
|
* The VEC_SPLAT_* macros have been provided for portability of vector literal
|
||||||
|
* construction when all the elements of the vector contain the same value.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __SPU__
|
||||||
|
#include <spu_intrinsics.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
#ifdef __ALTIVEC_LITERAL_STYLE__
|
||||||
|
/* Use altivec style.
|
||||||
|
*/
|
||||||
|
#define VEC_LITERAL(_type, ...) ((_type)(__VA_ARGS__))
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U8(_val) ((vector unsigned char)(_val))
|
||||||
|
#define VEC_SPLAT_S8(_val) ((vector signed char)(_val))
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U16(_val) ((vector unsigned short)(_val))
|
||||||
|
#define VEC_SPLAT_S16(_val) ((vector signed short)(_val))
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U32(_val) ((vector unsigned int)(_val))
|
||||||
|
#define VEC_SPLAT_S32(_val) ((vector signed int)(_val))
|
||||||
|
#define VEC_SPLAT_F32(_val) ((vector float)(_val))
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U64(_val) ((vector unsigned long long)(_val))
|
||||||
|
#define VEC_SPLAT_S64(_val) ((vector signed long long)(_val))
|
||||||
|
#define VEC_SPLAT_F64(_val) ((vector double)(_val))
|
||||||
|
|
||||||
|
#else
|
||||||
|
/* Use curly brace style.
|
||||||
|
*/
|
||||||
|
#define VEC_LITERAL(_type, ...) ((_type){__VA_ARGS__})
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U8(_val) ((vector unsigned char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val})
|
||||||
|
#define VEC_SPLAT_S8(_val) ((vector signed char){_val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val, _val})
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U16(_val) ((vector unsigned short){_val, _val, _val, _val, _val, _val, _val, _val})
|
||||||
|
#define VEC_SPLAT_S16(_val) ((vector signed short){_val, _val, _val, _val, _val, _val, _val, _val})
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U32(_val) ((vector unsigned int){_val, _val, _val, _val})
|
||||||
|
#define VEC_SPLAT_S32(_val) ((vector signed int){_val, _val, _val, _val})
|
||||||
|
#define VEC_SPLAT_F32(_val) ((vector float){_val, _val, _val, _val})
|
||||||
|
|
||||||
|
#define VEC_SPLAT_U64(_val) ((vector unsigned long long){_val, _val})
|
||||||
|
#define VEC_SPLAT_S64(_val) ((vector signed long long){_val, _val})
|
||||||
|
#define VEC_SPLAT_F64(_val) ((vector double){_val, _val})
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* _VEC_LITERAL_H_ */
|
83
Extras/software_cache/hello.spu.c
Normal file
83
Extras/software_cache/hello.spu.c
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
/*
|
||||||
|
* SCE CONFIDENTIAL
|
||||||
|
* PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
* Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*/
|
||||||
|
#include <sys/spu_thread.h>
|
||||||
|
#include <spu_printf.h>
|
||||||
|
|
||||||
|
#include <spu_intrinsics.h>
|
||||||
|
#include <sys/spu_thread.h>
|
||||||
|
#include <sys/spu_event.h>
|
||||||
|
#include <stdint.h>
|
||||||
|
|
||||||
|
#define SPE_CACHE_NWAY 4
|
||||||
|
#define SPE_CACHE_NSETS 32
|
||||||
|
#define SPE_CACHELINE_SIZE 512
|
||||||
|
#define SPE_CACHE_SET_TAGID(set) 16
|
||||||
|
|
||||||
|
#define USE_SOFTWARE_CACHE 1
|
||||||
|
#ifdef USE_SOFTWARE_CACHE
|
||||||
|
|
||||||
|
#include "cache/include/spe_cache.h"
|
||||||
|
|
||||||
|
void * spe_readcache(unsigned int ea)
|
||||||
|
{
|
||||||
|
|
||||||
|
int set, idx, line, byte;
|
||||||
|
_spe_cache_nway_lookup_(ea, set, idx);
|
||||||
|
|
||||||
|
if (unlikely(idx < 0)) {
|
||||||
|
idx = _spe_cache_miss_(ea, set, -1);
|
||||||
|
spu_writech(22, SPE_CACHE_SET_TAGMASK(set));
|
||||||
|
spu_mfcstat(MFC_TAG_UPDATE_ALL);
|
||||||
|
}
|
||||||
|
line = _spe_cacheline_num_(set, idx);
|
||||||
|
byte = _spe_cacheline_byte_offset_(ea);
|
||||||
|
return (void *) &spe_cache_mem[line + byte];
|
||||||
|
}
|
||||||
|
#endif //USE_SOFTWARE_CACHE
|
||||||
|
|
||||||
|
int main(int spu_num,uint64_t mainmemPtr)
|
||||||
|
{
|
||||||
|
int memPtr = (int) mainmemPtr;
|
||||||
|
|
||||||
|
|
||||||
|
#define MAX_BUF 256
|
||||||
|
char spuBuffer[MAX_BUF];
|
||||||
|
spuBuffer[0] = 0;
|
||||||
|
|
||||||
|
char* result,*result2; //= spe_cache_rd(mainmemPtr);
|
||||||
|
|
||||||
|
#ifdef USE_SOFTWARE_CACHE
|
||||||
|
|
||||||
|
//this is a brute-force sample.
|
||||||
|
//you can use the software cache more efficient using __spe_cache_rd_x4 to read 4 elements at a time
|
||||||
|
|
||||||
|
int i=0;
|
||||||
|
do
|
||||||
|
{
|
||||||
|
result = spe_readcache(mainmemPtr+i);
|
||||||
|
//spe_readcache is the expanded version of spe_cache_rd MACRO
|
||||||
|
|
||||||
|
spuBuffer[i] = result[0];
|
||||||
|
i++;
|
||||||
|
} while (result[0] && (i<MAX_BUF)); //assume that the buffer ends with [0] in main memory
|
||||||
|
|
||||||
|
|
||||||
|
//result = _spe_cache_lookup_xfer_wait_(mainmemPtr, 0, 1);
|
||||||
|
|
||||||
|
result = spe_readcache(mainmemPtr);
|
||||||
|
result2 = spe_readcache(mainmemPtr);
|
||||||
|
#endif //USE_SOFTWARE_CACHE
|
||||||
|
|
||||||
|
if (i>= MAX_BUF)
|
||||||
|
{
|
||||||
|
spu_printf("spe_readcache buffer overflow. is the buffer 0-terminated?\n");
|
||||||
|
}
|
||||||
|
spu_printf("spe_cache_rd(%x) = %s\n", memPtr,spuBuffer);
|
||||||
|
|
||||||
|
sys_spu_thread_exit(0);
|
||||||
|
}
|
||||||
|
|
19
Extras/software_cache/hello.spu.mk
Normal file
19
Extras/software_cache/hello.spu.mk
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
# SCE CONFIDENTIAL
|
||||||
|
# PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
# Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
CELL_MK_DIR ?= $(CELL_SDK)/samples/mk
|
||||||
|
|
||||||
|
|
||||||
|
include $(CELL_MK_DIR)/sdk.makedef.mk
|
||||||
|
|
||||||
|
SPU_INCDIRS += -Icache/include
|
||||||
|
SPU_SRCS = hello.spu.c
|
||||||
|
SPU_TARGET = hello.spu.elf
|
||||||
|
SPU_OPTIMIZE_LV=-O0
|
||||||
|
|
||||||
|
include $(CELL_MK_DIR)/sdk.target.mk
|
||||||
|
|
||||||
|
|
19
Extras/software_cache/spu_printf_server.h
Normal file
19
Extras/software_cache/spu_printf_server.h
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
/* SCE CONFIDENTIAL */
|
||||||
|
/* PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007 */
|
||||||
|
/* Copyright (C) 2005 Sony Computer Entertainment Inc. */
|
||||||
|
/* All Rights Reserved. */
|
||||||
|
|
||||||
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
#ifdef __cplusplus
|
||||||
|
extern "C" {
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
void spu_printf_server_entry(uint64_t arg);
|
||||||
|
int spu_printf_server_initialize(void);
|
||||||
|
int spu_printf_server_finalize(void);
|
||||||
|
int spu_printf_server_register(sys_spu_thread_t spu);
|
||||||
|
int spu_printf_server_unregister(sys_spu_thread_t spu);
|
||||||
|
#ifdef __cplusplus
|
||||||
|
}
|
||||||
|
#endif /* __cplusplus */
|
||||||
|
|
204
Extras/software_cache/spu_printf_server.ppu.c
Normal file
204
Extras/software_cache/spu_printf_server.ppu.c
Normal file
@ -0,0 +1,204 @@
|
|||||||
|
/*
|
||||||
|
* SCE CONFIDENTIAL
|
||||||
|
* PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
* Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* The SPU printf server is a PPU thread which collaborates with an SPU to
|
||||||
|
* output strings.
|
||||||
|
*
|
||||||
|
* On SPU-side, spu_printf() places the output string and arguments on a stack
|
||||||
|
* in the local storage, and passes its local-storage address with an SPU
|
||||||
|
* thread user event from SPU port 1 to PPU. On PPU-side,
|
||||||
|
* spu_thread_sprintf fetches the stack in the local stroage by DMA, and parse
|
||||||
|
* it to string-format.
|
||||||
|
*
|
||||||
|
* The SPU printf server takes charge of the tasks on PPU-side. The sequence
|
||||||
|
* of its task is as follows.
|
||||||
|
* 1. Receive events by sys_event_queue_receive()
|
||||||
|
* 2. Parse the received spu_printf stack address by spu_thread_snprintf.
|
||||||
|
* 3. Output the parsed string by printf(), and go back to step 1.
|
||||||
|
*
|
||||||
|
* Initialization of the SPU printf server and registeration of SPU threads to
|
||||||
|
* the SPU printf server is required. These can be done by
|
||||||
|
* spu_printf_server_initilize() and spu_printf_server_register().
|
||||||
|
* What they actually do is to create a PPU thread and event queue, and
|
||||||
|
* connect the SPU thread to the event queue.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <sys/ppu_thread.h>
|
||||||
|
#include <sys/spu_thread.h>
|
||||||
|
#include <sys/event.h>
|
||||||
|
#include <spu_printf.h>
|
||||||
|
#include "spu_printf_server.h"
|
||||||
|
|
||||||
|
#define STACK_SIZE 4096
|
||||||
|
#define PRIO 200
|
||||||
|
|
||||||
|
static sys_ppu_thread_t thread;
|
||||||
|
static sys_event_queue_t equeue;
|
||||||
|
static sys_event_queue_attribute_t eattr;
|
||||||
|
static sys_event_port_t terminating_port;
|
||||||
|
|
||||||
|
#define TERMINATING_PORT_NAME 0xFEE1DEAD
|
||||||
|
#define SPU_PORT_PRINTF 0x1
|
||||||
|
|
||||||
|
int spu_printf_server_initialize()
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/* Create event */
|
||||||
|
sys_event_queue_attribute_initialize(eattr);
|
||||||
|
ret = sys_event_queue_create(&equeue, &eattr, SYS_EVENT_PORT_LOCAL, 127);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_queue_create faild %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Create PPU thread */
|
||||||
|
ret = sys_ppu_thread_create(&thread, spu_printf_server_entry, 0UL, PRIO,
|
||||||
|
STACK_SIZE,
|
||||||
|
SYS_PPU_THREAD_CREATE_JOINABLE,
|
||||||
|
(char*)"spu_printf_server");
|
||||||
|
if (ret) {
|
||||||
|
printf ("spu_printf_server_initialize: sys_ppu_thread_create failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create the terminating port. This port is used only in
|
||||||
|
* sys_printf_server_finalize().
|
||||||
|
*/
|
||||||
|
ret = sys_event_port_create(&terminating_port,
|
||||||
|
SYS_EVENT_PORT_LOCAL,
|
||||||
|
TERMINATING_PORT_NAME);
|
||||||
|
if (ret) {
|
||||||
|
printf ("spu_printf_server_initialize: sys_event_port_create failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sys_event_port_connect_local(terminating_port, equeue);
|
||||||
|
if (ret) {
|
||||||
|
printf ("spu_printf_server_initialize: sys_event_port_connect_local failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Before call this, SPU threads which are registered finishes to send
|
||||||
|
* printf event.
|
||||||
|
*/
|
||||||
|
int spu_printf_server_finalize()
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Send an event from the terminating port to notify the termination to
|
||||||
|
* the SPU printf server
|
||||||
|
*/
|
||||||
|
ret = sys_event_port_send(terminating_port, 0, 0, 0);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_queue_cancel failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for the termination of the SPU printf server */
|
||||||
|
uint64_t exit_status;
|
||||||
|
ret = sys_ppu_thread_join(thread, &exit_status);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_ppu_thread_join failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Disconnect and destroy the terminating port */
|
||||||
|
ret = sys_event_port_disconnect(terminating_port);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_disconnect failed %d\n", ret);
|
||||||
|
}
|
||||||
|
ret = sys_event_port_destroy(terminating_port);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_port_destroy failed %d\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Destroy the event queue */
|
||||||
|
ret = sys_event_queue_destroy(equeue, 0);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_queue_destroy failed %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int spu_printf_server_register(sys_spu_thread_t spu)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = sys_spu_thread_connect_event(spu, equeue,
|
||||||
|
SYS_SPU_THREAD_EVENT_USER, SPU_PORT_PRINTF);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_spu_thread_connect_event faild %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int spu_printf_server_unregister(sys_spu_thread_t spu)
|
||||||
|
{
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
ret = sys_spu_thread_disconnect_event(spu,
|
||||||
|
SYS_SPU_THREAD_EVENT_USER, SPU_PORT_PRINTF);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_spu_thread_disconnect_event faild %d\n", ret);
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void spu_printf_server_entry(uint64_t arg)
|
||||||
|
{
|
||||||
|
(void)arg; /* This thread does not use the argument */
|
||||||
|
|
||||||
|
int ret;
|
||||||
|
sys_event_t event;
|
||||||
|
sys_spu_thread_t spu;
|
||||||
|
|
||||||
|
for (;;) {
|
||||||
|
ret = sys_event_queue_receive(equeue, &event, SYS_NO_TIMEOUT);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_event_queue_receive failed %d\n", ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* If an event is sent from the terminating port, the SPU printf
|
||||||
|
* server exits.
|
||||||
|
*/
|
||||||
|
if (event.source == TERMINATING_PORT_NAME) {
|
||||||
|
printf("Finalize the SPU printf server.\n");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
spu = event.data1;
|
||||||
|
|
||||||
|
int sret = spu_thread_printf(spu, event.data3);
|
||||||
|
ret = sys_spu_thread_write_spu_mb(spu, sret);
|
||||||
|
if (ret) {
|
||||||
|
printf("sys_spu_thread_write_spu_mb failed %d\n", ret);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sys_ppu_thread_exit(0);
|
||||||
|
}
|
||||||
|
|
243
Extras/software_cache/spu_thr_printf.ppu.c
Normal file
243
Extras/software_cache/spu_thr_printf.ppu.c
Normal file
@ -0,0 +1,243 @@
|
|||||||
|
/*
|
||||||
|
* SCE CONFIDENTIAL
|
||||||
|
* PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
* Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
* All Rights Reserved.
|
||||||
|
*
|
||||||
|
* File: spu_thr_printf.c
|
||||||
|
* Description:
|
||||||
|
* This sample shows how to output strings by SPU programs. spu_printf()
|
||||||
|
* called by
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
#include <stdio.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <sys/spu_initialize.h>
|
||||||
|
#include <sys/spu_image.h>
|
||||||
|
#include <sys/spu_thread.h>
|
||||||
|
#include <sys/spu_thread_group.h>
|
||||||
|
#include <sys/spu_utility.h>
|
||||||
|
#include <sys/paths.h>
|
||||||
|
#include "spu_printf_server.h" /* SPU printf server */
|
||||||
|
|
||||||
|
#define MAX_PHYSICAL_SPU 4
|
||||||
|
#define MAX_RAW_SPU 0
|
||||||
|
#define NUM_SPU_THREADS 4 /* The number of SPU threads in the group */
|
||||||
|
#define PRIORITY 100
|
||||||
|
#ifdef SN_TARGET_PS3
|
||||||
|
#define SPU_PROG (SYS_APP_HOME "/SPU_printf.spu.self")
|
||||||
|
#else
|
||||||
|
#define SPU_PROG (SYS_APP_HOME "/hello.spu.self")
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#define IN_BUF_SIZE 256
|
||||||
|
#define OUT_BUF_SIZE 256
|
||||||
|
|
||||||
|
volatile uint8_t in_buf[IN_BUF_SIZE];
|
||||||
|
volatile uint8_t out_buf[OUT_BUF_SIZE];
|
||||||
|
uint32_t in_size = IN_BUF_SIZE;
|
||||||
|
uint32_t out_size = OUT_BUF_SIZE;
|
||||||
|
|
||||||
|
int main(void)
|
||||||
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
sprintf(in_buf,"hello world");
|
||||||
|
|
||||||
|
sys_spu_thread_group_t group; /* SPU thread group ID */
|
||||||
|
const char *group_name = "Group";
|
||||||
|
sys_spu_thread_group_attribute_t group_attr;/* SPU thread group attribute*/
|
||||||
|
sys_spu_thread_t threads[NUM_SPU_THREADS]; /* SPU thread IDs */
|
||||||
|
sys_spu_thread_attribute_t thread_attr; /* SPU thread attribute */
|
||||||
|
const char *thread_names[NUM_SPU_THREADS] =
|
||||||
|
{"SPU Thread 0",
|
||||||
|
"SPU Thread 1",
|
||||||
|
"SPU Thread 2",
|
||||||
|
"SPU Thread 3"}; /* The names of SPU threads */
|
||||||
|
sys_spu_image_t spu_img;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize SPUs
|
||||||
|
*/
|
||||||
|
printf("Initializing SPUs\n");
|
||||||
|
ret = sys_spu_initialize(MAX_PHYSICAL_SPU, MAX_RAW_SPU);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_initialize failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Create an SPU thread group
|
||||||
|
*/
|
||||||
|
printf("Creating an SPU thread group.\n");
|
||||||
|
group_attr.name = group_name;
|
||||||
|
group_attr.nsize = strlen(group_attr.name) + 1; /* Add 1 for '\0' */
|
||||||
|
group_attr.type = SYS_SPU_THREAD_GROUP_TYPE_NORMAL;
|
||||||
|
ret = sys_spu_thread_group_create(&group,
|
||||||
|
NUM_SPU_THREADS,
|
||||||
|
PRIORITY,
|
||||||
|
&group_attr);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_group_create failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sys_spu_image_open(&spu_img, SPU_PROG);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_image_open failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Initialize the SPU printf server
|
||||||
|
*
|
||||||
|
* What spu_printf_server_initialize() actually does is to create an
|
||||||
|
* PPU thread and an event queue which handle the events sent by
|
||||||
|
* spu_printf().
|
||||||
|
*/
|
||||||
|
ret = spu_printf_server_initialize();
|
||||||
|
if (ret != SUCCEEDED) {
|
||||||
|
fprintf(stderr, "spu_printf_server_initialize failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
* In this loop, all SPU threads in the SPU thread group are initialized
|
||||||
|
* with the loaded SPU ELF image.
|
||||||
|
*/
|
||||||
|
for (int i = 0; i < NUM_SPU_THREADS; i++) {
|
||||||
|
sys_spu_thread_argument_t thread_args;
|
||||||
|
int spu_num = i;
|
||||||
|
|
||||||
|
printf("Initializing SPU thread %d\n", i);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* nsegs, segs and entry_point have already been initialized by
|
||||||
|
* sys_spu_thread_elf_loader().
|
||||||
|
*/
|
||||||
|
thread_attr.name = thread_names[i];
|
||||||
|
thread_attr.nsize = strlen(thread_names[i]) + 1;
|
||||||
|
thread_attr.option = SYS_SPU_THREAD_OPTION_NONE;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Pass the SPU number to the SPU thread as the first parameter.
|
||||||
|
*/
|
||||||
|
thread_args.arg1 = SYS_SPU_THREAD_ARGUMENT_LET_32(spu_num);
|
||||||
|
thread_args.arg2 = SYS_SPU_THREAD_ARGUMENT_LET_64((uint64_t)in_buf);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* The third argument specifies the SPU number.
|
||||||
|
* The SPU number of each SPU thread must be unique within the SPU
|
||||||
|
* thread group.
|
||||||
|
*/
|
||||||
|
ret = sys_spu_thread_initialize(&threads[i],
|
||||||
|
group,
|
||||||
|
spu_num,
|
||||||
|
&spu_img,
|
||||||
|
&thread_attr,
|
||||||
|
&thread_args);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_initialize failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Register the SPU thread to the SPU printf server.
|
||||||
|
*
|
||||||
|
* spu_printf_server_register() establishes the connection between
|
||||||
|
* the SPU thread and the SPU printf server's event queue.
|
||||||
|
*/
|
||||||
|
ret = spu_printf_server_register(threads[i]);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "spu_printf_server_register failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("All SPU threads have been successfully initialized.\n");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Start the SPU thread group
|
||||||
|
*
|
||||||
|
* The SPU thread group will be in the READY state, and will become in
|
||||||
|
* the RUNNING state when the kernel assigns and executes it onto SPUs.
|
||||||
|
*/
|
||||||
|
printf("Starting the SPU thread group.\n");
|
||||||
|
ret = sys_spu_thread_group_start(group);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_group_start failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Wait for the termination of the SPU thread group.
|
||||||
|
*/
|
||||||
|
printf("Waiting for the SPU thread group to be terminated.\n");
|
||||||
|
int cause, status;
|
||||||
|
ret = sys_spu_thread_group_join(group, &cause, &status);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_group_join failed: %#.8x\n", ret);
|
||||||
|
exit(ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Show the exit cause and status.
|
||||||
|
*/
|
||||||
|
switch(cause) {
|
||||||
|
case SYS_SPU_THREAD_GROUP_JOIN_GROUP_EXIT:
|
||||||
|
printf("The SPU thread group exited by sys_spu_thread_group_exit().\n");
|
||||||
|
printf("The group's exit status = %d\n", status);
|
||||||
|
break;
|
||||||
|
case SYS_SPU_THREAD_GROUP_JOIN_ALL_THREADS_EXIT:
|
||||||
|
printf("All SPU thread exited by sys_spu_thread_exit().\n");
|
||||||
|
for (int i = 0; i < NUM_SPU_THREADS; i++) {
|
||||||
|
int thr_exit_status;
|
||||||
|
ret = sys_spu_thread_get_exit_status(threads[i], &thr_exit_status);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_get_exit_status failed: %#.8x\n", ret);
|
||||||
|
}
|
||||||
|
printf("SPU thread %d's exit status = %d\n", i, thr_exit_status);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SYS_SPU_THREAD_GROUP_JOIN_TERMINATED:
|
||||||
|
printf("The SPU thread group is terminated by sys_spu_thread_terminate().\n");
|
||||||
|
printf("The group's exit status = %d\n", status);
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
fprintf(stderr, "Unknown exit cause: %d\n", cause);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Destroy the SPU thread group and clean up resources.
|
||||||
|
*/
|
||||||
|
ret = sys_spu_thread_group_destroy(group);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_thread_group_destroy failed: %#.8x\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
ret = sys_spu_image_close(&spu_img);
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "sys_spu_image_close failed: %.8x\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Finalize the SPU printf server.
|
||||||
|
*
|
||||||
|
* This function let the PPU thread exit.
|
||||||
|
* The event queue will be destroyed.
|
||||||
|
*/
|
||||||
|
ret = spu_printf_server_finalize();
|
||||||
|
if (ret != CELL_OK) {
|
||||||
|
fprintf(stderr, "spu_printf_server_finalize failed: %#.8x\n", ret);
|
||||||
|
}
|
||||||
|
|
||||||
|
printf("Exiting.\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
16
Extras/software_cache/spu_thr_printf.ppu.mk
Normal file
16
Extras/software_cache/spu_thr_printf.ppu.mk
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
# SCE CONFIDENTIAL
|
||||||
|
# PLAYSTATION(R)3 Programmer Tool Runtime Library 085.007
|
||||||
|
# Copyright (C) 2005 Sony Computer Entertainment Inc.
|
||||||
|
# All Rights Reserved.
|
||||||
|
#
|
||||||
|
|
||||||
|
CELL_MK_DIR ?= $(CELL_SDK)/samples/mk
|
||||||
|
|
||||||
|
include $(CELL_MK_DIR)/sdk.makedef.mk
|
||||||
|
|
||||||
|
PPU_SRCS = spu_thr_printf.ppu.c spu_printf_server.ppu.c
|
||||||
|
PPU_TARGET = spu_thr_printf.ppu.elf
|
||||||
|
|
||||||
|
include $(CELL_MK_DIR)/sdk.target.mk
|
||||||
|
|
||||||
|
|
29
Extras/software_cache/spu_thr_printf_2.sln
Normal file
29
Extras/software_cache/spu_thr_printf_2.sln
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
|
||||||
|
Microsoft Visual Studio Solution File, Format Version 9.00
|
||||||
|
# Visual Studio 2005
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spu_thr_printf_2", "spu_thr_printf_2.vcproj", "{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}"
|
||||||
|
ProjectSection(ProjectDependencies) = postProject
|
||||||
|
{47EE939D-CB3D-4600-B8B6-79FDF607E133} = {47EE939D-CB3D-4600-B8B6-79FDF607E133}
|
||||||
|
EndProjectSection
|
||||||
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SPU_printf", "SPU_printf\SPU_printf.vcproj", "{47EE939D-CB3D-4600-B8B6-79FDF607E133}"
|
||||||
|
EndProject
|
||||||
|
Global
|
||||||
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
|
PS3 Debug|Win32 = PS3 Debug|Win32
|
||||||
|
PS3 Release|Win32 = PS3 Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(ProjectConfigurationPlatforms) = postSolution
|
||||||
|
{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}.PS3 Debug|Win32.ActiveCfg = PS3 Debug|Win32
|
||||||
|
{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}.PS3 Debug|Win32.Build.0 = PS3 Debug|Win32
|
||||||
|
{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}.PS3 Release|Win32.ActiveCfg = PS3 Release|Win32
|
||||||
|
{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}.PS3 Release|Win32.Build.0 = PS3 Release|Win32
|
||||||
|
{47EE939D-CB3D-4600-B8B6-79FDF607E133}.PS3 Debug|Win32.ActiveCfg = PS3 Debug|Win32
|
||||||
|
{47EE939D-CB3D-4600-B8B6-79FDF607E133}.PS3 Debug|Win32.Build.0 = PS3 Debug|Win32
|
||||||
|
{47EE939D-CB3D-4600-B8B6-79FDF607E133}.PS3 Release|Win32.ActiveCfg = PS3 Release|Win32
|
||||||
|
{47EE939D-CB3D-4600-B8B6-79FDF607E133}.PS3 Release|Win32.Build.0 = PS3 Release|Win32
|
||||||
|
EndGlobalSection
|
||||||
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
|
HideSolutionNode = FALSE
|
||||||
|
EndGlobalSection
|
||||||
|
EndGlobal
|
200
Extras/software_cache/spu_thr_printf_2.vcproj
Normal file
200
Extras/software_cache/spu_thr_printf_2.vcproj
Normal file
@ -0,0 +1,200 @@
|
|||||||
|
<?xml version="1.0" encoding="Windows-1252"?>
|
||||||
|
<VisualStudioProject
|
||||||
|
ProjectType="Visual C++"
|
||||||
|
Version="8.00"
|
||||||
|
Name="spu_thr_printf_2"
|
||||||
|
ProjectGUID="{3494AF8B-FDA7-4CEA-B775-4C5C45599D5F}"
|
||||||
|
>
|
||||||
|
<Platforms>
|
||||||
|
<Platform
|
||||||
|
Name="Win32"
|
||||||
|
/>
|
||||||
|
</Platforms>
|
||||||
|
<ToolFiles>
|
||||||
|
</ToolFiles>
|
||||||
|
<Configurations>
|
||||||
|
<Configuration
|
||||||
|
Name="PS3 Debug|Win32"
|
||||||
|
OutputDirectory="PS3_PPU_Debug"
|
||||||
|
IntermediateDirectory="PS3_PPU_Debug"
|
||||||
|
ConfigurationType="1"
|
||||||
|
DeleteExtensionsOnClean="*.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);$(TargetDir)$(TargetName).self"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="-g -Wall -fno-exceptions"
|
||||||
|
AdditionalIncludeDirectories=""$(SN_PS3_PATH)\ppu\include\sn";"$(SCE_PS3_ROOT)\target\ppu\include";"$(SCE_PS3_ROOT)\target\common\include""
|
||||||
|
PreprocessorDefinitions="SN_TARGET_PS3;_DEBUG;__GCC__"
|
||||||
|
ProgramDataBaseFileName="$(IntDir)/"
|
||||||
|
CompileAs="0"
|
||||||
|
ForcedIncludeFiles=""
|
||||||
|
ForcedUsingFiles=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="-fno-exceptions"
|
||||||
|
AdditionalDependencies=""$(SN_PS3_PATH)\ppu\lib\sn\libsn.a" "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a" "$(SCE_PS3_ROOT)\target\ppu\lib\libio.a""
|
||||||
|
OutputFile="$(ProjectName).ppu.elf"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
GenerateManifest="false"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=""
|
||||||
|
ImportLibrary=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
Description="Fake Signing ELF "$(TargetDir)$(TargetName).self""
|
||||||
|
CommandLine="$(SCE_PS3_ROOT)\host-win32\bin\make_fself "$(TargetPath)" "$(TargetDir)$(TargetName).self""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
<Configuration
|
||||||
|
Name="PS3 Release|Win32"
|
||||||
|
OutputDirectory="PS3_PPU_Release"
|
||||||
|
IntermediateDirectory="PS3_PPU_Release"
|
||||||
|
ConfigurationType="1"
|
||||||
|
DeleteExtensionsOnClean="*.obj;*.d;*.map;*.lst;*.pch;$(TargetPath);$(TargetDir)$(TargetName).self"
|
||||||
|
>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreBuildEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCustomBuildTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXMLDataGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebServiceProxyGeneratorTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCMIDLTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCCLCompilerTool"
|
||||||
|
AdditionalOptions="-O2 -Wall -fno-exceptions"
|
||||||
|
AdditionalIncludeDirectories=""$(SN_PS3_PATH)\ppu\include\sn";"$(SCE_PS3_ROOT)\target\ppu\include";"$(SCE_PS3_ROOT)\target\common\include""
|
||||||
|
PreprocessorDefinitions="SN_TARGET_PS3;NDEBUG;__GCC__"
|
||||||
|
ProgramDataBaseFileName="$(IntDir)/"
|
||||||
|
CompileAs="0"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManagedResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCResourceCompilerTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPreLinkEventTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCLinkerTool"
|
||||||
|
AdditionalOptions="-fno-exceptions"
|
||||||
|
AdditionalDependencies=""$(SN_PS3_PATH)\ppu\lib\sn\libsn.a" "$(SCE_PS3_ROOT)\target\ppu\lib\libm.a" "$(SCE_PS3_ROOT)\target\ppu\lib\libio.a""
|
||||||
|
OutputFile="$(ProjectName).ppu.elf"
|
||||||
|
AdditionalLibraryDirectories=""
|
||||||
|
GenerateManifest="false"
|
||||||
|
GenerateDebugInformation="true"
|
||||||
|
ProgramDatabaseFile=""
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCALinkTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCManifestTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCXDCMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCBscMakeTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCFxCopTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCAppVerifierTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCWebDeploymentTool"
|
||||||
|
/>
|
||||||
|
<Tool
|
||||||
|
Name="VCPostBuildEventTool"
|
||||||
|
Description="Fake Signing ELF "$(TargetDir)$(TargetName).self""
|
||||||
|
CommandLine="$(SCE_PS3_ROOT)\host-win32\bin\make_fself "$(TargetPath)" "$(TargetDir)$(TargetName).self""
|
||||||
|
/>
|
||||||
|
</Configuration>
|
||||||
|
</Configurations>
|
||||||
|
<References>
|
||||||
|
</References>
|
||||||
|
<Files>
|
||||||
|
<Filter
|
||||||
|
Name="Source Files"
|
||||||
|
Filter="cpp;c;cxx;cc;s;asm"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\spu_printf_server.ppu.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
<File
|
||||||
|
RelativePath=".\spu_thr_printf.ppu.c"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
<Filter
|
||||||
|
Name="Header Files"
|
||||||
|
Filter="h;hpp"
|
||||||
|
>
|
||||||
|
<File
|
||||||
|
RelativePath=".\spu_printf_server.h"
|
||||||
|
>
|
||||||
|
</File>
|
||||||
|
</Filter>
|
||||||
|
</Files>
|
||||||
|
<Globals>
|
||||||
|
</Globals>
|
||||||
|
</VisualStudioProject>
|
Loading…
Reference in New Issue
Block a user