不同的编译器,搭散是不一样的知改氏。
补充:GCC 不太清楚,你连VC++的版本都不说。汗,VC6是不支持SSE的,需要安装VC6SP5。
VS2005 和 VS2008 都支持 SSE。对 SSE/MMX 指令集优化得最好的,还是 Intel 的 c++ 编译器。
对并行和高性能计算,Fortran 的优势比较歼绝大。特别是 Fortran2003 的新特征,为并行计算做了很多专门的设定。Intel 也有 Fortran 的编译器。
刚开始学习STM32汇编,可能不是最简形式;以下程序MDK编译通过了;***********************************************
ALPHA_FORMULA_1 参数传递缓指S=R1,D=R2,A=R3
***********************************************
ALPHA_FORMULA_1
PUSH {R0,R1,R3-R7,LR}
MUL.W R0,R1,R3
MOV.W R4,#0X1F
SUB.W R4,R3
MUL.W R4,R2
LSR.W R4,R4,#0X05
ADD.W R2,R0,R4
POP {R0,R1,R3-R7,PC}
***********************************************
alpha_blend_2 参数传递P1=R1,P2=R2,A=R3
参数p2_t由R0传出
***********************************************
alpha_blend_2
PUSH {R1-R7,LR}
LDR.W R4,=0Xf81f07e0 R4=p1_t = (p1 &0xf81f07e0)
AND.W R4,R1
LDR.W R5,=0X07e0f81f R5=p1 &= 0x07e0f81f
AND.W R5,R1
LDR.W R6,=0Xf81f07e0 R6=p2_t = (p2 &0xf81f07e0)
AND.W R6,R2
LDR.W R7,=0X07e0f81f R7=p2 &= 0x07e0f81f
AND.W R7,R2
ROR.W R4,R4,#16 LOOP_SHIFT_R(p1_t, 16) //p1_t 循环拿册右移 16位
ROR.W R6,R6,#16 LOOP_SHIFT_R(p2_t, 16) //p2_t 循环右移 16位
MOV.W R1,R4 ALPHA_FORMULA_1(p1_t, p2_t, a) /扰敏配/公式套用
MOV.W R2,R6
BL.W ALPHA_FORMULA_1
MOV.W R6,R2
MOV.W R1,R5 ALPHA_FORMULA_1(p1, p2, a)
MOV.W R2,R7
BL.W ALPHA_FORMULA_1
MOV.W R7,R2
LDR.W R2,=0X07e0f81f R6=p2_t &= 0x07e0f81f//
AND.W R6,R2
LDR.W R2,=0X07e0f81f R7=p2 &= 0x07e0f81f
AND.W R7,R2
ROR.W R6,R6,#16 LOOP_SHIFT_R(p2_t, 16) //p2_t循环右移 16位
ORR.W R7,R6 p2_t |= p2
MOV.W R0,R6 return p2_t
POP {R1-R7,PC}
***********************************************
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)