Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/sdl/stdlib/SDL_mslibc.c
21337 views
1
/*
2
Simple DirectMedia Layer
3
Copyright (C) 1997-2025 Sam Lantinga <[email protected]>
4
5
This software is provided 'as-is', without any express or implied
6
warranty. In no event will the authors be held liable for any damages
7
arising from the use of this software.
8
9
Permission is granted to anyone to use this software for any purpose,
10
including commercial applications, and to alter it and redistribute it
11
freely, subject to the following restrictions:
12
13
1. The origin of this software must not be misrepresented; you must not
14
claim that you wrote the original software. If you use this software
15
in a product, an acknowledgment in the product documentation would be
16
appreciated but is not required.
17
2. Altered source versions must be plainly marked as such, and must not be
18
misrepresented as being the original software.
19
3. This notice may not be removed or altered from any source distribution.
20
*/
21
#include "SDL_internal.h"
22
23
// This file contains SDL replacements for functions in the C library
24
25
#if !defined(HAVE_LIBC) && !defined(SDL_STATIC_LIB)
26
27
// These are some C runtime intrinsics that need to be defined
28
29
#ifdef _MSC_VER
30
31
#ifndef __FLTUSED__
32
#define __FLTUSED__
33
__declspec(selectany) int _fltused = 1;
34
#endif
35
36
#ifdef _M_IX86
37
38
// Float to long
39
void __declspec(naked) _ftol()
40
{
41
/* *INDENT-OFF* */
42
__asm {
43
push ebp
44
mov ebp,esp
45
sub esp,20h
46
and esp,0FFFFFFF0h
47
fld st(0)
48
fst dword ptr [esp+18h]
49
fistp qword ptr [esp+10h]
50
fild qword ptr [esp+10h]
51
mov edx,dword ptr [esp+18h]
52
mov eax,dword ptr [esp+10h]
53
test eax,eax
54
je integer_QnaN_or_zero
55
arg_is_not_integer_QnaN:
56
fsubp st(1),st
57
test edx,edx
58
jns positive
59
fstp dword ptr [esp]
60
mov ecx,dword ptr [esp]
61
xor ecx,80000000h
62
add ecx,7FFFFFFFh
63
adc eax,0
64
mov edx,dword ptr [esp+14h]
65
adc edx,0
66
jmp localexit
67
positive:
68
fstp dword ptr [esp]
69
mov ecx,dword ptr [esp]
70
add ecx,7FFFFFFFh
71
sbb eax,0
72
mov edx,dword ptr [esp+14h]
73
sbb edx,0
74
jmp localexit
75
integer_QnaN_or_zero:
76
mov edx,dword ptr [esp+14h]
77
test edx,7FFFFFFFh
78
jne arg_is_not_integer_QnaN
79
fstp dword ptr [esp+18h]
80
fstp dword ptr [esp+18h]
81
localexit:
82
leave
83
ret
84
}
85
/* *INDENT-ON* */
86
}
87
88
void _ftol2_sse()
89
{
90
_ftol();
91
}
92
93
void _ftol2()
94
{
95
_ftol();
96
}
97
98
void __declspec(naked) _ftoul2_legacy()
99
{
100
static const Uint64 LLONG_MAX_PLUS_ONE = 0x43e0000000000000ULL;
101
/* *INDENT-OFF* */
102
__asm {
103
fld qword ptr [LLONG_MAX_PLUS_ONE]
104
fcom
105
fnstsw ax
106
test ah, 41h
107
jnp greater_than_int64
108
109
fstp st(0)
110
jmp _ftol
111
112
greater_than_int64:
113
fsub st(1), st(0)
114
fcomp
115
fnstsw ax
116
test ah, 41h
117
jnz greater_than_uint64
118
119
call _ftol
120
add edx, 80000000h
121
ret
122
123
greater_than_uint64:
124
xor eax, eax
125
mov edx, 80000000h
126
ret
127
}
128
/* *INDENT-ON* */
129
}
130
131
// 64-bit math operators for 32-bit systems
132
void __declspec(naked) _allmul()
133
{
134
/* *INDENT-OFF* */
135
__asm {
136
mov eax, dword ptr[esp+8]
137
mov ecx, dword ptr[esp+10h]
138
or ecx, eax
139
mov ecx, dword ptr[esp+0Ch]
140
jne hard
141
mov eax, dword ptr[esp+4]
142
mul ecx
143
ret 10h
144
hard:
145
push ebx
146
mul ecx
147
mov ebx, eax
148
mov eax, dword ptr[esp+8]
149
mul dword ptr[esp+14h]
150
add ebx, eax
151
mov eax, dword ptr[esp+8]
152
mul ecx
153
add edx, ebx
154
pop ebx
155
ret 10h
156
}
157
/* *INDENT-ON* */
158
}
159
160
void __declspec(naked) _alldiv()
161
{
162
/* *INDENT-OFF* */
163
__asm {
164
push edi
165
push esi
166
push ebx
167
xor edi,edi
168
mov eax,dword ptr [esp+14h]
169
or eax,eax
170
jge L1
171
inc edi
172
mov edx,dword ptr [esp+10h]
173
neg eax
174
neg edx
175
sbb eax,0
176
mov dword ptr [esp+14h],eax
177
mov dword ptr [esp+10h],edx
178
L1:
179
mov eax,dword ptr [esp+1Ch]
180
or eax,eax
181
jge L2
182
inc edi
183
mov edx,dword ptr [esp+18h]
184
neg eax
185
neg edx
186
sbb eax,0
187
mov dword ptr [esp+1Ch],eax
188
mov dword ptr [esp+18h],edx
189
L2:
190
or eax,eax
191
jne L3
192
mov ecx,dword ptr [esp+18h]
193
mov eax,dword ptr [esp+14h]
194
xor edx,edx
195
div ecx
196
mov ebx,eax
197
mov eax,dword ptr [esp+10h]
198
div ecx
199
mov edx,ebx
200
jmp L4
201
L3:
202
mov ebx,eax
203
mov ecx,dword ptr [esp+18h]
204
mov edx,dword ptr [esp+14h]
205
mov eax,dword ptr [esp+10h]
206
L5:
207
shr ebx,1
208
rcr ecx,1
209
shr edx,1
210
rcr eax,1
211
or ebx,ebx
212
jne L5
213
div ecx
214
mov esi,eax
215
mul dword ptr [esp+1Ch]
216
mov ecx,eax
217
mov eax,dword ptr [esp+18h]
218
mul esi
219
add edx,ecx
220
jb L6
221
cmp edx,dword ptr [esp+14h]
222
ja L6
223
jb L7
224
cmp eax,dword ptr [esp+10h]
225
jbe L7
226
L6:
227
dec esi
228
L7:
229
xor edx,edx
230
mov eax,esi
231
L4:
232
dec edi
233
jne L8
234
neg edx
235
neg eax
236
sbb edx,0
237
L8:
238
pop ebx
239
pop esi
240
pop edi
241
ret 10h
242
}
243
/* *INDENT-ON* */
244
}
245
246
void __declspec(naked) _aulldiv()
247
{
248
/* *INDENT-OFF* */
249
__asm {
250
push ebx
251
push esi
252
mov eax,dword ptr [esp+18h]
253
or eax,eax
254
jne L1
255
mov ecx,dword ptr [esp+14h]
256
mov eax,dword ptr [esp+10h]
257
xor edx,edx
258
div ecx
259
mov ebx,eax
260
mov eax,dword ptr [esp+0Ch]
261
div ecx
262
mov edx,ebx
263
jmp L2
264
L1:
265
mov ecx,eax
266
mov ebx,dword ptr [esp+14h]
267
mov edx,dword ptr [esp+10h]
268
mov eax,dword ptr [esp+0Ch]
269
L3:
270
shr ecx,1
271
rcr ebx,1
272
shr edx,1
273
rcr eax,1
274
or ecx,ecx
275
jne L3
276
div ebx
277
mov esi,eax
278
mul dword ptr [esp+18h]
279
mov ecx,eax
280
mov eax,dword ptr [esp+14h]
281
mul esi
282
add edx,ecx
283
jb L4
284
cmp edx,dword ptr [esp+10h]
285
ja L4
286
jb L5
287
cmp eax,dword ptr [esp+0Ch]
288
jbe L5
289
L4:
290
dec esi
291
L5:
292
xor edx,edx
293
mov eax,esi
294
L2:
295
pop esi
296
pop ebx
297
ret 10h
298
}
299
/* *INDENT-ON* */
300
}
301
302
void __declspec(naked) _allrem()
303
{
304
/* *INDENT-OFF* */
305
__asm {
306
push ebx
307
push edi
308
xor edi,edi
309
mov eax,dword ptr [esp+10h]
310
or eax,eax
311
jge L1
312
inc edi
313
mov edx,dword ptr [esp+0Ch]
314
neg eax
315
neg edx
316
sbb eax,0
317
mov dword ptr [esp+10h],eax
318
mov dword ptr [esp+0Ch],edx
319
L1:
320
mov eax,dword ptr [esp+18h]
321
or eax,eax
322
jge L2
323
mov edx,dword ptr [esp+14h]
324
neg eax
325
neg edx
326
sbb eax,0
327
mov dword ptr [esp+18h],eax
328
mov dword ptr [esp+14h],edx
329
L2:
330
or eax,eax
331
jne L3
332
mov ecx,dword ptr [esp+14h]
333
mov eax,dword ptr [esp+10h]
334
xor edx,edx
335
div ecx
336
mov eax,dword ptr [esp+0Ch]
337
div ecx
338
mov eax,edx
339
xor edx,edx
340
dec edi
341
jns L4
342
jmp L8
343
L3:
344
mov ebx,eax
345
mov ecx,dword ptr [esp+14h]
346
mov edx,dword ptr [esp+10h]
347
mov eax,dword ptr [esp+0Ch]
348
L5:
349
shr ebx,1
350
rcr ecx,1
351
shr edx,1
352
rcr eax,1
353
or ebx,ebx
354
jne L5
355
div ecx
356
mov ecx,eax
357
mul dword ptr [esp+18h]
358
xchg eax,ecx
359
mul dword ptr [esp+14h]
360
add edx,ecx
361
jb L6
362
cmp edx,dword ptr [esp+10h]
363
ja L6
364
jb L7
365
cmp eax,dword ptr [esp+0Ch]
366
jbe L7
367
L6:
368
sub eax,dword ptr [esp+14h]
369
sbb edx,dword ptr [esp+18h]
370
L7:
371
sub eax,dword ptr [esp+0Ch]
372
sbb edx,dword ptr [esp+10h]
373
dec edi
374
jns L8
375
L4:
376
neg edx
377
neg eax
378
sbb edx,0
379
L8:
380
pop edi
381
pop ebx
382
ret 10h
383
}
384
/* *INDENT-ON* */
385
}
386
387
void __declspec(naked) _aullrem()
388
{
389
/* *INDENT-OFF* */
390
__asm {
391
push ebx
392
mov eax,dword ptr [esp+14h]
393
or eax,eax
394
jne L1
395
mov ecx,dword ptr [esp+10h]
396
mov eax,dword ptr [esp+0Ch]
397
xor edx,edx
398
div ecx
399
mov eax,dword ptr [esp+8]
400
div ecx
401
mov eax,edx
402
xor edx,edx
403
jmp L2
404
L1:
405
mov ecx,eax
406
mov ebx,dword ptr [esp+10h]
407
mov edx,dword ptr [esp+0Ch]
408
mov eax,dword ptr [esp+8]
409
L3:
410
shr ecx,1
411
rcr ebx,1
412
shr edx,1
413
rcr eax,1
414
or ecx,ecx
415
jne L3
416
div ebx
417
mov ecx,eax
418
mul dword ptr [esp+14h]
419
xchg eax,ecx
420
mul dword ptr [esp+10h]
421
add edx,ecx
422
jb L4
423
cmp edx,dword ptr [esp+0Ch]
424
ja L4
425
jb L5
426
cmp eax,dword ptr [esp+8]
427
jbe L5
428
L4:
429
sub eax,dword ptr [esp+10h]
430
sbb edx,dword ptr [esp+14h]
431
L5:
432
sub eax,dword ptr [esp+8]
433
sbb edx,dword ptr [esp+0Ch]
434
neg edx
435
neg eax
436
sbb edx,0
437
L2:
438
pop ebx
439
ret 10h
440
}
441
/* *INDENT-ON* */
442
}
443
444
void __declspec(naked) _alldvrm()
445
{
446
/* *INDENT-OFF* */
447
__asm {
448
push edi
449
push esi
450
push ebp
451
xor edi,edi
452
xor ebp,ebp
453
mov eax,dword ptr [esp+14h]
454
or eax,eax
455
jge L1
456
inc edi
457
inc ebp
458
mov edx,dword ptr [esp+10h]
459
neg eax
460
neg edx
461
sbb eax,0
462
mov dword ptr [esp+14h],eax
463
mov dword ptr [esp+10h],edx
464
L1:
465
mov eax,dword ptr [esp+1Ch]
466
or eax,eax
467
jge L2
468
inc edi
469
mov edx,dword ptr [esp+18h]
470
neg eax
471
neg edx
472
sbb eax,0
473
mov dword ptr [esp+1Ch],eax
474
mov dword ptr [esp+18h],edx
475
L2:
476
or eax,eax
477
jne L3
478
mov ecx,dword ptr [esp+18h]
479
mov eax,dword ptr [esp+14h]
480
xor edx,edx
481
div ecx
482
mov ebx,eax
483
mov eax,dword ptr [esp+10h]
484
div ecx
485
mov esi,eax
486
mov eax,ebx
487
mul dword ptr [esp+18h]
488
mov ecx,eax
489
mov eax,esi
490
mul dword ptr [esp+18h]
491
add edx,ecx
492
jmp L4
493
L3:
494
mov ebx,eax
495
mov ecx,dword ptr [esp+18h]
496
mov edx,dword ptr [esp+14h]
497
mov eax,dword ptr [esp+10h]
498
L5:
499
shr ebx,1
500
rcr ecx,1
501
shr edx,1
502
rcr eax,1
503
or ebx,ebx
504
jne L5
505
div ecx
506
mov esi,eax
507
mul dword ptr [esp+1Ch]
508
mov ecx,eax
509
mov eax,dword ptr [esp+18h]
510
mul esi
511
add edx,ecx
512
jb L6
513
cmp edx,dword ptr [esp+14h]
514
ja L6
515
jb L7
516
cmp eax,dword ptr [esp+10h]
517
jbe L7
518
L6:
519
dec esi
520
sub eax,dword ptr [esp+18h]
521
sbb edx,dword ptr [esp+1Ch]
522
L7:
523
xor ebx,ebx
524
L4:
525
sub eax,dword ptr [esp+10h]
526
sbb edx,dword ptr [esp+14h]
527
dec ebp
528
jns L9
529
neg edx
530
neg eax
531
sbb edx,0
532
L9:
533
mov ecx,edx
534
mov edx,ebx
535
mov ebx,ecx
536
mov ecx,eax
537
mov eax,esi
538
dec edi
539
jne L8
540
neg edx
541
neg eax
542
sbb edx,0
543
L8:
544
pop ebp
545
pop esi
546
pop edi
547
ret 10h
548
}
549
/* *INDENT-ON* */
550
}
551
552
void __declspec(naked) _aulldvrm()
553
{
554
/* *INDENT-OFF* */
555
__asm {
556
push esi
557
mov eax,dword ptr [esp+14h]
558
or eax,eax
559
jne L1
560
mov ecx,dword ptr [esp+10h]
561
mov eax,dword ptr [esp+0Ch]
562
xor edx,edx
563
div ecx
564
mov ebx,eax
565
mov eax,dword ptr [esp+8]
566
div ecx
567
mov esi,eax
568
mov eax,ebx
569
mul dword ptr [esp+10h]
570
mov ecx,eax
571
mov eax,esi
572
mul dword ptr [esp+10h]
573
add edx,ecx
574
jmp L2
575
L1:
576
mov ecx,eax
577
mov ebx,dword ptr [esp+10h]
578
mov edx,dword ptr [esp+0Ch]
579
mov eax,dword ptr [esp+8]
580
L3:
581
shr ecx,1
582
rcr ebx,1
583
shr edx,1
584
rcr eax,1
585
or ecx,ecx
586
jne L3
587
div ebx
588
mov esi,eax
589
mul dword ptr [esp+14h]
590
mov ecx,eax
591
mov eax,dword ptr [esp+10h]
592
mul esi
593
add edx,ecx
594
jb L4
595
cmp edx,dword ptr [esp+0Ch]
596
ja L4
597
jb L5
598
cmp eax,dword ptr [esp+8]
599
jbe L5
600
L4:
601
dec esi
602
sub eax,dword ptr [esp+10h]
603
sbb edx,dword ptr [esp+14h]
604
L5:
605
xor ebx,ebx
606
L2:
607
sub eax,dword ptr [esp+8]
608
sbb edx,dword ptr [esp+0Ch]
609
neg edx
610
neg eax
611
sbb edx,0
612
mov ecx,edx
613
mov edx,ebx
614
mov ebx,ecx
615
mov ecx,eax
616
mov eax,esi
617
pop esi
618
ret 10h
619
}
620
/* *INDENT-ON* */
621
}
622
623
void __declspec(naked) _allshl()
624
{
625
/* *INDENT-OFF* */
626
__asm {
627
cmp cl,40h
628
jae RETZERO
629
cmp cl,20h
630
jae MORE32
631
shld edx,eax,cl
632
shl eax,cl
633
ret
634
MORE32:
635
mov edx,eax
636
xor eax,eax
637
and cl,1Fh
638
shl edx,cl
639
ret
640
RETZERO:
641
xor eax,eax
642
xor edx,edx
643
ret
644
}
645
/* *INDENT-ON* */
646
}
647
648
void __declspec(naked) _allshr()
649
{
650
/* *INDENT-OFF* */
651
__asm {
652
cmp cl,3Fh
653
jae RETSIGN
654
cmp cl,20h
655
jae MORE32
656
shrd eax,edx,cl
657
sar edx,cl
658
ret
659
MORE32:
660
mov eax,edx
661
sar edx,1Fh
662
and cl,1Fh
663
sar eax,cl
664
ret
665
RETSIGN:
666
sar edx,1Fh
667
mov eax,edx
668
ret
669
}
670
/* *INDENT-ON* */
671
}
672
673
void __declspec(naked) _aullshr()
674
{
675
/* *INDENT-OFF* */
676
__asm {
677
cmp cl,40h
678
jae RETZERO
679
cmp cl,20h
680
jae MORE32
681
shrd eax,edx,cl
682
shr edx,cl
683
ret
684
MORE32:
685
mov eax,edx
686
xor edx,edx
687
and cl,1Fh
688
shr eax,cl
689
ret
690
RETZERO:
691
xor eax,eax
692
xor edx,edx
693
ret
694
}
695
/* *INDENT-ON* */
696
}
697
698
void __declspec(naked) _chkstk(void)
699
{
700
__asm {
701
push ecx
702
mov ecx,esp ; lea ecx,dword ptr [esp]+4
703
add ecx,4
704
sub ecx,eax
705
sbb eax,eax
706
not eax
707
and ecx,eax
708
mov eax,esp
709
and eax,0xfffff000
710
L1:
711
cmp ecx,eax
712
jb short L2
713
mov eax,ecx
714
pop ecx
715
xchg esp,eax
716
mov eax,dword ptr [eax]
717
mov dword ptr [esp],eax
718
ret
719
L2:
720
sub eax,0x1000
721
test dword ptr [eax],eax
722
jmp short L1
723
}
724
}
725
726
void __declspec(naked) _alloca_probe_8(void)
727
{
728
/* *INDENT-OFF* */
729
__asm {
730
push ecx
731
mov ecx,esp ; lea ecx,dword ptr [esp]+8
732
add ecx,8
733
sub ecx,eax
734
and ecx,0x7
735
add eax,ecx
736
sbb ecx,ecx
737
or eax,ecx
738
pop ecx
739
jmp _chkstk
740
}
741
/* *INDENT-ON* */
742
}
743
744
void __declspec(naked) _alloca_probe_16(void)
745
{
746
/* *INDENT-OFF* */
747
__asm {
748
push ecx
749
mov ecx,esp ; lea ecx,dword ptr [esp]+8
750
add ecx,8
751
sub ecx,eax
752
and ecx,0xf
753
add eax,ecx
754
sbb ecx,ecx
755
or eax,ecx
756
pop ecx
757
jmp _chkstk
758
}
759
/* *INDENT-ON* */
760
}
761
762
#endif // _M_IX86
763
764
#endif // MSC_VER
765
766
#ifdef __ICL
767
/* The classic Intel compiler generates calls to _intel_fast_memcpy
768
* and _intel_fast_memset when building an optimized SDL library */
769
void *_intel_fast_memcpy(void *dst, const void *src, size_t len)
770
{
771
return SDL_memcpy(dst, src, len);
772
}
773
void *_intel_fast_memset(void *dst, int c, size_t len)
774
{
775
return SDL_memset(dst, c, len);
776
}
777
#endif
778
779
#endif // !HAVE_LIBC && !SDL_STATIC_LIB
780
781