[PATCH] D27309: builtins: Add ARM Thumb1 implementation for uidiv and uidivmod
Michal Meloun via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Sat Mar 11 23:51:59 PST 2017
strejda added a comment.
In https://reviews.llvm.org/D27309#698696, @weimingz wrote:
> Most of the changes are guarded by __ARM_ARCH_ISA_THUMB == 1 and I reviewed again of the "else" part and they look OK except for one suspect:
> https://reviews.llvm.org/D30867
No, unfortunately, _ _ARM_ARCH_ISA_THUMB == n can't be used as selector for Thumb1 (or Thumb2) code.
Value of _ _ARM_ARCH_ISA_THUMB isn't based on actual compilation mode (-mthumb, -marm), its based on given CPU (or arch) capabilities.
Thus, if we compile library with '-marm -march=armv6' then _ _ARM_ARCH_ISA_THUMB is set to '1'. So we ends with Thumb1 code compiled using ARM ISA. Not a nice result, right?
So https://reviews.llvm.org/D30867 cannot help us.
I found these problems:
- Thumb[1][2] code selection is broken, "(_ _ARM_ARCH_ISA_THUMB == n && (defined(_ _THUMBEL_ _) || defined(_ _THUMBEB_ _))" is right condition. See: https://github.com/strejda/tegra/commit/91057bb46e54e350da87e354aed3189d469da458#diff-a8e5a4d82eadfcc89b4f54d6755a46b4L97
This one is fatal for FreeBSD.
- all Thumb1 and some Thumb2 functions are not properly decorated by DEFINE_COMPILERRT_THUMB_FUNCTION() This breaks debugging.
- usage of '.thumb' directive is inconsistent across files
- Thumb 1 version of __udivsi3 is broken and doesn't not work at all. See:
cmp r0, r1, lsl IMM shift
addhs r3, r3, IMM (1 << shift)
subhs r0, r0, r1, lsl IMM shift
and
lsls r2, r1, IMM shift
cmp r0, r2
blo 1f
subs r0, r0, r2
1:
adcs r3, r3
- There is no Thumb1 variant of __udivmodsi4
Repository:
rL LLVM
https://reviews.llvm.org/D27309
More information about the llvm-commits
mailing list