Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/contrib/dev/acpica/components/utilities/utmath.c
48406 views
1
/*******************************************************************************
2
*
3
* Module Name: utmath - Integer math support routines
4
*
5
******************************************************************************/
6
7
/******************************************************************************
8
*
9
* 1. Copyright Notice
10
*
11
* Some or all of this work - Copyright (c) 1999 - 2025, Intel Corp.
12
* All rights reserved.
13
*
14
* 2. License
15
*
16
* 2.1. This is your license from Intel Corp. under its intellectual property
17
* rights. You may have additional license terms from the party that provided
18
* you this software, covering your right to use that party's intellectual
19
* property rights.
20
*
21
* 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
22
* copy of the source code appearing in this file ("Covered Code") an
23
* irrevocable, perpetual, worldwide license under Intel's copyrights in the
24
* base code distributed originally by Intel ("Original Intel Code") to copy,
25
* make derivatives, distribute, use and display any portion of the Covered
26
* Code in any form, with the right to sublicense such rights; and
27
*
28
* 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
29
* license (with the right to sublicense), under only those claims of Intel
30
* patents that are infringed by the Original Intel Code, to make, use, sell,
31
* offer to sell, and import the Covered Code and derivative works thereof
32
* solely to the minimum extent necessary to exercise the above copyright
33
* license, and in no event shall the patent license extend to any additions
34
* to or modifications of the Original Intel Code. No other license or right
35
* is granted directly or by implication, estoppel or otherwise;
36
*
37
* The above copyright and patent license is granted only if the following
38
* conditions are met:
39
*
40
* 3. Conditions
41
*
42
* 3.1. Redistribution of Source with Rights to Further Distribute Source.
43
* Redistribution of source code of any substantial portion of the Covered
44
* Code or modification with rights to further distribute source must include
45
* the above Copyright Notice, the above License, this list of Conditions,
46
* and the following Disclaimer and Export Compliance provision. In addition,
47
* Licensee must cause all Covered Code to which Licensee contributes to
48
* contain a file documenting the changes Licensee made to create that Covered
49
* Code and the date of any change. Licensee must include in that file the
50
* documentation of any changes made by any predecessor Licensee. Licensee
51
* must include a prominent statement that the modification is derived,
52
* directly or indirectly, from Original Intel Code.
53
*
54
* 3.2. Redistribution of Source with no Rights to Further Distribute Source.
55
* Redistribution of source code of any substantial portion of the Covered
56
* Code or modification without rights to further distribute source must
57
* include the following Disclaimer and Export Compliance provision in the
58
* documentation and/or other materials provided with distribution. In
59
* addition, Licensee may not authorize further sublicense of source of any
60
* portion of the Covered Code, and must include terms to the effect that the
61
* license from Licensee to its licensee is limited to the intellectual
62
* property embodied in the software Licensee provides to its licensee, and
63
* not to intellectual property embodied in modifications its licensee may
64
* make.
65
*
66
* 3.3. Redistribution of Executable. Redistribution in executable form of any
67
* substantial portion of the Covered Code or modification must reproduce the
68
* above Copyright Notice, and the following Disclaimer and Export Compliance
69
* provision in the documentation and/or other materials provided with the
70
* distribution.
71
*
72
* 3.4. Intel retains all right, title, and interest in and to the Original
73
* Intel Code.
74
*
75
* 3.5. Neither the name Intel nor any other trademark owned or controlled by
76
* Intel shall be used in advertising or otherwise to promote the sale, use or
77
* other dealings in products derived from or relating to the Covered Code
78
* without prior written authorization from Intel.
79
*
80
* 4. Disclaimer and Export Compliance
81
*
82
* 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
83
* HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
84
* IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
85
* INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
86
* UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
87
* IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
88
* PARTICULAR PURPOSE.
89
*
90
* 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
91
* OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
92
* COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
93
* SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
94
* CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
95
* HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
96
* SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
97
* LIMITED REMEDY.
98
*
99
* 4.3. Licensee shall not export, either directly or indirectly, any of this
100
* software or system incorporating such software without first obtaining any
101
* required license or other approval from the U. S. Department of Commerce or
102
* any other agency or department of the United States Government. In the
103
* event Licensee exports any such software from the United States or
104
* re-exports any such software from a foreign destination, Licensee shall
105
* ensure that the distribution and export/re-export of the software is in
106
* compliance with all laws, regulations, orders, or other restrictions of the
107
* U.S. Export Administration Regulations. Licensee agrees that neither it nor
108
* any of its subsidiaries will export/re-export any technical data, process,
109
* software, or service, directly or indirectly, to any country for which the
110
* United States government or any agency thereof requires an export license,
111
* other governmental approval, or letter of assurance, without first obtaining
112
* such license, approval or letter.
113
*
114
*****************************************************************************
115
*
116
* Alternatively, you may choose to be licensed under the terms of the
117
* following license:
118
*
119
* Redistribution and use in source and binary forms, with or without
120
* modification, are permitted provided that the following conditions
121
* are met:
122
* 1. Redistributions of source code must retain the above copyright
123
* notice, this list of conditions, and the following disclaimer,
124
* without modification.
125
* 2. Redistributions in binary form must reproduce at minimum a disclaimer
126
* substantially similar to the "NO WARRANTY" disclaimer below
127
* ("Disclaimer") and any redistribution must be conditioned upon
128
* including a substantially similar Disclaimer requirement for further
129
* binary redistribution.
130
* 3. Neither the names of the above-listed copyright holders nor the names
131
* of any contributors may be used to endorse or promote products derived
132
* from this software without specific prior written permission.
133
*
134
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
135
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
136
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
137
* A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
138
* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
139
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
140
* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
141
* DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
142
* THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
143
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
144
* OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
145
*
146
* Alternatively, you may choose to be licensed under the terms of the
147
* GNU General Public License ("GPL") version 2 as published by the Free
148
* Software Foundation.
149
*
150
*****************************************************************************/
151
152
#include <contrib/dev/acpica/include/acpi.h>
153
#include <contrib/dev/acpica/include/accommon.h>
154
155
156
#define _COMPONENT ACPI_UTILITIES
157
ACPI_MODULE_NAME ("utmath")
158
159
/* Structures used only for 64-bit divide */
160
161
typedef struct uint64_struct
162
{
163
UINT32 Lo;
164
UINT32 Hi;
165
166
} UINT64_STRUCT;
167
168
typedef union uint64_overlay
169
{
170
UINT64 Full;
171
UINT64_STRUCT Part;
172
173
} UINT64_OVERLAY;
174
175
/*
176
* Optional support for 64-bit double-precision integer multiply and shift.
177
* This code is configurable and is implemented in order to support 32-bit
178
* kernel environments where a 64-bit double-precision math library is not
179
* available.
180
*/
181
#ifndef ACPI_USE_NATIVE_MATH64
182
183
/*******************************************************************************
184
*
185
* FUNCTION: AcpiUtShortMultiply
186
*
187
* PARAMETERS: Multiplicand - 64-bit multiplicand
188
* Multiplier - 32-bit multiplier
189
* OutProduct - Pointer to where the product is returned
190
*
191
* DESCRIPTION: Perform a short multiply.
192
*
193
******************************************************************************/
194
195
ACPI_STATUS
196
AcpiUtShortMultiply (
197
UINT64 Multiplicand,
198
UINT32 Multiplier,
199
UINT64 *OutProduct)
200
{
201
UINT64_OVERLAY MultiplicandOvl;
202
UINT64_OVERLAY Product;
203
UINT32 Carry32;
204
205
206
ACPI_FUNCTION_TRACE (UtShortMultiply);
207
208
209
MultiplicandOvl.Full = Multiplicand;
210
211
/*
212
* The Product is 64 bits, the carry is always 32 bits,
213
* and is generated by the second multiply.
214
*/
215
ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Hi, Multiplier,
216
Product.Part.Hi, Carry32);
217
218
ACPI_MUL_64_BY_32 (0, MultiplicandOvl.Part.Lo, Multiplier,
219
Product.Part.Lo, Carry32);
220
221
Product.Part.Hi += Carry32;
222
223
/* Return only what was requested */
224
225
if (OutProduct)
226
{
227
*OutProduct = Product.Full;
228
}
229
230
return_ACPI_STATUS (AE_OK);
231
}
232
233
234
/*******************************************************************************
235
*
236
* FUNCTION: AcpiUtShortShiftLeft
237
*
238
* PARAMETERS: Operand - 64-bit shift operand
239
* Count - 32-bit shift count
240
* OutResult - Pointer to where the result is returned
241
*
242
* DESCRIPTION: Perform a short left shift.
243
*
244
******************************************************************************/
245
246
ACPI_STATUS
247
AcpiUtShortShiftLeft (
248
UINT64 Operand,
249
UINT32 Count,
250
UINT64 *OutResult)
251
{
252
UINT64_OVERLAY OperandOvl;
253
254
255
ACPI_FUNCTION_TRACE (UtShortShiftLeft);
256
257
258
OperandOvl.Full = Operand;
259
260
if ((Count & 63) >= 32)
261
{
262
OperandOvl.Part.Hi = OperandOvl.Part.Lo;
263
OperandOvl.Part.Lo = 0;
264
Count = (Count & 63) - 32;
265
}
266
ACPI_SHIFT_LEFT_64_BY_32 (OperandOvl.Part.Hi,
267
OperandOvl.Part.Lo, Count);
268
269
/* Return only what was requested */
270
271
if (OutResult)
272
{
273
*OutResult = OperandOvl.Full;
274
}
275
276
return_ACPI_STATUS (AE_OK);
277
}
278
279
/*******************************************************************************
280
*
281
* FUNCTION: AcpiUtShortShiftRight
282
*
283
* PARAMETERS: Operand - 64-bit shift operand
284
* Count - 32-bit shift count
285
* OutResult - Pointer to where the result is returned
286
*
287
* DESCRIPTION: Perform a short right shift.
288
*
289
******************************************************************************/
290
291
ACPI_STATUS
292
AcpiUtShortShiftRight (
293
UINT64 Operand,
294
UINT32 Count,
295
UINT64 *OutResult)
296
{
297
UINT64_OVERLAY OperandOvl;
298
299
300
ACPI_FUNCTION_TRACE (UtShortShiftRight);
301
302
303
OperandOvl.Full = Operand;
304
305
if ((Count & 63) >= 32)
306
{
307
OperandOvl.Part.Lo = OperandOvl.Part.Hi;
308
OperandOvl.Part.Hi = 0;
309
Count = (Count & 63) - 32;
310
}
311
ACPI_SHIFT_RIGHT_64_BY_32 (OperandOvl.Part.Hi,
312
OperandOvl.Part.Lo, Count);
313
314
/* Return only what was requested */
315
316
if (OutResult)
317
{
318
*OutResult = OperandOvl.Full;
319
}
320
321
return_ACPI_STATUS (AE_OK);
322
}
323
#else
324
325
/*******************************************************************************
326
*
327
* FUNCTION: AcpiUtShortMultiply
328
*
329
* PARAMETERS: See function headers above
330
*
331
* DESCRIPTION: Native version of the UtShortMultiply function.
332
*
333
******************************************************************************/
334
335
ACPI_STATUS
336
AcpiUtShortMultiply (
337
UINT64 Multiplicand,
338
UINT32 Multiplier,
339
UINT64 *OutProduct)
340
{
341
342
ACPI_FUNCTION_TRACE (UtShortMultiply);
343
344
345
/* Return only what was requested */
346
347
if (OutProduct)
348
{
349
*OutProduct = Multiplicand * Multiplier;
350
}
351
352
return_ACPI_STATUS (AE_OK);
353
}
354
355
/*******************************************************************************
356
*
357
* FUNCTION: AcpiUtShortShiftLeft
358
*
359
* PARAMETERS: See function headers above
360
*
361
* DESCRIPTION: Native version of the UtShortShiftLeft function.
362
*
363
******************************************************************************/
364
365
ACPI_STATUS
366
AcpiUtShortShiftLeft (
367
UINT64 Operand,
368
UINT32 Count,
369
UINT64 *OutResult)
370
{
371
372
ACPI_FUNCTION_TRACE (UtShortShiftLeft);
373
374
375
/* Return only what was requested */
376
377
if (OutResult)
378
{
379
*OutResult = Operand << Count;
380
}
381
382
return_ACPI_STATUS (AE_OK);
383
}
384
385
/*******************************************************************************
386
*
387
* FUNCTION: AcpiUtShortShiftRight
388
*
389
* PARAMETERS: See function headers above
390
*
391
* DESCRIPTION: Native version of the UtShortShiftRight function.
392
*
393
******************************************************************************/
394
395
ACPI_STATUS
396
AcpiUtShortShiftRight (
397
UINT64 Operand,
398
UINT32 Count,
399
UINT64 *OutResult)
400
{
401
402
ACPI_FUNCTION_TRACE (UtShortShiftRight);
403
404
405
/* Return only what was requested */
406
407
if (OutResult)
408
{
409
*OutResult = Operand >> Count;
410
}
411
412
return_ACPI_STATUS (AE_OK);
413
}
414
#endif
415
416
/*
417
* Optional support for 64-bit double-precision integer divide. This code
418
* is configurable and is implemented in order to support 32-bit kernel
419
* environments where a 64-bit double-precision math library is not available.
420
*
421
* Support for a more normal 64-bit divide/modulo (with check for a divide-
422
* by-zero) appears after this optional section of code.
423
*/
424
#ifndef ACPI_USE_NATIVE_DIVIDE
425
426
427
/*******************************************************************************
428
*
429
* FUNCTION: AcpiUtShortDivide
430
*
431
* PARAMETERS: Dividend - 64-bit dividend
432
* Divisor - 32-bit divisor
433
* OutQuotient - Pointer to where the quotient is returned
434
* OutRemainder - Pointer to where the remainder is returned
435
*
436
* RETURN: Status (Checks for divide-by-zero)
437
*
438
* DESCRIPTION: Perform a short (maximum 64 bits divided by 32 bits)
439
* divide and modulo. The result is a 64-bit quotient and a
440
* 32-bit remainder.
441
*
442
******************************************************************************/
443
444
ACPI_STATUS
445
AcpiUtShortDivide (
446
UINT64 Dividend,
447
UINT32 Divisor,
448
UINT64 *OutQuotient,
449
UINT32 *OutRemainder)
450
{
451
UINT64_OVERLAY DividendOvl;
452
UINT64_OVERLAY Quotient;
453
UINT32 Remainder32;
454
455
456
ACPI_FUNCTION_TRACE (UtShortDivide);
457
458
459
/* Always check for a zero divisor */
460
461
if (Divisor == 0)
462
{
463
ACPI_ERROR ((AE_INFO, "Divide by zero"));
464
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
465
}
466
467
DividendOvl.Full = Dividend;
468
469
/*
470
* The quotient is 64 bits, the remainder is always 32 bits,
471
* and is generated by the second divide.
472
*/
473
ACPI_DIV_64_BY_32 (0, DividendOvl.Part.Hi, Divisor,
474
Quotient.Part.Hi, Remainder32);
475
476
ACPI_DIV_64_BY_32 (Remainder32, DividendOvl.Part.Lo, Divisor,
477
Quotient.Part.Lo, Remainder32);
478
479
/* Return only what was requested */
480
481
if (OutQuotient)
482
{
483
*OutQuotient = Quotient.Full;
484
}
485
if (OutRemainder)
486
{
487
*OutRemainder = Remainder32;
488
}
489
490
return_ACPI_STATUS (AE_OK);
491
}
492
493
494
/*******************************************************************************
495
*
496
* FUNCTION: AcpiUtDivide
497
*
498
* PARAMETERS: InDividend - Dividend
499
* InDivisor - Divisor
500
* OutQuotient - Pointer to where the quotient is returned
501
* OutRemainder - Pointer to where the remainder is returned
502
*
503
* RETURN: Status (Checks for divide-by-zero)
504
*
505
* DESCRIPTION: Perform a divide and modulo.
506
*
507
******************************************************************************/
508
509
ACPI_STATUS
510
AcpiUtDivide (
511
UINT64 InDividend,
512
UINT64 InDivisor,
513
UINT64 *OutQuotient,
514
UINT64 *OutRemainder)
515
{
516
UINT64_OVERLAY Dividend;
517
UINT64_OVERLAY Divisor;
518
UINT64_OVERLAY Quotient;
519
UINT64_OVERLAY Remainder;
520
UINT64_OVERLAY NormalizedDividend;
521
UINT64_OVERLAY NormalizedDivisor;
522
UINT32 Partial1;
523
UINT64_OVERLAY Partial2;
524
UINT64_OVERLAY Partial3;
525
526
527
ACPI_FUNCTION_TRACE (UtDivide);
528
529
530
/* Always check for a zero divisor */
531
532
if (InDivisor == 0)
533
{
534
ACPI_ERROR ((AE_INFO, "Divide by zero"));
535
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
536
}
537
538
Divisor.Full = InDivisor;
539
Dividend.Full = InDividend;
540
if (Divisor.Part.Hi == 0)
541
{
542
/*
543
* 1) Simplest case is where the divisor is 32 bits, we can
544
* just do two divides
545
*/
546
Remainder.Part.Hi = 0;
547
548
/*
549
* The quotient is 64 bits, the remainder is always 32 bits,
550
* and is generated by the second divide.
551
*/
552
ACPI_DIV_64_BY_32 (0, Dividend.Part.Hi, Divisor.Part.Lo,
553
Quotient.Part.Hi, Partial1);
554
555
ACPI_DIV_64_BY_32 (Partial1, Dividend.Part.Lo, Divisor.Part.Lo,
556
Quotient.Part.Lo, Remainder.Part.Lo);
557
}
558
559
else
560
{
561
/*
562
* 2) The general case where the divisor is a full 64 bits
563
* is more difficult
564
*/
565
Quotient.Part.Hi = 0;
566
NormalizedDividend = Dividend;
567
NormalizedDivisor = Divisor;
568
569
/* Normalize the operands (shift until the divisor is < 32 bits) */
570
571
do
572
{
573
ACPI_SHIFT_RIGHT_64 (
574
NormalizedDivisor.Part.Hi, NormalizedDivisor.Part.Lo);
575
ACPI_SHIFT_RIGHT_64 (
576
NormalizedDividend.Part.Hi, NormalizedDividend.Part.Lo);
577
578
} while (NormalizedDivisor.Part.Hi != 0);
579
580
/* Partial divide */
581
582
ACPI_DIV_64_BY_32 (
583
NormalizedDividend.Part.Hi, NormalizedDividend.Part.Lo,
584
NormalizedDivisor.Part.Lo, Quotient.Part.Lo, Partial1);
585
586
/*
587
* The quotient is always 32 bits, and simply requires
588
* adjustment. The 64-bit remainder must be generated.
589
*/
590
Partial1 = Quotient.Part.Lo * Divisor.Part.Hi;
591
Partial2.Full = (UINT64) Quotient.Part.Lo * Divisor.Part.Lo;
592
Partial3.Full = (UINT64) Partial2.Part.Hi + Partial1;
593
594
Remainder.Part.Hi = Partial3.Part.Lo;
595
Remainder.Part.Lo = Partial2.Part.Lo;
596
597
if (Partial3.Part.Hi == 0)
598
{
599
if (Partial3.Part.Lo >= Dividend.Part.Hi)
600
{
601
if (Partial3.Part.Lo == Dividend.Part.Hi)
602
{
603
if (Partial2.Part.Lo > Dividend.Part.Lo)
604
{
605
Quotient.Part.Lo--;
606
Remainder.Full -= Divisor.Full;
607
}
608
}
609
else
610
{
611
Quotient.Part.Lo--;
612
Remainder.Full -= Divisor.Full;
613
}
614
}
615
616
Remainder.Full = Remainder.Full - Dividend.Full;
617
Remainder.Part.Hi = (UINT32) -((INT32) Remainder.Part.Hi);
618
Remainder.Part.Lo = (UINT32) -((INT32) Remainder.Part.Lo);
619
620
if (Remainder.Part.Lo)
621
{
622
Remainder.Part.Hi--;
623
}
624
}
625
}
626
627
/* Return only what was requested */
628
629
if (OutQuotient)
630
{
631
*OutQuotient = Quotient.Full;
632
}
633
if (OutRemainder)
634
{
635
*OutRemainder = Remainder.Full;
636
}
637
638
return_ACPI_STATUS (AE_OK);
639
}
640
641
#else
642
643
/*******************************************************************************
644
*
645
* FUNCTION: AcpiUtShortDivide, AcpiUtDivide
646
*
647
* PARAMETERS: See function headers above
648
*
649
* DESCRIPTION: Native versions of the UtDivide functions. Use these if either
650
* 1) The target is a 64-bit platform and therefore 64-bit
651
* integer math is supported directly by the machine.
652
* 2) The target is a 32-bit or 16-bit platform, and the
653
* double-precision integer math library is available to
654
* perform the divide.
655
*
656
******************************************************************************/
657
658
ACPI_STATUS
659
AcpiUtShortDivide (
660
UINT64 InDividend,
661
UINT32 Divisor,
662
UINT64 *OutQuotient,
663
UINT32 *OutRemainder)
664
{
665
666
ACPI_FUNCTION_TRACE (UtShortDivide);
667
668
669
/* Always check for a zero divisor */
670
671
if (Divisor == 0)
672
{
673
ACPI_ERROR ((AE_INFO, "Divide by zero"));
674
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
675
}
676
677
/* Return only what was requested */
678
679
if (OutQuotient)
680
{
681
*OutQuotient = InDividend / Divisor;
682
}
683
if (OutRemainder)
684
{
685
*OutRemainder = (UINT32) (InDividend % Divisor);
686
}
687
688
return_ACPI_STATUS (AE_OK);
689
}
690
691
ACPI_STATUS
692
AcpiUtDivide (
693
UINT64 InDividend,
694
UINT64 InDivisor,
695
UINT64 *OutQuotient,
696
UINT64 *OutRemainder)
697
{
698
ACPI_FUNCTION_TRACE (UtDivide);
699
700
701
/* Always check for a zero divisor */
702
703
if (InDivisor == 0)
704
{
705
ACPI_ERROR ((AE_INFO, "Divide by zero"));
706
return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
707
}
708
709
710
/* Return only what was requested */
711
712
if (OutQuotient)
713
{
714
*OutQuotient = InDividend / InDivisor;
715
}
716
if (OutRemainder)
717
{
718
*OutRemainder = InDividend % InDivisor;
719
}
720
721
return_ACPI_STATUS (AE_OK);
722
}
723
724
#endif
725
726