// HelloMMX.cpp
//
// von Martin Mittring     <mailto:Kosmokleaner@Kosmokleaner.de> <www.Kosmokleaner.de>
//
// Für (von mir sicher nicht beabsichtigte) Schäden übernehme ich keinerlei Haftung.
// Der Verkauf / die kommerzielle Nutzung dieses Quellcodes ist ohne Einwilligung möglich.
//
//////////////////////////////////////////////////////////////////////

#include <stdio.h> //   printf()
#include <conio.h> //   getchar()

int main(int argc, char* argv[])
{
    __int64 a=(((__int64)0x0082)<<32) | (((__int64)0x0082)<<16) | ((__int64)0x0082);
    __int64 b=(((__int64)0x0010)<<32) | (((__int64)0x0050)<<16) | ((__int64)0x00a0);
    __int64 c=0;
    __int64 r=0;

    _asm
    {
        movq mm0,a          // mm0=a
        movq mm1,b          // mm1=b

        pmullw mm0,mm1      // mm0=mm0*mm1

        movq c,mm0          // c=mm0

        emms
    }


    r=((__int64)0x10*(__int64)0x82); r<<=16;
    r|=((__int64)0x50*(__int64)0x82); r<<=16;
    r|=((__int64)0xa0*(__int64)0x82);


    printf("Hello MMX (in VisualC)\n\n");

    printf("%p.%p * %p.%p = %p.%p (%p.%p)\n",(int)(a>>32),(int)(a&(__int64)0xffffffff),
                                             (int)(b>>32),(int)(b&(__int64)0xffffffff),
                                             (int)(c>>32),(int)(c&(__int64)0xffffffff),
                                             (int)(r>>32),(int)(r&(__int64)0xffffffff));

    printf("\n");

    getchar();
    return 0;
}

