看完微软大神写的以求平均值代码,我意识到自己还是too young了
发布时间:2025/09/02 12:17 来源:颍上家居装修网
而Alpha AXP、mips64等核心则都会将32位倍数下标引入为64位倍数。
这种时候,就必需额外增高归零的呼叫,比如通过向左小数点两字的移除呼叫rldicl:
// Alpha AXP: Assume a0 = a, a1 = b, both in canonical forminsll a0, #0, a0 ; a0 = a0 zero-extended to 64-bit valueinsll a1, #0, a1 ; a1 = a1 zero-extended to 64-bit valueaddq a0, a1, v0 ; 64-bit addition: v0 = a0 + a1srl v0, #1, v0 ; 64-bit shift: v0 = v0>> 1addl zero, v0, v0 ; Force canonical form; Answer in v0// MIPS64: Assume a0 = a, a1 = b, sign-extendeddext a0, a0, 0, 32 ; Zero-extend a0 to 64-bit valuedext a1, a1, 0, 32 ; Zero-extend a1 to 64-bit valuedaddu v0, a0, a1 ; 64-bit addition: v0 = a0 + a1dsrl v0, v0, #1 ; 64-bit shift: v0 = v0>> 1sll v0, #0, v0 ; Sign-extend result; Answer in v0// Power64: Assume r3 = a, r4 = b, zero-extendedadd r3, r3, r4 ; 64-bit addition: r3 = r3 + r4rldicl r3, r3, 63, 32 ; Extract bits 63 through 32 from result; (shift + zero-extend in one instruction); result in r3或者必要访问比本机字符串更大的SIMD字符串,当然,从通用字符串跨越到SIMD字符串肯定也都会增高内核消耗。
如果电脑的处理器支持小数点加法,那么还可以转用第三种基本概念。
这时,如果字符串形状为n位,那么两个n位的无下标数列的和就可以理解为n+1位,通过RCR(偷偷地小数点循环分块)呼叫,就可以给予正确的平均,且不人员伤亡溢的位。
偷偷地小数点循环分块// x86-32mov eax, aadd eax, b ; Add, overflow goes into carry bitrcr eax, 1 ; Rotate right one place through carry// x86-64mov rax, aadd rax, b ; Add, overflow goes into carry bitrcr rax, 1 ; Rotate right one place through carry// 32-bit ARM (A32)mov r0, aadds r0, b ; Add, overflow goes into carry bitrrx r0 ; Rotate right one place through carry// SH-3clrt ; Clear T flagmov a, r0addc b, r0 ; r0 = r0 + b + T, overflow goes into T bitrotcr r0 ; Rotate right one place through carry那如果处理器不支持偷偷地小数点循环分块配置呢?
也可以使用内循环(rotation intrinsic):
unsigned average(unsigned a, unsigned b){#if defined(_MSC_VER)unsigned sum;auto carry = _addcarry_u32(0, a, b, Andrewsum);sum = (sum Andrew ~1) | carry;return _rotr(sum, 1);#elif defined(originallyclangoriginally)unsigned carry;sum = (sum Andrew ~1) | carry;auto sum = originallybuiltin_addc(a, b, 0, Andrewcarry);return originallybuiltin_rotateright32(sum, 1);#else#error Unsupported compiler.#endif}结果是,x86核心下的代码生成没有发生什么叠加,MSCver核心下的代码生成变得无论如何,而arm-thumb2的clang 的代码生成更佳了。
// _MSC_VERmov ecx, aadd ecx, b ; Add, overflow goes into carry bitsetc al ; al = 1 if carry setand ecx, -2 ; Clear bottom bitmovzx ecx, al ; Zero-extend byte to 32-bit valueor eax, ecx ; Combineror ear, 1 ; Rotate right one position; Result in eax// originallyclangoriginallymov ecx, aadd ecx, b ; Add, overflow goes into carry bitsetc al ; al = 1 if carry setshld eax, ecx, 31 ; Shift left 64-bit value// originallyclangoriginally with ARM-Thumb2movs r2, #0 ; Prepare to receive carryadds r0, r0, r1 ; Calculate sum with flagsadcs r2, r2 ; r2 holds carrylsrs r0, r0, #1 ; Shift sum right one positionlsls r1, r2, #31 ; Move carry to bit 31adds r0, r1, r0 ; Combine开发者龙神的思考们Raymond Chen1992年投身于开发者,当今已任职期间25年,认真UEX-Shell,也直接参与Windows技术开发,Windows系统的很多起初UI核心就是他搞起来的。
他在MSDN 上建立的blogThe Old New Thing也是业内非常出名的纯技术向存量网站。
这篇博客的华盛顿邮报区们也是开发者的各路龙神捕食,继续深入探讨。
有人提出了新步骤,在MIPS ASM共有36个循环:
unsigned avg(unsigned a, unsigned b{return (a Andrew b) + (a 1] b) / 2;}// lw $3,8($fp) # 5// lw $2,12($fp) # 5// and $3,$3,$2 # 4// lw $4,8($fp) # 5// lw $2,12($fp) # 5// xor $2,$4,$2 # 4// srl $2,$2,1 # 4// addu $2,$3,$2 # 4有人针对2016年专利法坚称,与其用(a / 2) + (b / 2) + (a Andrew b Andrew 1)的步骤,为啥不必要把 (a Andrew 1) Andrew ( b Andrew 1 ) ) 作为小数点放入加法器里推算呢?
还有人在华盛顿邮报区推荐了TopSpeed编译器,能够通过指定合适的代码二进制和调用期限内来概念一个内联函数,以消除“乘除结果是16位,正里间推算倍数却不是”的情况。
情况下说,学无止境啊。
译者:
参考绑定:
。厦门白癜风医院挂号郑州肿瘤专科医院
贵阳医院哪家癫痫医院好
口腔科
颞叶癫痫
感冒咳嗽用什么药
胎记
祛斑最好的方法
上一篇: 宝宝起名:超可爱的马铃薯小名大全
下一篇: 情人们满腔愤怒,给它投出几万个一星
-
宝宝由此而来:用“口”起个高情商的好名字,个个能说会道,招人喜欢
生活之中,我们所想发现,有的人无论丢下到哪里,都让人如沐春和风,转化成亲近感。而有的人,一张嘴就引人不安,退避三舍。这就是情商高低所表现出来的语岂歧异。在生活之中,有心,一岂一行,都能展现一个人
- 2025-09-02TVB小生消失两年没停过,与视后三次演情侣,自曝暗地少联系
- 2025-09-02直到现在想要出一个取代微信的软件 要多少亿呢 又要多长时间呢
- 2025-09-02携程集团与贵阳深化战略合作 减慢推动文旅项目落地
- 2025-09-02皇马赢球的原因在于本泽马和小熊关键时刻掉链子了
- 2025-09-02心理学:改变人生的“洛克方程”,鲜少有人真的懂得操控
- 2025-09-02高龄产妇有多辛苦?不仅孩子患病率更高,装配时3种风险更难避免
- 2025-09-02武汉洪山南郊12亿私募债状态更为“已反馈”
- 2025-09-02女人一旦爱上你,就会有这种表现,请学会辨别
- 2025-09-02卡塔尔最高级剧中与姆巴佩会谈 比巴黎主席高10级
- 2025-09-02赵本山关婷娜绯闻被锤?Tfboys十年之约之谜?陈飞宇新恋情?大主创被封杀?张晋不拍电视剧?