我是汇编程序和NEON编程的新手.我的任务是使用NEON指令将部分算法从C转换为ARM Assembler.该算法采用int32数组,从该数组加载不同的值,执行一些位移和Xor并将结果写入另一个数组.稍后我将使用64位值的数组,但是现在我只是尝试重写代码.
C Pseudo code:
out_array[index] = shiftSome( in_array[index] ) ^ shiftSome( in_array[index] );
Run Code Online (Sandbox Code Playgroud)
以下是关于NEON指令的问题:
1.)如果我加载这样的寄存器:
vld1.32 d0, [r1]
Run Code Online (Sandbox Code Playgroud)
它会从内存加载32Bit还是2x32Bit来填充64Bit Neon D-Register?
2.)如何访问D-Register的2/4/8(i32,i16,i8)部分?
3.)我试图从数组加载不同的值与偏移量,但它似乎不起作用...我做错了什么...这是我的代码:(它是一个整数数组所以我m试图加载例如3元素,它应该具有64Bit = 8 Byte的偏移量
asm volatile(
"vld1.32 d0, [%0], #8 \n"
"vst1.32 d0, [%1]" : : "r" (a), "r" (out): "d0", "r5");
Run Code Online (Sandbox Code Playgroud)
其中"a"是数组,"out"是指向整数的指针(用于调试).
4.)从数组加载一个值后,我需要将它移到右边,但它似乎不起作用:
vshr.u32 d0, d0, #24 // C code: x >> 24;
Run Code Online (Sandbox Code Playgroud)
5.)是否可以只在霓虹灯寄存器中加载1个字节,这样我就不必移动/屏蔽某些东西只能得到我需要的一个字节?
6.)我需要使用内联汇编程序,但我不确定最后一行是什么:
input list : output list : what is this for?
Run Code Online (Sandbox Code Playgroud)
7.)你知道任何有关代码示例的NEON参考资料吗?
该程序应该在三星Galaxy S2,cortex-A9处理器上运行,如果这有任何区别.谢谢您的帮助.
- - - - - - - - …
我在裸板运行时上运行,从地址零读取数据是我软件中的一个有效用例。但是,运行时将地址 0x0 视为null,并在使用-O2. 代码在编译时按预期运行-O1:
declare
use System.Storage_Elements;
type Byte_Array is array (Natural range 0 .. 3) of Interfaces.Unsigned_8;
bytes : constant Byte_Array with Import, Convention => Ada, Address => To_Address(Integer_Address(16#00000000#));
begin
-- Copy bytes to some other byte array in memory:
other_bytes := bytes; -- Throws exception
end;
Run Code Online (Sandbox Code Playgroud)
有没有办法解决这个问题?
我的平台详情:
失败详情:
之前的代码在我的运行时在memcpy由s-memcop.adb. 代码复制在下面,并带有一条注释报告失败的行。我不确定抛出的实际异常。我所能看到的就是最后一次使用信息调用处理程序的机会s-memcop.adb:52,下面对此进行了评论。
40 function memcpy
41 (Dest …Run Code Online (Sandbox Code Playgroud) 在Xcode 4.5中构建我的iOS应用程序会导致每个源文件的依赖性分析警告:
warning: no rule to process file of type sourcecode.c.objc for architecture armv6
Run Code Online (Sandbox Code Playgroud)
这最终导致缺少二进制文件.任何想法在这里有什么问题?
构建设置:armv6 armv7有效体系结构和iOS 4.3部署目标.
我有一个第三方库(ZBar)抱怨我在构建项目时使用armv7 arch(在终端中,使用xcodebuild),我必须在构建设置中将有效架构设置为armv6(仅限).
问题:设置为armv6的应用程序是否会在iPhone 3GS设备上运行?
我已经开始研究不同的基于ARM的目标,但我仍然缺少关于ARM内核,架构,指令集和核心系列的东西.在这里查看维基百科页面:http://en.wikipedia.org/wiki/ARM_architecture#ARM_cores 我看到每个架构都有多个ARM架构和多个系列.例如,对于ARMv6架构,有ARM11和ARM-Cortex-M系列.对于ARMv7和其他人来说也是如此.ARM11和ARM Cortex-M有什么区别,因为架构是相同的?ARM11和ARM Cortex-M是否支持相同的指令集,因为它们实现了相同的架构?
我正在为iPhone/iPodTouch编写游戏(使用Cocos2d),我发现了一些奇怪的东西......
我需要检测播放器触摸的屏幕部分以执行某些操作.
例如:
-(void)ccTouchEnded:(UITouch *)touch withEvent:(UIEvent *)event {
CGPoint touchLocation = [touch locationInView:[touch view]];
//DEBUG
CCLOG(@"Button pressed: X Location: %f",touchLocation.x);
CCLOG(@"Button pressed: Y Location: %f",touchLocation.y);
Run Code Online (Sandbox Code Playgroud)
...当touchLocation.x和touchLocation.y都在一定范围内时,我会做一些事情.
它在模拟器上工作得很好.当我为我的测试设备编译它时,使用armv7架构(优化)它也有效.但是当我使用armv6编译它时,启用了armv7架构(这是应用商店需要的),我注意到代码不再有效.CCLOG向我展示了我为armv6编译时使用的X,Y坐标系统,armv7与我仅为armv7(优化)编译时所使用的不同.
我怎样才能解决这个问题?是在设备上测试时使用armv6,armv7使用的坐标系的唯一方法......(这在模拟器上不起作用)?我无法上传iPhone的应用程序,只能编译为armv7(优化).:(