[RyuJIT/ARM32] Enable passing large split struct argument (#12050)
authorHyeongseok Oh <hseok82.oh@samsung.com>
Wed, 28 Jun 2017 18:01:18 +0000 (03:01 +0900)
committerBruce Forstall <brucefo@microsoft.com>
Wed, 28 Jun 2017 18:01:18 +0000 (11:01 -0700)
commit0ce4fab8647ac3fbc200c27adfcf31aaae0f660b
tree18e3162db4f7b757906c20d006286b2094f923fa
parent217ab30d021f27be6fe4f35126a88e592366acbf
[RyuJIT/ARM32] Enable passing large split struct argument (#12050)

* [RyuJIT/ARM32] Enable passing large split struct

This enables passing split struct larger than 16 bytes.
To support splitted struct, it defines new GenTree type - GenTreePutArgSplit.
GenTreePutArgSplit is similar with GenTreePutArgStk,
but it is used for splitted struct only
and it has additional field to save register information.
GenTreePutArgSplit node is generated in lower phase.

* Apply reviews: split struct argument passing

- Fix some comments:
genPutArgSplit, GenTreePutArgStk, GenTreePutArgSplit, NuwPutArg, ArgComplete
- Add assertion check in genPutArgSplit, genCallInstruction
- Rename variable: baseReg
- Change flag for GenTreePutArgSplit: _TARGET_ARM && !LEGACY_BACKEND
- Change type of gtOtherRegs in GenTreePutArgSplit
- Remove duplicated code: NewPutArg
- Implement spill & restore flag for GenTreePutArgSplit

* Apply reviews

- Rebase
- Update managing spillFlag for split struct
- Implement spill & restore code generation
- Fix typos and rename variables
- Fix bug related to print gentree for split struct

* Fix bug and comments

- Fix bug in regset.cpp
- Add comments in morph.cpp's NYI_ARM
- Fix comments' typo in lsraarmarcp.cpp
14 files changed:
src/jit/codegenarmarch.cpp
src/jit/codegenlinear.cpp
src/jit/codegenlinear.h
src/jit/gentree.cpp
src/jit/gentree.h
src/jit/gtlist.h
src/jit/gtstructs.h
src/jit/lower.cpp
src/jit/lower.h
src/jit/lsra.cpp
src/jit/lsraarm.cpp
src/jit/lsraarmarch.cpp
src/jit/morph.cpp
src/jit/regset.cpp