"       stcond  %1, %0\n"
                "       brne    1b"
                : "=&r"(result), "=o"(v->counter)
-               : "m"(v->counter), "ir"(i)
+               : "m"(v->counter), "rKs21"(i)
                : "cc");
 
        return result;
 {
        int result;
 
-       if (__builtin_constant_p(i))
+       if (__builtin_constant_p(i) && (i >= -1048575) && (i <= 1048576))
                result = atomic_sub_return(-i, v);
        else
                asm volatile(
                "       mov     %1, 1\n"
                "1:"
                : "=&r"(tmp), "=&r"(result), "=o"(v->counter)
-               : "m"(v->counter), "ir"(a), "ir"(u)
+               : "m"(v->counter), "rKs21"(a), "rKs21"(u)
                : "cc", "memory");
 
        return result;
 {
        int tmp, result;
 
-       if (__builtin_constant_p(a))
+       if (__builtin_constant_p(a) && (a >= -1048575) && (a <= 1048576))
                result = atomic_sub_unless(v, -a, u);
        else {
                result = 0;