diff options
author | Zoltan Varga <vargaz@gmail.com> | 2016-01-05 22:55:46 +0300 |
---|---|---|
committer | Zoltan Varga <vargaz@gmail.com> | 2016-01-05 22:55:51 +0300 |
commit | bac8b504e012353fb4ccdfe0d54225d1fa3bffaa (patch) | |
tree | 3189a4ba6851527d87e1a04e75a5ae00bf5928f7 | |
parent | e442c34af4c4e02a34cbea4ef84996bca6151aff (diff) |
[amd64] Enable LLVM for more parameter passing conventions.
-rw-r--r-- | mono/mini/mini-amd64.c | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/mono/mini/mini-amd64.c b/mono/mini/mini-amd64.c index d90f82b4d8e..11eb6cecf25 100644 --- a/mono/mini/mini-amd64.c +++ b/mono/mini/mini-amd64.c @@ -2248,17 +2248,22 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig) case ArgInDoubleSSEReg: linfo->ret.storage = LLVMArgNormal; break; - case ArgValuetypeInReg: - if (sig->pinvoke) { - cfg->exception_message = g_strdup ("pinvoke + vtypes"); + case ArgValuetypeInReg: { + ainfo = &cinfo->ret; + + if (sig->pinvoke && + (ainfo->pair_storage [0] == ArgInFloatSSEReg || ainfo->pair_storage [0] == ArgInDoubleSSEReg || + ainfo->pair_storage [1] == ArgInFloatSSEReg || ainfo->pair_storage [1] == ArgInDoubleSSEReg)) { + cfg->exception_message = g_strdup ("pinvoke + vtype ret"); cfg->disable_llvm = TRUE; return linfo; } linfo->ret.storage = LLVMArgVtypeInReg; for (j = 0; j < 2; ++j) - linfo->ret.pair_storage [j] = arg_storage_to_llvm_arg_storage (cfg, cinfo->ret.pair_storage [j]); + linfo->ret.pair_storage [j] = arg_storage_to_llvm_arg_storage (cfg, ainfo->pair_storage [j]); break; + } case ArgValuetypeAddrInIReg: /* Vtype returned using a hidden argument */ linfo->ret.storage = LLVMArgVtypeRetAddr; @@ -2294,7 +2299,9 @@ mono_arch_get_llvm_call_info (MonoCompile *cfg, MonoMethodSignature *sig) linfo->args [i].storage = LLVMArgNormal; break; case ArgValuetypeInReg: - if (sig->pinvoke) { + if (sig->pinvoke && + (ainfo->pair_storage [0] == ArgInFloatSSEReg || ainfo->pair_storage [0] == ArgInDoubleSSEReg || + ainfo->pair_storage [1] == ArgInFloatSSEReg || ainfo->pair_storage [1] == ArgInDoubleSSEReg)) { cfg->exception_message = g_strdup ("pinvoke + vtypes"); cfg->disable_llvm = TRUE; return linfo; |