xref: /openbmc/qemu/tests/tcg/s390x/clgebr.c (revision 372886d2)
1*372886d2SIlya Leoshkevich /*
2*372886d2SIlya Leoshkevich  * Test the CLGEBR instruction.
3*372886d2SIlya Leoshkevich  *
4*372886d2SIlya Leoshkevich  * SPDX-License-Identifier: GPL-2.0-or-later
5*372886d2SIlya Leoshkevich  */
6*372886d2SIlya Leoshkevich #include <assert.h>
7*372886d2SIlya Leoshkevich #include <fenv.h>
8*372886d2SIlya Leoshkevich #include <stdlib.h>
9*372886d2SIlya Leoshkevich 
main(void)10*372886d2SIlya Leoshkevich int main(void)
11*372886d2SIlya Leoshkevich {
12*372886d2SIlya Leoshkevich     float r2 = -1;
13*372886d2SIlya Leoshkevich     long long r1;
14*372886d2SIlya Leoshkevich     int cc;
15*372886d2SIlya Leoshkevich 
16*372886d2SIlya Leoshkevich     feclearexcept(FE_ALL_EXCEPT);
17*372886d2SIlya Leoshkevich     asm("clgebr %[r1],%[m3],%[r2],%[m4]\n"
18*372886d2SIlya Leoshkevich         "ipm %[cc]\n"
19*372886d2SIlya Leoshkevich         : [r1] "=r" (r1)
20*372886d2SIlya Leoshkevich         , [cc] "=r" (cc)
21*372886d2SIlya Leoshkevich         : [m3] "i" (5) /* round toward 0 */
22*372886d2SIlya Leoshkevich         , [r2] "f" (r2)
23*372886d2SIlya Leoshkevich         , [m4] "i" (8) /* bit 0 is set, but must be ignored; XxC is not set */
24*372886d2SIlya Leoshkevich         : "cc");
25*372886d2SIlya Leoshkevich     cc >>= 28;
26*372886d2SIlya Leoshkevich 
27*372886d2SIlya Leoshkevich     assert(r1 == 0);
28*372886d2SIlya Leoshkevich     assert(cc == 3);
29*372886d2SIlya Leoshkevich     assert(fetestexcept(FE_ALL_EXCEPT) == (FE_INVALID | FE_INEXACT));
30*372886d2SIlya Leoshkevich 
31*372886d2SIlya Leoshkevich     return EXIT_SUCCESS;
32*372886d2SIlya Leoshkevich }
33