u32 edx;
u32 esi;
u32 edi;
+ u32 cond_c;
u32 cond_z;
u64 tmp64;
*(u16 *)edi = eax; edi -= 2; // stos
*(u32 *)edi = eax; edi -= 4; // stos
edx = (s32)eax >> 31; // cdq
- eax = ecx ? __builtin_ffs(ecx) - 1 : 0; // bsf
+ if (ecx) eax = __builtin_ffs(ecx) - 1; // bsf
tmp64 = ((u64)edx << 32) | eax;
- tmp64 = (s64)tmp64 <<= LOBYTE(ecx);
+ tmp64 = (s64)tmp64 << LOBYTE(ecx);
edx = tmp64 >> 32; eax = tmp64; // allshl
+ edi = eax;
tmp64 = ((u64)edx << 32) | eax;
- tmp64 = (s64)tmp64 >>= LOBYTE(ecx);
+ tmp64 = (s64)tmp64 >> LOBYTE(ecx);
edx = tmp64 >> 32; eax = tmp64; // allshr
eax = __builtin_bswap32(eax);
+ ecx ^= eax;
+ tmp64 = (u64)eax + ecx;
+ cond_c = tmp64 >> 32;
+ eax = (u32)tmp64;
+ cond_z = (eax == 0); // add64
+ while (ecx != 0) {
+ cond_c = *(u8 *)esi < *(u8 *)edi;
+ cond_z = (*(u8 *)esi == *(u8 *)edi); esi += 1, edi += 1;
+ ecx--;
+ if (cond_z != 0) break;
+ } // repne cmps
+ LOBYTE(ecx) = (!cond_z);
+ LOBYTE(ecx) += (u8)ecx + cond_c;
eax = 1;
return eax;
}