xref: /qemu/tests/tcg/s390x/div.c (revision 29b8de001f8ea2f36d4de5a250d1150492311529)
1*29b8de00SIlya Leoshkevich #include <assert.h>
2*29b8de00SIlya Leoshkevich #include <stdint.h>
3*29b8de00SIlya Leoshkevich 
4*29b8de00SIlya Leoshkevich static void test_dr(void)
5*29b8de00SIlya Leoshkevich {
6*29b8de00SIlya Leoshkevich     register int32_t r0 asm("r0") = -1;
7*29b8de00SIlya Leoshkevich     register int32_t r1 asm("r1") = -4241;
8*29b8de00SIlya Leoshkevich     int32_t b = 101, q, r;
9*29b8de00SIlya Leoshkevich 
10*29b8de00SIlya Leoshkevich     asm("dr %[r0],%[b]"
11*29b8de00SIlya Leoshkevich         : [r0] "+r" (r0), [r1] "+r" (r1)
12*29b8de00SIlya Leoshkevich         : [b] "r" (b)
13*29b8de00SIlya Leoshkevich         : "cc");
14*29b8de00SIlya Leoshkevich     q = r1;
15*29b8de00SIlya Leoshkevich     r = r0;
16*29b8de00SIlya Leoshkevich     assert(q == -41);
17*29b8de00SIlya Leoshkevich     assert(r == -100);
18*29b8de00SIlya Leoshkevich }
19*29b8de00SIlya Leoshkevich 
20*29b8de00SIlya Leoshkevich static void test_dlr(void)
21*29b8de00SIlya Leoshkevich {
22*29b8de00SIlya Leoshkevich     register uint32_t r0 asm("r0") = 0;
23*29b8de00SIlya Leoshkevich     register uint32_t r1 asm("r1") = 4243;
24*29b8de00SIlya Leoshkevich     uint32_t b = 101, q, r;
25*29b8de00SIlya Leoshkevich 
26*29b8de00SIlya Leoshkevich     asm("dlr %[r0],%[b]"
27*29b8de00SIlya Leoshkevich         : [r0] "+r" (r0), [r1] "+r" (r1)
28*29b8de00SIlya Leoshkevich         : [b] "r" (b)
29*29b8de00SIlya Leoshkevich         : "cc");
30*29b8de00SIlya Leoshkevich     q = r1;
31*29b8de00SIlya Leoshkevich     r = r0;
32*29b8de00SIlya Leoshkevich     assert(q == 42);
33*29b8de00SIlya Leoshkevich     assert(r == 1);
34*29b8de00SIlya Leoshkevich }
35*29b8de00SIlya Leoshkevich 
36*29b8de00SIlya Leoshkevich int main(void)
37*29b8de00SIlya Leoshkevich {
38*29b8de00SIlya Leoshkevich     test_dr();
39*29b8de00SIlya Leoshkevich     test_dlr();
40*29b8de00SIlya Leoshkevich }
41