Mercurial > pub > dyncall > dyncall
annotate dyncallback/dyncall_args_x86.c @ 642:575760fc57b7
Added tag r1.4 for changeset 2147d1c9dc8a
author | Tassilo Philipp |
---|---|
date | Tue, 06 Dec 2022 21:11:43 +0100 |
parents | 2562c89d5bb5 |
children |
rev | line source |
---|---|
0 | 1 /* |
2 | |
3 Package: dyncall | |
4 Library: dyncallback | |
5 File: dyncallback/dyncall_args_x86.c | |
6 Description: Callback's Arguments VM - Implementation for x86 | |
7 License: | |
8 | |
533
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
9 Copyright (c) 2007-2022 Daniel Adler <dadler@uni-goettingen.de>, |
0 | 10 Tassilo Philipp <tphilipp@potion-studios.com> |
11 | |
12 Permission to use, copy, modify, and distribute this software for any | |
13 purpose with or without fee is hereby granted, provided that the above | |
14 copyright notice and this permission notice appear in all copies. | |
15 | |
16 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
17 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
18 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
19 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
20 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
21 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
22 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
23 | |
24 */ | |
25 | |
26 | |
27 #include "dyncall_args_x86.h" | |
28 | |
29 | |
30 | |
31 DCint dcbArgInt (DCArgs* p) { return p->vt->i32(p); } | |
32 DClonglong dcbArgLongLong(DCArgs* p) { return p->vt->i64(p); } | |
33 DCfloat dcbArgFloat (DCArgs* p) { return p->vt->f32(p); } | |
34 DCdouble dcbArgDouble (DCArgs* p) { return p->vt->f64(p); } | |
35 | |
36 /* promote to integer: bool, char, short, long and pointer */ | |
37 | |
38 DCbool dcbArgBool (DCArgs* p) { return ( dcbArgInt(p) == 0 ) ? 0 : 1; } | |
39 DCchar dcbArgChar (DCArgs* p) { return (char) dcbArgInt(p); } | |
40 DCshort dcbArgShort (DCArgs* p) { return (short) dcbArgInt(p); } | |
41 DClong dcbArgLong (DCArgs* p) { return (long) dcbArgInt(p); } | |
42 DCpointer dcbArgPointer (DCArgs* p) { return (DCpointer) dcbArgInt(p); } | |
43 | |
44 /* unsigned types */ | |
45 | |
46 DCuint dcbArgUInt (DCArgs* p) { return (DCuint) dcbArgInt(p); } | |
47 DCuchar dcbArgUChar (DCArgs* p) { return (DCuchar) dcbArgChar(p); } | |
48 DCushort dcbArgUShort (DCArgs* p) { return (DCushort) dcbArgShort(p); } | |
49 DCulong dcbArgULong (DCArgs* p) { return (DCulong) dcbArgLong(p); } | |
50 DCulonglong dcbArgULongLong(DCArgs* p) { return (DCulonglong) dcbArgLongLong(p); } | |
51 | |
580
2562c89d5bb5
- added missing return values for dcbArgAggr() on functions w/o aggregate support
Tassilo Philipp
parents:
544
diff
changeset
|
52 DCpointer dcbArgAggr (DCArgs* p, DCpointer target) { /* @@@AGGR not impl */ return NULL; } |
533
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
53 void dcbReturnAggr (DCArgs *args, DCValue *result, DCpointer ret) { /* @@@AGGR not impl */ } |
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
54 |
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
55 |
0 | 56 |
57 /* cdecl calling convention */ | |
58 | |
59 static int default_i32(DCArgs* args) | |
60 { | |
61 return *args->stack_ptr++; | |
62 } | |
63 | |
64 static long long default_i64(DCArgs* args) | |
65 { | |
66 long long result = * (long long*) args->stack_ptr; | |
67 args->stack_ptr += 2; | |
68 return result; | |
69 } | |
70 | |
71 static float default_f32(DCArgs* args) | |
72 { | |
73 float result = * ( (float*) args->stack_ptr ); | |
74 args->stack_ptr++; | |
75 return result; | |
76 } | |
77 | |
78 static double default_f64(DCArgs* args) | |
79 { | |
80 double result = * ( (double*) args->stack_ptr ); | |
81 args->stack_ptr += 2; | |
82 return result; | |
83 } | |
84 | |
85 DCArgsVT dcArgsVT_default = { default_i32, default_i64, default_f32, default_f64 }; | |
86 | |
87 /* thiscall (microsoft) calling convention */ | |
88 | |
89 static int this_i32(DCArgs* args) | |
90 { | |
91 if(args->fast_data[0]) { /* ecx register = this pointer */ | |
92 int thisArg = args->fast_data[0]; | |
93 args->fast_data[0] = 0; | |
94 return thisArg; | |
95 } | |
96 return *args->stack_ptr++; | |
97 } | |
98 | |
99 DCArgsVT dcArgsVT_this_ms = { this_i32, default_i64, default_f32, default_f64 }; | |
100 | |
101 /* fastcall (microsoft) calling convention */ | |
102 | |
103 static int fast_i32(DCArgs* args) | |
104 { | |
105 if(args->fast_count < 2) | |
106 return args->fast_data[args->fast_count++]; | |
107 else | |
108 return default_i32(args); | |
109 } | |
110 | |
111 DCArgsVT dcArgsVT_fast_ms = { fast_i32, default_i64, default_f32, default_f64 }; | |
112 | |
113 /* fastcall (gnu) calling convention */ | |
114 | |
115 static long long fast_gnu_i64(DCArgs* args) | |
116 { | |
117 args->fast_count += 2; | |
118 return default_i64(args); | |
119 } | |
120 | |
121 DCArgsVT dcArgsVT_fast_gnu = { fast_i32, fast_gnu_i64, default_f32, default_f64 }; | |
533
71c884e610f0
- integration of patches from Raphael Luba, Thekla, Inc.:
Tassilo Philipp
parents:
281
diff
changeset
|
122 |