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


#define get_ticks(var) { \
  unsigned int __a, __d; \
  asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \
  var = ((unsigned long) __a) | (((unsigned long) __d) << 32); \
  } while(0)




int main(int argc, char *argv[] )
{
  int i, j, n, m;
  int *B;

  if(argc < 3){
    printf("pass me 2 arguments!\n");
    return( -1 );
  }
  else
    {
      m = atoi(argv[1]);
      n = atoi(argv[2]);
    }

  B = (int *) malloc( m*n * sizeof(int) );

  /*                                                                             
  / 0 100 200 300 ... 100 (n-1) \                                                
  | 1 101 201 301 ...           |                                                
  | 2 102 ...                   |                                                
  | 3 103        i+100*j        |                                                
  | . ..                        |                                                
  | .                           |                                                
  \ m-1                   ???   /     */


  for( j=0; j<n; j++ )
    for( i=0; i<m; i++ )
      {
        B[j*m+i] =   100*j+i;
        //printf("idx=%d \tval=%d\n", j*m+i, 100*j+i);                           
      }



  unsigned long ticksB4, ticksAFT, ticks1, ticks2;

  int E[m][n], F[m][n], G[m][n];

  for( i=0; i<m; i++ )
    for( j=0; j<n; j++ )
      {
        E[i][j] =     100*j+i;
        F[i][j] =   -(100*j+i);
        //printf("E[%d,%d] =%d\n", i, j, E[i][j]);                               
      }


  printf(" -- sum #1 -- \n");
  get_ticks(ticksB4);

  for( i=0; i<m; i++ )
    for( j=0; j<n; j++ )
      {
        G[i][j] = E[i][j] + F[i][j];
        //printf("G[%d,%d] =%d\n", i, j, G[i][j]);                               
      }

  get_ticks(ticksAFT);
  ticks1 = ticksAFT - ticksB4;
  printf(" 1) ASM timer= %.5ld\n", ticks1 );




  printf(" -- sum #2 -- \n");
  get_ticks(ticksB4);

  for( j=0; j<n; j++ )
    for( i=0; i<m; i++ )
      {
        G[i][j] = E[i][j] + F[i][j];
        //printf("G[%d,%d] =%d\n", i, j, G[i][j]);                               
      }

  get_ticks(ticksAFT);
  ticks2 = ticksAFT - ticksB4;
  printf(" 2) ASM timer= %.5ld\n", ticks2 );

  return 0;
}





