AMD64.srE.Mod 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. MODULE srE;
  2. IMPORT SYSTEM, srBase;
  3. TYPE SREAL=srBase.SREAL;
  4. (* procedure for casting real array to integer array. From Patrik Reali ETHZ 2000*)
  5. PROCEDURE E*(VAR p: srBase.PT; VAR ijk: srBase.IPT);
  6. VAR
  7. in: ARRAY 3 OF SREAL;
  8. out: ARRAY 3 OF INTEGER;
  9. BEGIN
  10. in[0]:=p.x;in[1]:=p.y; in[2]:=p.z;
  11. Eprime(in,out);
  12. ijk.i:=out[0]; ijk.j:=out[1]; ijk.k:=out[2];
  13. END E;
  14. PROCEDURE Eprime(VAR in:ARRAY OF SREAL; VAR out: ARRAY OF INTEGER);
  15. CODE {SYSTEM.AMD64, SYSTEM.FPU}
  16. #IF COOP THEN
  17. PUSH RBX
  18. #END
  19. MOV RDI, [RBP+out+0] ; dest = ADR(out)
  20. MOV RCX, [RBP+out+8] ; count = LEN(out)
  21. MOV RSI, [RBP+in+0] ; source = ADR(in)
  22. CMP RCX, [RBP+in+8]
  23. JGE Ok
  24. PUSH 99 ; LEN(in) > LEN(out) then TRAP(99)
  25. INT 3
  26. Ok:
  27. SUB RSP, 8 ; change FPU rounding to "chop"
  28. FSTCW [RSP]
  29. FWAIT
  30. MOV EBX, [RSP]
  31. OR EBX, 0400H ; clear bit 10,11 (chop/truncate toward zero)
  32. MOV [RSP+4], EBX
  33. FLDCW [RSP+4]
  34. JMP Check
  35. Loop:
  36. DEC RCX
  37. FLD DWORD [RSI+RCX*4] ; in: SREAL
  38. FISTP WORD [RDI+RCX*2] ; out: INTEGER
  39. FWAIT
  40. Check:
  41. CMP RCX, 0
  42. JG Loop
  43. FLDCW [RSP] ; restore original FPU configuration
  44. ADD RSP, 8
  45. #IF COOP THEN
  46. POP RBX
  47. #END
  48. END Eprime;
  49. PROCEDURE E2*(in: srBase.PT; VAR out: srBase.IPT);
  50. (*
  51. BEGIN
  52. ROUND(in[0], out[0]);
  53. ROUND(in[1], out[1]);
  54. ROUND(in[2], out[2]); *)
  55. END E2;
  56. (* PROCEDURE ROUND(x: SREAL; VAR y: LONGINT);
  57. CODE {SYSTEM.i386, SYSTEM.FPU}
  58. FLD x[EBP]
  59. MOV EAX, y[EBP]
  60. FISTP DWORD 0[EAX]
  61. END ROUND;
  62. PROCEDURE ROUND(x: LONGSREAL; VAR y: LONGINT);
  63. CODE {SYSTEM.i386, SYSTEM.FPU}
  64. FLD [EBP+x]
  65. MOV EAX, [EBP+y]
  66. FISTP DWORD [EAX]
  67. END ROUND; *)
  68. PROCEDURE -ROUND*(x: SREAL; VAR y: LONGINT);
  69. CODE {SYSTEM.AMD64, SYSTEM.FPU}
  70. POP RAX
  71. FLD DWORD [RBP]
  72. ADD RSP, 8
  73. FISTP DWORD [RAX]
  74. END ROUND;
  75. (* PROCEDURE -ROUND(x: LONGSREAL; VAR y: LONGINT);
  76. CODE {SYSTEM.i386, SYSTEM.FPU}
  77. POP EAX
  78. FLD QWORD [EBP]
  79. ADD ESP, 8
  80. FISTP DWORD [EAX]
  81. END ROUND;
  82. *)
  83. END srE.