18 #ifndef _COBALT_ARM_ASM_UAPI_ARITH_H
19 #define _COBALT_ARM_ASM_UAPI_ARITH_H
21 #include <asm/xenomai/uapi/features.h>
23 #if __LINUX_ARM_ARCH__ >= 4 && (!defined(CONFIG_THUMB2_KERNEL) || !defined(CONFIG_FTRACE))
25 mach_arm_nodiv_ullimd(
const unsigned long long op,
26 const unsigned long long frac,
27 const unsigned rhs_integ);
29 #define xnarch_nodiv_ullimd(op, frac, integ) \
30 mach_arm_nodiv_ullimd((op), (frac), (integ))
33 mach_arm_nodiv_llimd(
const long long op,
34 const unsigned long long frac,
35 const unsigned rhs_integ);
37 #define xnarch_nodiv_llimd(op, frac, integ) \
38 mach_arm_nodiv_llimd((op), (frac), (integ))
40 #define xnarch_add96and64(l0, l1, l2, s0, s1) \
42 __asm__ ("adds %2, %2, %4\n\t" \
43 "adcs %1, %1, %3\n\t" \
44 "adc %0, %0, #0\n\t" \
45 : "+r"(l0), "+r"(l1), "+r"(l2) \
46 : "r"(s0), "r"(s1): "cc"); \
50 #include <cobalt/uapi/asm-generic/arith.h>
52 #if __LINUX_ARM_ARCH__ >= 4 && (!defined(CONFIG_THUMB2_KERNEL) || !defined(CONFIG_FTRACE))
53 #define mach_arm_nodiv_ullimd_str \
54 "umull %[tl], %[rl], %[opl], %[fracl]\n\t" \
55 "umull %[rm], %[rh], %[oph], %[frach]\n\t" \
56 "adds %[rl], %[rl], %[tl], lsr #31\n\t" \
57 "adcs %[rm], %[rm], #0\n\t" \
58 "adc %[rh], %[rh], #0\n\t" \
59 "umull %[tl], %[th], %[oph], %[fracl]\n\t" \
60 "adds %[rl], %[rl], %[tl]\n\t" \
61 "adcs %[rm], %[rm], %[th]\n\t" \
62 "adc %[rh], %[rh], #0\n\t" \
63 "umull %[tl], %[th], %[opl], %[frach]\n\t" \
64 "adds %[rl], %[rl], %[tl]\n\t" \
65 "adcs %[rm], %[rm], %[th]\n\t" \
66 "adc %[rh], %[rh], #0\n\t" \
67 "umlal %[rm], %[rh], %[opl], %[integ]\n\t" \
68 "mla %[rh], %[oph], %[integ], %[rh]\n\t"
71 mach_arm_nodiv_ullimd(
const unsigned long long op,
72 const unsigned long long frac,
73 const unsigned rhs_integ)
75 register unsigned rl __asm__(
"r5");
76 register unsigned rm __asm__(
"r0");
77 register unsigned rh __asm__(
"r1");
78 register unsigned fracl __asm__ (
"r2");
79 register unsigned frach __asm__ (
"r3");
80 register unsigned integ __asm__(
"r4") = rhs_integ;
81 register unsigned opl __asm__ (
"r6");
82 register unsigned oph __asm__ (
"r7");
83 register unsigned tl __asm__(
"r8");
84 register unsigned th __asm__(
"r9");
86 xnarch_u64tou32(op, oph, opl);
87 xnarch_u64tou32(frac, frach, fracl);
89 __asm__ (mach_arm_nodiv_ullimd_str
90 : [rl]
"=r"(rl), [rm]
"=r"(rm), [rh]
"=r"(rh),
91 [tl]
"=r"(tl), [th]
"=r"(th)
92 : [opl]
"r"(opl), [oph]
"r"(oph),
93 [fracl]
"r"(fracl), [frach]
"r"(frach),
97 return xnarch_u64fromu32(rh, rm);
101 mach_arm_nodiv_llimd(
const long long op,
102 const unsigned long long frac,
103 const unsigned rhs_integ)
105 register unsigned rl __asm__(
"r5");
106 register unsigned rm __asm__(
"r0");
107 register unsigned rh __asm__(
"r1");
108 register unsigned fracl __asm__ (
"r2");
109 register unsigned frach __asm__ (
"r3");
110 register unsigned integ __asm__(
"r4") = rhs_integ;
111 register unsigned opl __asm__ (
"r6");
112 register unsigned oph __asm__ (
"r7");
113 register unsigned tl __asm__(
"r8");
114 register unsigned th __asm__(
"r9");
115 register unsigned s __asm__(
"r10");
117 xnarch_u64tou32(op, oph, opl);
118 xnarch_u64tou32(frac, frach, fracl);
120 __asm__ (
"movs %[s], %[oph], lsr #30\n\t"
122 "rsbs %[opl], %[opl], #0\n\t"
123 "sbc %[oph], %[oph], %[oph], lsl #1\n"
125 mach_arm_nodiv_ullimd_str
128 "rsbs %[rm], %[rm], #0\n\t"
129 "sbc %[rh], %[rh], %[rh], lsl #1\n"
131 : [rl]
"=r"(rl), [rm]
"=r"(rm), [rh]
"=r"(rh),
132 [tl]
"=r"(tl), [th]
"=r"(th), [s]
"=r"(s)
133 : [opl]
"r"(opl), [oph]
"r"(oph),
134 [fracl]
"r"(fracl), [frach]
"r"(frach),
138 return xnarch_u64fromu32(rh, rm);
static int __attribute__((cold))
Test if a mutex structure contains a valid autoinitializer.
Definition: mutex.c:176