[SelectionDAG] Fix calling convention in expansion of ?MULO.
authorwhitequark <whitequark@whitequark.org>
Tue, 4 Oct 2016 09:07:49 +0000 (09:07 +0000)
committerwhitequark <whitequark@whitequark.org>
Tue, 4 Oct 2016 09:07:49 +0000 (09:07 +0000)
commit7c4fe0e9a323c849f3ab14354cbf1bb00fce1ee7
treec28b13377c1e55e24dd42f14d8d2f3768e96360d
parentd2a6d7b2037b82c38adec187a76f3dac4626a9f6
[SelectionDAG] Fix calling convention in expansion of ?MULO.

The SMULO/UMULO DAG nodes, when not directly supported by the target,
expand to a multiplication twice as wide. In case that the resulting
type is not legal, an __mul?i3 intrinsic is used. Since the type is
not legal, the legalizer cannot directly call the intrinsic with
the wide arguments; instead, it "pre-lowers" them by splitting them
in halves.

The "pre-lowering" code in essence made assumptions about
the calling convention, specifically that i(N*2) values will be
split into two iN values and passed in consecutive registers in
little-endian order. This, naturally, breaks on a big-endian system,
such as our OR1K out-of-tree backend.

Thanks to James Miller <james@aatch.net> for help in debugging.

Differential Revision: https://reviews.llvm.org/D25223

llvm-svn: 283203
llvm/lib/CodeGen/SelectionDAG/LegalizeDAG.cpp