vspltisw v2, 0 ;v2 = 0 vsubuwm v0, v2, v1 ;v0 = 0 - v1 = -v1 vmaxsw v0, v0, v1 ;v0 = -v1 > v1 ? -v1 : v1 |
vor v0, v1, v1 ;v0 = (v1 | v1) = v1 |
vmulesb v3, v1, v2 ;v3 = v1 * v2(奇数番目の符合つき1byte整数乗算結果) vmulosb v4, v1, v2 ;v4 = v1 * v2(偶数番目の符合つき1byte整数乗算結果) vpkuhum v3, v3, v3 ;v3 = (signed char)v3(1byte整数に修正) vpkuhum v4, v4, v4 ;v4 = (signed char)v4(1byte整数に修正) vmrglb v0, v3, v4 ;乗算結果を合成 |
;v5 = (0x1, 0x11, 0x3, 0x13, 0x5, 0x15, 0x7, 0x17, 0x9, 0x19, 0xb, 0x1b, 0xd, 0x1d, 0xf, 0x1f) ... vmulesb v3, v1, v2 ;v3 = v1 * v2(奇数番目の符合つき1byte整数乗算結果) vmulosb v4, v1, v2 ;v4 = v1 * v2(偶数番目の符合つき1byte整数乗算結果) vperm v0, v3, v4, v5 ;撹拌命令で乗算結果の下1byteのみを摘出して合成 |
vspltish v3, 0 ;v3 = 0 vmladduhm v0, v1, v2, v3 ;v0 = v1 * v2 + 0 |
vspltisw v3, -16 ;4byteシフト命令は下5bitしか見ないので、負の数を生成しても問題ない vslptisw v4, 0 vrlw v5, v2, v3 ;v5 = (v2 << 16) | ( (unsigned)v2 >> 16)(回転シフト) vmulouh v6, v1, v2 ;v1 * v2の下16bitの乗算結果 vmsumuhm v0, v1, v5, v4 ;v1とv5の上16bitの乗算結果×2の合計 vslw v0, v0, v3 ;(unsigned long)v0 << 16 vadduwm v0, v0, v6 ;乗算結果の上16bitと下16bitを合成 |
vnor v0, v1, v1 ;v0 = ¬(v1 | v1) = ¬v1 |
vspltisw v2, 0 ;v2 <- 0 vsubuwm v0, v2, v1 ;v0 = 0 - v1 = -v1 |
vspltisw v1, 1 ;v1 <- (int)1 vcfsx v0, v1, 0 ;v0 = (float)1 |
vspltisw v3, 0 ;v3 <- 0.0 vmaddfp v0, v1, v2, v3 ;v0 = (float)v1 * (float)v2 + 0.0 |
vrefp v3, v2 ;v2 = (estimated) (1.0 / (float)v4) vspltisw v5, 1 ;v5 = 1 vcfsx v5, v5, 0 ;v5 = (float)1 vnmsubfp v4, v3, v2, v5 ;v4 = -v3 * v2 + 1.0 vmaddfp v4, v4, v3, v3 ;v4 = v4 * v3 + v3(v2の逆数の計算終了) vspltisw v6, 0 ;v6 = 0.0 vmaddfp v0, v1, v4, v6 ;v0 = v1 / v2 + 0.0 |
vrsqrtefp v2, v1 ;v2 = (estimated)(1.0 / sqrt(v1)) vspltisw v3, 0 ;v3 = 0.0 vspltisw v5, 1 ;v5 = 1 vcfsx v7, v5, 0 ;v7 = 1.0 vcfsx v5, v5, 1 ;v5 = 0.5 vmaddfp v4, v2, v2, v3 vmaddfp v6, v2, v3, v5 vnmsubfp v0, v1, v4, v7 vmaddfp v0, v0, v6, v2 vmaddfp v0, v1, v0, v3 |