* config/arc/gmon/profil.S (__profil, __profil_irq): Don't profile
Shouldn't profil should return -1 on failure?
config/arc/lib1funcs.S (__udivmodsi4):
@@ -393,7 +393,12 @@ SYM(__udivmodsi4):
lsr_s r1,r1
cmp_s r0,r1
xor.f r2,lp_count,31
+#if !defined (__EM__) && !defined (__HS__)
mov_s lp_count,r2
+#else
+ mov lp_count,r2
+ nop_s
+#endif /* !__EM__ && !__HS__ */
#endif /* !__ARC_NORM__ */
sub.cc r0,r0,r1
mov_s r3,3
This is in ! __ARC_NORM__ code - so this should never happen for __HS__ .
It can happen for __EM__ - and then we have another problem. AFAIK
__EM__ also has the LP_COUNT interlock that slows down every reference
to LP_COUNT by an ordinary instruction. So this ARC600 code will run
rather slow on it. OTOH, we can use the better handling of branch
instructions inside a zero overhead loop to our advantage here, like this:
#else /* ! __ARC_NORM__ */
lsr_s r2,r0
brhs.d r1,r2,.Lret0_3
#ifdef __EM__
mov lp_count,-1
asl_s r1,r1 ; den <<= 1
lp 1f
.Loop1:
brhi r1,r2,1f
asl.ls r1,r1
1:
sub_s r0,r0,r1
lsr_s r1,r1
cmp r0,r1
not r2,lp_count
mov.f lp_count,r2
#else /* !__EM__ */
mov_s r3,0
.Lloop1:
asl_s r1,r1 ; den <<= 1
brls.d r1,r2,@.Lloop1
sub_s r3,r3,1
sub_s r0,r0,r1
lsr_s r1,r1
cmp_s r0,r1
not_s r2,r3
mov.f lp_count,r3
#endif /* !__EM__ */
#endif /* !__ARC_NORM__
Hmm, somehow I lost the inner-loop explicit lp_count reference anyway, but
the version with lp is still one instruction inside the loop shorter.
Although the other is shorter statically.
OTOH, maybe not.f / mov_s is faster when followed by sub.cc ; depends on
what the ARC600 pipeline is like today.