xref: /qemu/tests/tcg/s390x/locfhr.c (revision 23097623)
1*23097623SIlya Leoshkevich /*
2*23097623SIlya Leoshkevich  * Test the LOCFHR instruction.
3*23097623SIlya Leoshkevich  *
4*23097623SIlya Leoshkevich  * SPDX-License-Identifier: GPL-2.0-or-later
5*23097623SIlya Leoshkevich  */
6*23097623SIlya Leoshkevich #include <assert.h>
7*23097623SIlya Leoshkevich #include <stdlib.h>
8*23097623SIlya Leoshkevich 
9*23097623SIlya Leoshkevich static inline __attribute__((__always_inline__)) long
locfhr(long r1,long r2,int m3,int cc)10*23097623SIlya Leoshkevich locfhr(long r1, long r2, int m3, int cc)
11*23097623SIlya Leoshkevich {
12*23097623SIlya Leoshkevich     cc <<= 28;
13*23097623SIlya Leoshkevich     asm("spm %[cc]\n"
14*23097623SIlya Leoshkevich         "locfhr %[r1],%[r2],%[m3]\n"
15*23097623SIlya Leoshkevich         : [r1] "+r" (r1)
16*23097623SIlya Leoshkevich         : [cc] "r" (cc), [r2] "r" (r2), [m3] "i" (m3)
17*23097623SIlya Leoshkevich         : "cc");
18*23097623SIlya Leoshkevich     return r1;
19*23097623SIlya Leoshkevich }
20*23097623SIlya Leoshkevich 
main(void)21*23097623SIlya Leoshkevich int main(void)
22*23097623SIlya Leoshkevich {
23*23097623SIlya Leoshkevich     assert(locfhr(0x1111111122222222, 0x3333333344444444, 8, 0) ==
24*23097623SIlya Leoshkevich            0x3333333322222222);
25*23097623SIlya Leoshkevich     assert(locfhr(0x5555555566666666, 0x7777777788888888, 11, 1) ==
26*23097623SIlya Leoshkevich            0x5555555566666666);
27*23097623SIlya Leoshkevich 
28*23097623SIlya Leoshkevich     return EXIT_SUCCESS;
29*23097623SIlya Leoshkevich }
30