diff --git a/kernel/power/cdot_power9.S b/kernel/power/cdot_power9.S new file mode 100644 index 000000000..01d194c0c --- /dev/null +++ b/kernel/power/cdot_power9.S @@ -0,0 +1,242 @@ + .file "cdot.c" + .abiversion 2 + .section ".text" + .align 2 + .p2align 4,,15 + .globl cdot_k + .type cdot_k, @function +cdot_k: +.LCF0: +0: addis 2,12,.TOC.-.LCF0@ha + addi 2,2,.TOC.-.LCF0@l + .localentry cdot_k,.-cdot_k + mr. 9,3 + ble 0,.L10 + cmpdi 7,5,1 + beq 7,.L18 +.L3: + mtctr 9 + xxlxor 2,2,2 + sldi 5,5,3 + sldi 7,7,3 +#ifdef CONJ + fmr 12,2 +#endif + fmr 8,2 +#ifndef CONJ + fmr 9,2 +#endif + fmr 1,2 + .p2align 4,,15 +.L9: +#ifdef CONJ + lfs 9,0(4) + lfs 11,0(6) + lfs 10,4(6) + lfs 0,4(4) + add 6,6,7 + add 4,4,5 + fmadds 1,9,11,1 + fmadds 12,9,10,12 + fmadds 8,0,10,8 + fmadds 2,11,0,2 +#else + lfs 10,0(4) + lfs 12,0(6) + lfs 11,4(6) + lfs 0,4(4) + add 6,6,7 + add 4,4,5 + fmadds 1,10,12,1 + fmadds 8,10,11,8 + fmadds 9,0,11,9 + fmadds 2,12,0,2 +#endif + bdnz .L9 +.L7: +#ifdef CONJ + fsubs 2,12,2 + fadds 1,1,8 +#else + fadds 2,2,8 + fsubs 1,1,9 +#endif + blr + .p2align 4,,15 +.L18: + cmpdi 7,7,1 + bne 7,.L3 + rldicr. 10,9,0,60 + bne 0,.L19 + xxlxor 2,2,2 + li 8,0 +#ifdef CONJ + fmr 12,2 +#endif + fmr 8,2 +#ifndef CONJ + fmr 9,2 +#endif + fmr 1,2 +.L4: + addi 7,10,1 + sldi 8,8,2 + subf 10,10,9 + cmpd 7,7,9 + mtctr 10 + add 4,4,8 + add 6,6,8 + bgt 7,.L16 + li 10,-1 + rldicr 10,10,0,0 + cmpd 7,9,10 + beq 7,.L16 + .p2align 4,,15 +.L8: +#ifdef CONJ + lfs 9,0(4) + lfs 11,0(6) + lfs 10,4(6) + lfs 0,4(4) + addi 6,6,8 + addi 4,4,8 + fmadds 1,9,11,1 + fmadds 12,9,10,12 + fmadds 8,0,10,8 + fmadds 2,11,0,2 +#else + lfs 10,0(4) + lfs 12,0(6) + lfs 11,4(6) + lfs 0,4(4) + addi 6,6,8 + addi 4,4,8 + fmadds 1,10,12,1 + fmadds 8,10,11,8 + fmadds 9,0,11,9 + fmadds 2,12,0,2 +#endif + bdnz .L8 + b .L7 + .p2align 4,,15 +.L10: + xxlxor 1,1,1 + fmr 2,1 + blr +.L19: + addis 8,2,.LANCHOR0@toc@ha + sradi. 3,10,1 + xxspltib 42,0 + addi 8,8,.LANCHOR0@toc@l + lxv 32,0(8) + beq 0,.L12 + xxlor 6,42,42 + xxlor 4,42,42 + xxlor 0,42,42 + xxlor 7,42,42 + xxlor 5,42,42 + xxlor 3,42,42 + xxlor 12,42,42 + mr 7,4 + mr 8,6 + li 5,0 + .p2align 4,,15 +.L6: + lxv 43,0(8) + lxv 44,16(8) + addi 5,5,4 + addi 8,8,64 + addi 7,7,64 + lxv 45,-32(8) + lxv 33,-16(8) + lxv 8,-64(7) + lxv 9,-48(7) + cmpd 7,3,5 + lxv 10,-32(7) + lxv 11,-16(7) + vpermr 6,11,11,0 + vpermr 7,12,12,0 + vpermr 8,13,13,0 + vpermr 9,1,1,0 + xvmaddasp 12,43,8 + xvmaddasp 3,44,9 + xvmaddasp 0,8,38 + xvmaddasp 4,9,39 + xvmaddasp 6,10,40 + xvmaddasp 5,45,10 + xvmaddasp 42,11,41 + xvmaddasp 7,33,11 + bgt 7,.L6 + xvaddsp 12,12,3 + xvaddsp 0,0,4 + xvaddsp 12,12,5 + xvaddsp 0,0,6 + xvaddsp 12,12,7 + xvaddsp 42,0,42 +.L5: +#ifdef CONJ + xxpermdi 8,12,12,2 + xxpermdi 0,42,42,2 + cmpd 7,9,10 + sldi 8,10,1 + xvaddsp 8,8,12 + xvaddsp 0,0,42 + xxsldwi 1,8,8,3 + xxsldwi 12,0,0,3 + xxsldwi 8,8,8,2 + xxsldwi 0,0,0,2 + xscvspdp 1,1 + xscvspdp 12,12 + xscvspdp 8,8 +#else + xxpermdi 9,12,12,2 + xxpermdi 0,42,42,2 + cmpd 7,9,10 + sldi 8,10,1 + xvaddsp 9,9,12 + xvaddsp 0,0,42 + xxsldwi 1,9,9,3 + xxsldwi 2,0,0,3 + xxsldwi 9,9,9,2 + xxsldwi 0,0,0,2 + xscvspdp 8,2 + xscvspdp 1,1 + xscvspdp 9,9 +#endif + xscvspdp 2,0 + bgt 7,.L4 + b .L7 +.L12: + xxlor 12,42,42 + b .L5 +.L16: + li 9,1 + mtctr 9 + b .L8 + .long 0 + .byte 0,0,0,0,0,0,0,0 + .size cdot_k,.-cdot_k + .section .rodata + .align 4 + .set .LANCHOR0,. + 0 + .type swap_mask_arr, @object + .size swap_mask_arr, 16 +swap_mask_arr: + .byte 4 + .byte 5 + .byte 6 + .byte 7 + .byte 0 + .byte 1 + .byte 2 + .byte 3 + .byte 12 + .byte 13 + .byte 14 + .byte 15 + .byte 8 + .byte 9 + .byte 10 + .byte 11 + .ident "GCC: (SUSE Linux) 7.3.1 20180323 [gcc-7-branch revision 258812]" + .section .note.GNU-stack,"",@progbits