annotate portasm/portasm-x86.S @ 27:523c45dfa8fb

- refactored arm calling conventions' callvm code, so that the code that keeps the caller from overwriting the return value on some platforms also works on OpenBSD (before we casted the function pointer to have long long as return type, to hint the caller that there is one, but that triggers an intentional SIGABRT on OpenBSD for security reasons; now the decl reflects this, directly)
author cslag
date Tue, 15 Sep 2015 12:48:52 +0200
parents 3e629dc19168
children d5705f226298
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
0
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
1 /*
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
2
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
3 Package: dyncall
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
4 Library: portasm
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
5 File: portasm/portasm-x86.S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
6 Description: Portable Assembler Macros for x86
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
7 License:
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
8
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
9 Copyright (c) 2011-2015 Daniel Adler <dadler@uni-goettingen.de>
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
10
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
11 Permission to use, copy, modify, and distribute this software for any
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
12 purpose with or without fee is hereby granted, provided that the above
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
13 copyright notice and this permission notice appear in all copies.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
14
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
15 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
16 WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
17 MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
18 ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
19 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
20 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
21 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
22
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
23 */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
24
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
25
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
26
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
27 /* Common macros. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
28 #define XCONCAT(A,B) A##B
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
29 /* MASM syntax. */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
30 #if defined(GEN_MASM)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
31 .386
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
32 .MODEL FLAT
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
33 .CODE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
34 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
35 # define END_ASM END
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
36 # define GLOBAL(X) _##X PROC
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
37 # define BEGIN_PROC(X) OPTION PROLOGUE:NONE, EPILOGUE:NONE
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
38 # define END_PROC(X) _##X ENDP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
39 # define PUSH(R) push R
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
40 # define POP(R) pop R
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
41 # define MOVL(S,D) mov D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
42 # define ADDL(S,D) add D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
43 # define ANDL(S,D) and D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
44 # define SUBL(S,D) sub D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
45 # define SHRL(S,D) shr D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
46 # define RET() ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
47 # define CALL_DWORD(R,OFF) call DWORD(R,OFF)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
48 # define REP(X) rep X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
49 # define MOVSB movsb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
50 # define MOVSW movsw
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
51 # define MOVSD movsd
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
52 # define DWORD(R,OFF) dword ptr [R+OFF]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
53 # define QWORD(R,OFF) qword ptr [R+OFF]
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
54 # define LIT(X) X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
55 # define INT(X) int X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
56 # define HEX(X) XCONCAT(X,h)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
57 # define CALL(X) call X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
58 # define LEA(S,D) lea D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
59 # define ADD(S,D) add D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
60 # define CMP(S,D) cmp D,S
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
61 # define JE(T) je T
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
62 # define FLDS(OP) fld OP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
63 # define FLDL(OP) fld OP
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
64 # define LOCAL(NAME) NAME
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
65 #else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
66 /* GNU/SunPro Assembler AT&T Syntax */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
67 .text
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
68 # define BEGIN_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
69 # define END_ASM
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
70 # include "../autovar/autovar_OS.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
71 # if defined(OS_Win32) || defined(OS_Cygwin) || defined(OS_MinGW) || defined(OS_Darwin) || defined(OS_Minix)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
72 # define CSYM(X) _##X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
73 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
74 # define CSYM(X) X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
75 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
76 /* Systems that work without '%' prefix: MinGW,Apple */
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
77 # define EAX %eax
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
78 # define EBX %ebx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
79 # define ECX %ecx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
80 # define EDX %edx
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
81 # define ESI %esi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
82 # define EDI %edi
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
83 # define EBP %ebp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
84 # define ESP %esp
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
85 # define AL %al
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
86 # define AH %ah
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
87 # define BL %bl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
88 # define BH %bh
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
89 # define CL %cl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
90 # define CH %ch
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
91 # define DL %dl
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
92 # define DH %dh
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
93 # define GLOBAL(X) .globl CSYM(X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
94 # define BEGIN_PROC(X) CSYM(X):
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
95 # define END_PROC(X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
96 # define PUSH(R) pushl R
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
97 # define POP(R) popl R
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
98 # define MOVL(S,D) movl S,D
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
99 # define ADDL(S,D) addl S,D
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
100 # define ANDL(S,D) andl S,D
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
101 # define SUBL(S,D) subl S,D
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
102 # define SHRL(S,D) shrl S,D
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
103 # define RET() ret
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
104 # define CALL_DWORD(R,OFF) call *DWORD(R,OFF)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
105 # define REP(X) rep; X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
106 # define MOVSB movsb
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
107 # define MOVSW movsw
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
108 # define MOVSD movsd
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
109 # define DWORD(R,OFF) OFF(R)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
110 # define QWORD(R,OFF) OFF(R)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
111 # include "../autovar/autovar_CC.h"
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
112 # if defined CC_SUN
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
113 # define LIT(X) $X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
114 # else
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
115 # define LIT(X) XCONCAT($,X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
116 # endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
117 # define INT(X) int X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
118 # define HEX(X) XCONCAT(0x,X)
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
119 # define CALL(X) call X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
120 # define LEA(A,B) lea A,B
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
121 # define CMP(A,B) cmp A,B
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
122 # define JE(X) je X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
123 # define FLDS(X) flds X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
124 # define FLDL(X) fldl X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
125 # define ADD(A,B) add A,B
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
126 # define LOCAL(X) .X
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
127 #endif
3e629dc19168 initial from svn dyncall-1745
Daniel Adler
parents:
diff changeset
128