VMOVUPD(MEM(RDI,RSI,1), ZMM(26))
    VMOVUPD(MEM(RDI,RSI,1,64), ZMM(27))
    VMOVUPD(MEM(RDI,RSI,2), ZMM(28))
    VMOVUPD(MEM(RDI,RSI,2,64), ZMM(29))
    VMOVUPD(MEM(RDI,R(13),1), ZMM(30))
    VMOVUPD(MEM(RDI,R(13),1,64), ZMM(31))

    JMP(.DDONE)

    LABEL(.DGENSTORED)

    MOV(RDI, VAR(cs_c))
    MOV(RAX, VAR(rs_c))
    LEA(RDI, MEM(,RDI,8))
    MOV(R(8), MEM(RBX))
    VBROADCASTSS(YMM(4), VAR(rs_c))
    VMOVAPS(YMM(5), VAR(offsetPtr))
    VPMULLD(YMM(4), YMM(5), YMM(4))
    LEA(RDX, MEM(RCX,RAX,8))
    MOV(RSI, 0x3F)
    SAL1(R(8)) // shift out the sign bit to check for +/- zero
    JZ(.DGENSTORBZ)

    KMOV(K(1), ESI)
    KMOV(K(2), ESI)
    VGATHERDPD(ZMM(2) MASK_K(1), MEM(RCX,YMM(4),8))
    VGATHERDPD(ZMM(3) MASK_K(2), MEM(RDX,YMM(4),8))
    VFMADD231PD(ZMM(2), ZMM(1), ZMM( 8))
    VFMADD231PD(ZMM(3), ZMM(1), ZMM( 9))
    KMOV(K(1), ESI)
    KMOV(K(2), ESI)
Beispiel #2
0
            JZ(PACK30_DONE)
            VMOVUPD(MEM(R15,RDI,4,192), ZMM(12))
            SUB(RSI, IMM(1))
            JZ(PACK30_DONE)
            VMOVUPD(MEM(R15,R12,1,192), ZMM(13))
            SUB(RSI, IMM(1))
            JZ(PACK30_DONE)
            VMOVUPD(MEM(R15,R11,2,192), ZMM(14))

            JMP(PACK30_DONE)

        LABEL(PACK30_G)

            VPBROADCASTD(ZMM(4), VAR(inca))
            MOV(RBX, VAR(offsetPtr))
            VPMULLD(YMM(0), YMM(4), MEM(RBX, 0))
            VPMULLD(YMM(1), YMM(4), MEM(RBX,32))
            VPMULLD(YMM(2), YMM(4), MEM(RBX,64))
            VPMULLD(YMM(3), YMM(4), MEM(RBX,96))

            LABEL(PACK30_G_LOOP)

                KXNORW(K(1), K(0), K(0))
                KXNORW(K(2), K(0), K(0))
                KXNORW(K(3), K(0), K(0))
                KSHIFTRW(K(4), K(3), IMM(10))
                VGATHERDPD(ZMM(4) MASK_K(1), MEM(RAX,YMM(0),8))
                VGATHERDPD(ZMM(5) MASK_K(2), MEM(RAX,YMM(1),8))
                VGATHERDPD(ZMM(6) MASK_K(3), MEM(RAX,YMM(2),8))
                VGATHERDPD(ZMM(7) MASK_K(4), MEM(RAX,YMM(3),8))
                VMULPD(ZMM(4), ZMM(4), ZMM(31))
Beispiel #3
0
    VPXORD(ZMM(8), ZMM(8), ZMM(8)) //clear out registers
    VMOVAPS(ZMM( 9), ZMM(8))   MOV(R12, VAR(rs_c))
    VMOVAPS(ZMM(10), ZMM(8))   MOV(RSI, VAR(k)) //loop index
    VMOVAPS(ZMM(11), ZMM(8))   MOV(RAX, VAR(a)) //load address of a
    VMOVAPS(ZMM(12), ZMM(8))   MOV(RBX, VAR(b)) //load address of b
    VMOVAPS(ZMM(13), ZMM(8))   MOV(RCX, VAR(c)) //load address of c
    VMOVAPS(ZMM(14), ZMM(8))   VMOVAPD(ZMM(0), MEM(RBX)) //pre-load b
    VMOVAPS(ZMM(15), ZMM(8))   MOV(RDI, VAR(offsetPtr))
    VMOVAPS(ZMM(16), ZMM(8))   VMOVAPS(ZMM(4), MEM(RDI))
#if SCATTER_PREFETCH_C
    VMOVAPS(ZMM(17), ZMM(8))
    VMOVAPS(ZMM(18), ZMM(8))
    VMOVAPS(ZMM(19), ZMM(8))   VBROADCASTSS(ZMM(5), VAR(rs_c))
    VMOVAPS(ZMM(20), ZMM(8))
    VMOVAPS(ZMM(21), ZMM(8))   VPMULLD(ZMM(2), ZMM(4), ZMM(5))
    VMOVAPS(ZMM(22), ZMM(8))   VMOVAPS(YMM(3), MEM(RDI,64))
    VMOVAPS(ZMM(23), ZMM(8))   VPMULLD(YMM(3), YMM(3), YMM(5))
#else
    VMOVAPS(ZMM(17), ZMM(8))
    VMOVAPS(ZMM(18), ZMM(8))   LEA(R13, MEM(R12,R12,2))
    VMOVAPS(ZMM(19), ZMM(8))   LEA(R14, MEM(R12,R12,4))
    VMOVAPS(ZMM(20), ZMM(8))   LEA(R15, MEM(R13,R12,4))
    VMOVAPS(ZMM(21), ZMM(8))
    VMOVAPS(ZMM(22), ZMM(8))
    VMOVAPS(ZMM(23), ZMM(8))
#endif
    VMOVAPS(ZMM(24), ZMM(8))   VPSLLD(ZMM(4), ZMM(4), IMM(2))
    VMOVAPS(ZMM(25), ZMM(8))   MOV(R8, IMM(4*24*4))     //offset for 4 iterations
    VMOVAPS(ZMM(26), ZMM(8))   LEA(R9, MEM(R8,R8,2))    //*3
    VMOVAPS(ZMM(27), ZMM(8))   LEA(R10, MEM(R8,R8,4))   //*5
    VMOVAPS(ZMM(28), ZMM(8))   LEA(R11, MEM(R9,R8,4))   //*7