qemu/tests/tcg/mips/user/ase/dsp/test_dsp_r1_extp.c
<<
>>
Prefs
   1#include<stdio.h>
   2#include<assert.h>
   3
   4int main()
   5{
   6    int rt, ach, acl, dsp;
   7    int result;
   8
   9    ach = 0x05;
  10    acl = 0xB4CB;
  11    dsp = 0x07;
  12    result = 0x000C;
  13
  14    __asm
  15        ("wrdsp %1, 0x01\n\t"
  16         "mthi %2, $ac1\n\t"
  17         "mtlo %3, $ac1\n\t"
  18         "extp %0, $ac1, 0x03\n\t"
  19         "rddsp %1\n\t"
  20         : "=r"(rt), "+r"(dsp)
  21         : "r"(ach), "r"(acl)
  22        );
  23    dsp = (dsp >> 14) & 0x01;
  24    assert(dsp == 0);
  25    assert(result == rt);
  26
  27    ach = 0x05;
  28    acl = 0xB4CB;
  29    dsp = 0x01;
  30
  31    __asm
  32        ("wrdsp %1, 0x01\n\t"
  33         "mthi %2, $ac1\n\t"
  34         "mtlo %3, $ac1\n\t"
  35         "extp %0, $ac1, 0x03\n\t"
  36         "rddsp %1\n\t"
  37         : "=r"(rt), "+r"(dsp)
  38         : "r"(ach), "r"(acl)
  39        );
  40    dsp = (dsp >> 14) & 0x01;
  41    assert(dsp == 1);
  42
  43    ach = 0;
  44    acl = 0x80000001;
  45    dsp = 0x1F;
  46    result = 0x80000001;
  47
  48    __asm
  49        ("wrdsp %1\n\t"
  50         "mthi %2, $ac2\n\t"
  51         "mtlo %3, $ac2\n\t"
  52         "extp %0, $ac2, 0x1F\n\t"
  53         "rddsp %1\n\t"
  54         : "=r"(rt), "+r"(dsp)
  55         : "r"(ach), "r"(acl)
  56        );
  57    dsp = (dsp >> 14) & 0x01;
  58    assert(dsp == 0);
  59    assert(result == rt);
  60
  61    return 0;
  62}
  63