Home | History | Annotate | Download | only in mips64
      1 #include <stdio.h>
      2 
      3 int main()
      4 {
      5 #if (_MIPS_ARCH_OCTEON)
      6    int t1 = 0;
      7    int t2 = 0;
      8    __asm__ volatile(
      9       ".set noreorder"          "\n\t"
     10       "move  $t0, $zero"        "\n\t"
     11       "label2:"                 "\n\t"
     12       "addiu $t0, $t0, 1"       "\n\t"
     13       "bbit0 $t0, 0x3, label2"  "\n\t"
     14       "nop"                     "\n\t"
     15       "move %0, $t0"            "\n\t"
     16       ".set reorder"            "\n\t"
     17       : "=r" (t1)
     18       :
     19       : "t0");
     20    __asm__ volatile(
     21       ".set noreorder"          "\n\t"
     22       "li    $t0, 0xff"         "\n\t"
     23       "label1:"                 "\n\t"
     24       "addiu $t0, $t0, -1"      "\n\t"
     25       "bbit1 $t0, 0x3, label1"  "\n\t"
     26       "nop"                     "\n\t"
     27       "move %0, $t0"            "\n\t"
     28       ".set reorder"            "\n\t"
     29       : "=r" (t2)
     30       :
     31       : "t0");
     32 
     33    printf("TEST bbit0: %s\n", t1 == 0x08 ? "PASS" : "FAIL");
     34    printf("TEST bbit1: %s\n", t2 == 0xF7 ? "PASS" : "FAIL");
     35 
     36    long int lt1 = 0;
     37    long int lt2 = 0;
     38    long int lt3 = 0xff00000000;
     39    long int lt4 = 0x100000000;
     40    /* Take 0x100000000 and loop until 35th bit is set
     41       by incrementing 0x100000000 at a time. */
     42    __asm__ volatile(
     43       ".set noreorder"           "\n\t"
     44       "move $t0, $zero"          "\n\t"
     45       "move $t1, %1"             "\n\t"
     46       "label4:"                  "\n\t"
     47       "dadd $t0, $t0, $t1"       "\n\t"
     48       "bbit032 $t0, 0x3, label4" "\n\t"
     49       "nop"                      "\n\t"
     50       "move %0, $t0"             "\n\t"
     51       ".set reorder"             "\n\t"
     52       : "=r" (lt1)
     53       : "r" (lt4)
     54       : "t0", "t1");
     55    /* Take 0xff00000000 and loop until 35th bit is cleared
     56       by decrementing 0x100000000 at a time. */
     57    __asm__ volatile(
     58       ".set noreorder"           "\n\t"
     59       "move $t0, %1"             "\n\t"
     60       "move $t1, %2"             "\n\t"
     61       "label3:"                  "\n\t"
     62       "dadd $t0, $t0, $t1"       "\n\t"
     63       "bbit132 $t0, 0x3, label3" "\n\t"
     64       "nop"                      "\n\t"
     65       "move %0, $t0"             "\n\t"
     66       ".set reorder"             "\n\t"
     67       : "=r" (lt2)
     68       : "r" (lt3), "r" (-lt4)
     69       : "t0", "t1");
     70 
     71    printf("TEST bbit032: %s\n", lt1 == 0x0800000000 ? "PASS" : "FAIL");
     72    printf("TEST bbit132: %s\n", lt2 == 0xF700000000 ? "PASS" : "FAIL");
     73 
     74 #endif
     75    return 0;
     76 }
     77