cachepc-qemu

Fork of AMDESE/qemu with changes for cachepc side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-qemu
Log | Files | Refs | Submodules | LICENSE | sfeed.txt

test_r5900_divu1.c (1109B)


      1/*
      2 * Test R5900-specific DIVU1.
      3 */
      4
      5#include <stdio.h>
      6#include <inttypes.h>
      7#include <assert.h>
      8
      9struct quotient_remainder { uint32_t quotient, remainder; };
     10
     11static struct quotient_remainder divu1(uint32_t rs, uint32_t rt)
     12{
     13    uint32_t lo, hi;
     14
     15    __asm__ __volatile__ (
     16            "    divu1 $0, %2, %3\n"
     17            "    mflo1 %0\n"
     18            "    mfhi1 %1\n"
     19            : "=r" (lo), "=r" (hi)
     20            : "r" (rs), "r" (rt));
     21
     22    assert(rs / rt == lo);
     23    assert(rs % rt == hi);
     24
     25    return (struct quotient_remainder) { .quotient = lo, .remainder = hi };
     26}
     27
     28static void verify_divu1(uint32_t rs, uint32_t rt,
     29                         uint32_t expected_quotient,
     30                         uint32_t expected_remainder)
     31{
     32    struct quotient_remainder qr = divu1(rs, rt);
     33
     34    assert(qr.quotient == expected_quotient);
     35    assert(qr.remainder == expected_remainder);
     36}
     37
     38int main()
     39{
     40    verify_divu1(0, 1, 0, 0);
     41    verify_divu1(1, 1, 1, 0);
     42    verify_divu1(1, 2, 0, 1);
     43    verify_divu1(17, 19, 0, 17);
     44    verify_divu1(19, 17, 1, 2);
     45    verify_divu1(77773, 101, 770, 3);
     46
     47    return 0;
     48}