arch/m68k/fpsp040/srem_mod.S
Source file repositories/reference/linux-study-clean/arch/m68k/fpsp040/srem_mod.S
File Facts
- System
- Linux kernel
- Corpus path
arch/m68k/fpsp040/srem_mod.S- Extension
.S- Size
- 12287 bytes
- Lines
- 422
- Domain
- Architecture Layer
- Bucket
- arch/m68k
- Inferred role
- Architecture Layer: arch/m68k
- Status
- atlas-only
Why This File Exists
CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
- CPU and platform-specific kernel glue: boot entry, traps, syscall entry, interrupts, page tables, context switch, and low-level barriers.
Dependency Surface
fpsp.h
Detected Declarations
- No top-level syscall, struct, function, initcall, or export declaration detected by the generator.
Annotated Snippet
|
| srem_mod.sa 3.1 12/10/90
|
| The entry point sMOD computes the floating point MOD of the
| input values X and Y. The entry point sREM computes the floating
| point (IEEE) REM of the input values X and Y.
|
| INPUT
| -----
| Double-extended value Y is pointed to by address in register
| A0. Double-extended value X is located in -12(A0). The values
| of X and Y are both nonzero and finite; although either or both
| of them can be denormalized. The special cases of zeros, NaNs,
| and infinities are handled elsewhere.
|
| OUTPUT
| ------
| FREM(X,Y) or FMOD(X,Y), depending on entry point.
|
| ALGORITHM
| ---------
|
| Step 1. Save and strip signs of X and Y: signX := sign(X),
| signY := sign(Y), X := |X|, Y := |Y|,
| signQ := signX EOR signY. Record whether MOD or REM
| is requested.
|
| Step 2. Set L := expo(X)-expo(Y), k := 0, Q := 0.
| If (L < 0) then
| R := X, go to Step 4.
| else
| R := 2^(-L)X, j := L.
| endif
|
| Step 3. Perform MOD(X,Y)
| 3.1 If R = Y, go to Step 9.
| 3.2 If R > Y, then { R := R - Y, Q := Q + 1}
| 3.3 If j = 0, go to Step 4.
| 3.4 k := k + 1, j := j - 1, Q := 2Q, R := 2R. Go to
| Step 3.1.
|
| Step 4. At this point, R = X - QY = MOD(X,Y). Set
| Last_Subtract := false (used in Step 7 below). If
| MOD is requested, go to Step 6.
|
| Step 5. R = MOD(X,Y), but REM(X,Y) is requested.
| 5.1 If R < Y/2, then R = MOD(X,Y) = REM(X,Y). Go to
| Step 6.
| 5.2 If R > Y/2, then { set Last_Subtract := true,
| Q := Q + 1, Y := signY*Y }. Go to Step 6.
| 5.3 This is the tricky case of R = Y/2. If Q is odd,
| then { Q := Q + 1, signX := -signX }.
|
| Step 6. R := signX*R.
|
| Step 7. If Last_Subtract = true, R := R - Y.
|
| Step 8. Return signQ, last 7 bits of Q, and R as required.
|
| Step 9. At this point, R = 2^(-j)*X - Q Y = Y. Thus,
| X = 2^(j)*(Q+1)Y. set Q := 2^(j)*(Q+1),
| R := 0. Return signQ, last 7 bits of Q, and R.
|
|
| Copyright (C) Motorola, Inc. 1990
| All Rights Reserved
|
| For details on the license for this file, please see the
| file, README, in this same directory.
Annotation
- Immediate include surface: `fpsp.h`.
- Atlas domain: Architecture Layer / arch/m68k.
- Implementation status: atlas-only.
Implementation Notes
- This generated page is the file-by-file coverage layer; curated subsystem chapters should link here when they synthesize a multi-file control flow.
- Core OS pages should be promoted from atlas-only to deep-reviewed when they explain data structures, invariants, locking, lifecycle, and C implementation snippets.
- Driver-family pages are intentionally pattern-oriented unless they are part of the selected PCIe/NVMe representative device path.