Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/mono.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorZoltan Varga <vargaz@gmail.com>2016-01-05 22:55:46 +0300
committerZoltan Varga <vargaz@gmail.com>2016-01-05 22:55:51 +0300
commitbac8b504e012353fb4ccdfe0d54225d1fa3bffaa (patch)
tree3189a4ba6851527d87e1a04e75a5ae00bf5928f7
parente442c34af4c4e02a34cbea4ef84996bca6151aff (diff)
[amd64] Enable LLVM for more parameter passing conventions.
-rw-r--r--mono/mini/mini-amd64.c17
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;