aboutsummaryrefslogtreecommitdiffstats
path: root/runtime/ia32/vararg.S
diff options
context:
space:
mode:
authorXavier Leroy <xavierleroy@users.noreply.github.com>2015-03-31 10:19:44 +0200
committerXavier Leroy <xavierleroy@users.noreply.github.com>2015-03-31 10:19:44 +0200
commit47a6b116069cff9c71466bde1fd87d0775ec9175 (patch)
treecc6402162b64512db1f82ebbb5c94606f14ee3a8 /runtime/ia32/vararg.S
parent14f3f0dfb90c74b7e1bc96c4aee74fb88dd7923b (diff)
parentc1205952ab7e3be09cd1a0a9a4d4ee9ddeefe1ea (diff)
downloadcompcert-47a6b116069cff9c71466bde1fd87d0775ec9175.tar.gz
compcert-47a6b116069cff9c71466bde1fd87d0775ec9175.zip
Merge pull request #33 from AbsInt/struct-passing
ABI conformance for passing function arguments and returning function results of struct and union types
Diffstat (limited to 'runtime/ia32/vararg.S')
-rw-r--r--runtime/ia32/vararg.S12
1 files changed, 12 insertions, 0 deletions
diff --git a/runtime/ia32/vararg.S b/runtime/ia32/vararg.S
index ec55a454..78666c70 100644
--- a/runtime/ia32/vararg.S
+++ b/runtime/ia32/vararg.S
@@ -67,3 +67,15 @@ FUNCTION(__compcert_va_float64)
movl %edx, 0(%ecx)
ret
ENDFUNCTION(__compcert_va_float64)
+
+FUNCTION(__compcert_va_composite)
+ movl 4(%esp), %ecx // %ecx = ap parameter
+ movl 8(%esp), %edx // %edx = size of composite in bytes
+ movl 0(%ecx), %eax // %eax = current argument pointer
+ leal 3(%eax, %edx), %edx // advance by size
+ andl $0xfffffffc, %edx // and round up to multiple of 4
+ movl %edx, 0(%ecx) // update argument pointer
+ ret
+ENDFUNCTION(__compcert_va_composite)
+
+