]> git.sesse.net Git - x264/blob - tools/checkasm-a.asm
Bump dates to 2012
[x264] / tools / checkasm-a.asm
1 ;*****************************************************************************
2 ;* checkasm-a.asm: assembly check tool
3 ;*****************************************************************************
4 ;* Copyright (C) 2008-2012 x264 project
5 ;*
6 ;* Authors: Loren Merritt <lorenm@u.washington.edu>
7 ;*
8 ;* This program is free software; you can redistribute it and/or modify
9 ;* it under the terms of the GNU General Public License as published by
10 ;* the Free Software Foundation; either version 2 of the License, or
11 ;* (at your option) any later version.
12 ;*
13 ;* This program is distributed in the hope that it will be useful,
14 ;* but WITHOUT ANY WARRANTY; without even the implied warranty of
15 ;* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16 ;* GNU General Public License for more details.
17 ;*
18 ;* You should have received a copy of the GNU General Public License
19 ;* along with this program; if not, write to the Free Software
20 ;* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111, USA.
21 ;*
22 ;* This program is also available under a commercial proprietary license.
23 ;* For more information, contact us at licensing@x264.com.
24 ;*****************************************************************************
25
26 %include "x86inc.asm"
27
28 SECTION_RODATA
29
30 error_message: db "failed to preserve register", 0
31
32 %ifdef WIN64
33 ; just random numbers to reduce the chance of incidental match
34 ALIGN 16
35 x6:  ddq 0x79445c159ce790641a1b2550a612b48c
36 x7:  ddq 0x86b2536fcd8cf6362eed899d5a28ddcd
37 x8:  ddq 0x3f2bf84fc0fcca4eb0856806085e7943
38 x9:  ddq 0xd229e1f5b281303facbd382dcf5b8de2
39 x10: ddq 0xab63e2e11fa38ed971aeaff20b095fd9
40 x11: ddq 0x77d410d5c42c882d89b0c0765892729a
41 x12: ddq 0x24b3c1d2a024048bc45ea11a955d8dd5
42 x13: ddq 0xdd7b8919edd427862e8ec680de14b47c
43 x14: ddq 0x11e53e2b2ac655ef135ce6888fa02cbf
44 x15: ddq 0x6de8f4c914c334d5011ff554472a7a10
45 n7:   dq 0x21f86d66c8ca00ce
46 n8:   dq 0x75b6ba21077c48ad
47 n9:   dq 0xed56bb2dcb3c7736
48 n10:  dq 0x8bda43d3fd1a7e06
49 n11:  dq 0xb64a9c9e5d318408
50 n12:  dq 0xdf9a54b303f1d3a3
51 n13:  dq 0x4a75479abd64e097
52 n14:  dq 0x249214109d5d1c88
53 %endif
54
55 SECTION .text
56
57 cextern_naked puts
58
59 ; max number of args used by any x264 asm function.
60 ; (max_args % 4) must equal 3 for stack alignment
61 %define max_args 15
62
63 %ifdef WIN64
64
65 ;-----------------------------------------------------------------------------
66 ; intptr_t x264_checkasm_call( intptr_t (*func)(), int *ok, ... )
67 ;-----------------------------------------------------------------------------
68 INIT_XMM
69 cglobal checkasm_call, 4,15,16
70     SUB  rsp, max_args*8
71     mov  r6, r0
72     mov  [rsp+stack_offset+16], r1
73     mov  r0, r2
74     mov  r1, r3
75     mov r2d, r4m ; FIXME truncates pointer
76     mov r3d, r5m ; FIXME truncates pointer
77 %assign i 4
78 %rep max_args-4
79     mov  r4, [rsp+stack_offset+8+(i+2)*8]
80     mov  [rsp+i*8], r4
81     %assign i i+1
82 %endrep
83 %assign i 6
84 %rep 16-6
85     mova m %+ i, [x %+ i]
86     %assign i i+1
87 %endrep
88 %assign i 7
89 %rep 15-7
90     mov  r %+ i, [n %+ i]
91     %assign i i+1
92 %endrep
93     call r6
94 %assign i 7
95 %rep 15-7
96     xor  r %+ i, [n %+ i]
97     or   r7, r %+ i
98     %assign i i+1
99 %endrep
100 %assign i 6
101 %rep 16-6
102     pxor m %+ i, [x %+ i]
103     por  m6, m %+ i
104     %assign i i+1
105 %endrep
106     packsswb m6, m6
107     movq r5, m6
108     or   r7, r5
109     jz .ok
110     mov  r4, rax
111     lea  r0, [error_message]
112     call puts
113     mov  r1, [rsp+stack_offset+16]
114     mov  dword [r1], 0
115     mov  rax, r4
116 .ok:
117     ADD  rsp, max_args*8
118     RET
119
120 %elifndef ARCH_X86_64
121
122 ; just random numbers to reduce the chance of incidental match
123 %define n3 dword 0x6549315c
124 %define n4 dword 0xe02f3e23
125 %define n5 dword 0xb78d0d1d
126 %define n6 dword 0x33627ba7
127
128 ;-----------------------------------------------------------------------------
129 ; intptr_t x264_checkasm_call( intptr_t (*func)(), int *ok, ... )
130 ;-----------------------------------------------------------------------------
131 cglobal checkasm_call, 1,7
132     mov  r3, n3
133     mov  r4, n4
134     mov  r5, n5
135     mov  r6, n6
136 %rep max_args
137     push dword [esp+24+max_args*4]
138 %endrep
139     call r0
140     add  esp, max_args*4
141     xor  r3, n3
142     xor  r4, n4
143     xor  r5, n5
144     xor  r6, n6
145     or   r3, r4
146     or   r5, r6
147     or   r3, r5
148     jz .ok
149     mov  r3, eax
150     lea  r1, [error_message]
151     push r1
152     call puts
153     add  esp, 4
154     mov  r1, r1m
155     mov  dword [r1], 0
156     mov  eax, r3
157 .ok:
158     RET
159
160 %endif ; ARCH_X86_64
161
162 ;-----------------------------------------------------------------------------
163 ; int x264_stack_pagealign( int (*func)(), int align )
164 ;-----------------------------------------------------------------------------
165 cglobal stack_pagealign, 2,2
166     push rbp
167     mov  rbp, rsp
168     and  rsp, ~0xfff
169     sub  rsp, r1
170     call r0
171     leave
172     RET
173