Hirdetés

Keresés

Aktív témák

  • t3rm1nat0r

    csendes tag

    válasz t3rm1nat0r #45 üzenetére

    ..és íme a csoda..
    ehhez hasonlóan dolgozik a geforce/ati-nk.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>


    int pipeline[128][32];
    int parameter[2][8];
    int adder_tablazat[4*4*2][4];



    int main()
    {
    int c,i,j,k,l,mask,szam1=135,szam2=212;


    printf("%d * %d = %d\n",szam1,szam2,szam1*szam2);


    for(c=0;c<2;c++)//carry
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    int osszeg=i+j+c;
    int addr=c*16+i*4+j;
    mask=1;

    for(k=0;k<3;k++) {adder_tablazat[addr][k]=((osszeg & mask)>>k);mask<<=1;}
    }

    for(c=0;c<2;c++)//carry
    for(i=0;i<4;i++)
    for(j=0;j<4;j++)
    {
    int osszeg=i+j+c;
    mask=1;

    printf("%d + %d + %d =%d ",i,j,c,osszeg);
    for(k=0;k<3;k++) printf("%d",adder_tablazat[c*16+i*4+j][2-k]);
    printf("\n");
    }

    mask=1;
    for(k=0;k<8;k++) {parameter[0][k]=(szam1 & mask)>>k;mask<<=1;}
    mask=1;
    for(k=0;k<8;k++) {parameter[1][k]=(szam2 & mask)>>k;mask<<=1;}

    mask=1;
    for(k=0;k<32;k++) pipeline[0][k]=0;//carry + nullaval kezd




    int pl=8*8+1;

    for(l=0;l<pl;l++)
    {
    if(l==pl-1)//csak a vegen irja ki
    {
    for(j=0;j<pl;j++)
    {
    mask=0x8000;
    int bits=0;
    for(k=0;k<16;k++)
    {
    int bit=pipeline[j][15-k];
    printf("%d",bit);
    if(bit) bits|=mask;
    mask>>=1;
    }
    printf("= %d ",bits);
    printf(" cr= %d\n",pipeline[j][20]);

    }
    printf("\n");
    }

    for(j=pl;j>=0;j--)
    {
    int j2=j&7;//8 16-bites adder
    int bit_offset=j>>3;


    for(k=0;k<16;k+=2)
    {
    if((k>>1) == j2 )
    {
    int bita0=pipeline[j][k];
    int bita1=pipeline[j][k+1];
    int bitb0=0;
    int bitb1=0;
    int carry=pipeline[j][20];
    if(j2==0) carry=0;//adder start


    int d=k-bit_offset;
    if(d>=0 && d<8) bitb0=parameter[1][d];
    d++;
    if(d>=0 && d<8) bitb1=parameter[1][d];

    if(parameter[0][bit_offset]==0) //0-val szoroz
    {
    bitb0=0;
    bitb1=0;
    }


    int addra=(bita1<<1)+bita0;
    int addrb=(bitb1<<1)+bitb0;
    addra=(carry<<4) + (addra<<2) + addrb;


    pipeline[j+1][k ]=adder_tablazat[addra][0];
    pipeline[j+1][k+1]=adder_tablazat[addra][1];
    pipeline[j+1][20 ]=adder_tablazat[addra][2];//carry
    }
    else
    {
    pipeline[j+1][k] =pipeline[j][k];
    pipeline[j+1][k+1]=pipeline[j][k+1];
    }
    }
    }
    }


    return 0;
    }

Aktív témák