File: ttcalc4.inc

package info (click to toggle)
lazarus 2.0.0%2Bdfsg-2
  • links: PTS, VCS
  • area: main
  • in suites: buster
  • size: 214,460 kB
  • sloc: pascal: 1,862,622; xml: 265,709; cpp: 56,595; sh: 3,008; java: 609; makefile: 535; perl: 297; sql: 222; ansic: 137
file content (150 lines) | stat: -rw-r--r-- 3,002 bytes parent folder | download | duplicates (10)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
(*******************************************************************
 *
 *  TTCalc4.Inc                                                 1.2
 *
 *    Arithmetic and Vectorial Computations (inline assembly)
 *    This version is used for i386 FreePascal
 *
 *  Copyright 1996 David Turner, Robert Wilhelm and Werner Lemberg
 *
 *  This file is part of the FreeType project, and may only be used
 *  modified and distributed under the terms of the FreeType project
 *  license, LICENSE.TXT. By continuing to use, modify or distribute
 *  this file you indicate that you have read the license and
 *  understand and accept it fully.
 *
 *  NOTES : All vector operations were moved to the interpreter
 *
 ******************************************************************)

(**********************************************************)
(*                                                        *)
(* The following routines are inline assembly, they are   *)
(* thus processor and bitness specific. Replace them      *)
(* with your own if you want to port the TrueType Engine  *)

(**********************************************************)
(* 64 Bit Addition                                        *)

procedure Add64( var X, Y, Z : Int64 );// assembler;
begin
  X := Y + Z;
end;
{asm
  push %ebx
  push %edx

  mov  X,%ebx
  mov  (%ebx)  ,%eax
  mov  4(%ebx) ,%edx

  mov  Y,%ebx
  add  (%ebx)  ,%eax
  adc  4(%ebx) ,%edx

  mov  Z,%ebx
  mov  %eax, (%ebx)
  mov  %edx, 4(%ebx)

  pop  %edx
  pop  %ebx
end;}


(**********************************************************)
(* 64 Bit Substraction                                    *)

procedure Sub64( var X, Y, Z : Int64 );// assembler;
begin
  X := Y - Z;
end;
{asm
  push %ebx
  push %edx

  mov  X,%ebx
  mov  (%ebx)  ,%eax
  mov  4(%ebx) ,%edx

  mov  Y,%ebx
  sub  (%ebx)  ,%eax
  sbb  4(%ebx) ,%edx

  mov  Z,%ebx
  mov  %eax, (%ebx)
  mov  %edx, 4(%ebx)

  pop  %edx
  pop  %ebx
end;}


(**********************************************************)
(* Multiply two Int32 to an Int64                         *)

procedure MulTo64( X, Y : Int32; out Z : Int64 );// assembler;
begin
  Z := int64(X) * int64(Y);
end;
{asm
  push  %ebx
  push  %edx

  mov   X,%eax
  imull Y

  mov   Z,%ebx
  mov   %eax, (%ebx)
  mov   %edx, 4(%ebx)

  pop   %edx
  pop   %ebx
end;}


(**********************************************************)
(* Divide an Int64 by an Int32                            *)

function Div64by32( X : Int64; Y : Int32 ) : Int32;// assembler;
begin
  Result := X div Y;
end;
{asm
  push  %ebx
  push  %edx

  mov  X,%ebx
  mov  (%ebx)  ,%eax
  mov  4(%ebx) ,%edx
  idivl Y

  pop  %edx
  pop  %ebx
end;}


procedure DivMod64by32( X : Int64; Y : Int32; out Q, R : Int32 );
//          assembler;
begin
  Q := X div Y;
  R := X mod Y;
end;
{asm
  push  %ebx
  push  %edx

  mov  X,%ebx
  mov  (%ebx)  ,%eax
  mov  4(%ebx) ,%edx
  idivl Y

  mov  Q, %ebx
  mov  %eax, (%ebx)

  mov  R, %ebx
  mov  %edx, (%ebx)

  pop  %edx
  pop  %ebx
end;}