The adds both VMOVNt and VMOVNb instruction selection from the appropriate shuffles. We detect shuffle masks of the form:
0, N, 2, N+2, 4, N+4, ...
or
0, N+1, 2, N+3, 4, N+5, ...
ISel will also try the opposite patterns, with inputs reversed. These are selected to VMOVNt and VMOVNb respectively.
Details
Diff Detail
- Repository
- rG LLVM Github Monorepo
Event Timeline
llvm/lib/Target/ARM/ARMISelLowering.cpp | ||
---|---|---|
6906 | Why the checks for M[i]>= 0? |
There might be something wrong with this. A test I just ran failed in a way I don't understand yet. Give me a minute to figure out what's up.
llvm/lib/Target/ARM/ARMISelLowering.cpp | ||
---|---|---|
6906 | M[i] == -1 is "undef", so we can put whatever we want there. |
False alarm. I think the script just hickuped on the build for some reason. A rerun did just fine on the same thing.
It turns out that this as incorrrect, just not for the same reason I was thinking. I was missing type checks, so we were trying to form VMOVN's for 32bit types (which would fail to select). I've added the type checks and some extra tests for such cases.
Why the checks for M[i]>= 0?