static inline int __diag308(unsigned long subcode, void *addr)
 {
-       register unsigned long _addr asm("0") = (unsigned long) addr;
-       register unsigned long _rc asm("1") = 0;
+       union register_pair r1;
 
+       r1.even = (unsigned long) addr;
+       r1.odd  = 0;
        asm volatile(
-               "       diag    %0,%2,0x308\n"
+               "       diag    %[r1],%[subcode],0x308\n"
                "0:     nopr    %%r7\n"
                EX_TABLE(0b,0b)
-               : "+d" (_addr), "+d" (_rc)
-               : "d" (subcode) : "cc", "memory");
-       return _rc;
+               : [r1] "+&d" (r1.pair)
+               : [subcode] "d" (subcode)
+               : "cc", "memory");
+       return r1.odd;
 }
 
 int diag308(unsigned long subcode, void *addr)