Hello,
I have dozens of blas-like assembler procedures. They have been written about 10 years ago and I still use them in both virtualpascal and free pascal programs.
Today I tried new fpc 1.9.8. Output generated from fpc 1.9.8 code seems errorenous. The isolated example given below tries to fill an array of float with contstant value. Gdb (5.3) gives no reasonable support, although for 1.0.10 code it does.
program atest;
type dvector = array[1..10] of double;
const dflsize = sizeof(double);
var x: dvector; i: integer; a: double;
{$ifdef VirtualPascal}
{$SAVES EBX,ESI,EDI} {$USES EAX,ECX,EDX} {$endif}
procedure vecfill(const dim0,dim1: integer;
var r: dVector; c: extended); assembler;
asm
MOV EAX,dim1;
SUB EAX,dim0;
MOV EDX,dflsize
MUL EDX
FLD TByte ptr [c]
push eax
mov eax,dim0
dec eax
mov edx,dflsize
mul edx
MOV EDX, r
ADD EDX,EAX
pop eax
JMP @@2
@@1:
FST QWord ptr [EDX + EAX]
SUB EAX,dflsize
@@2:
CMP EAX,0
JGE @@1
FSTP ST(0)
end; {asmvecfill}
begin
a := 123.45;
fillchar(x, sizeof(x),0);
vecfill(2, 5, x, a);
for i := 1 to 6 do
writeln(x[i]);
end.
Here is output by fpc 1.9.8:
0.000000000000000E+000
0.000000000000000E+000
0.000000000000000E+000
0.000000000000000E+000
(or access violation when arrays allocated dynamically). Output by fpc 1.0.10 and vp 2.1 which is one I expect:
1.234500000000000E+002
1.234500000000000E+002
1.234500000000000E+002
1.234500000000000E+002
Any ideas?
Jan Jelowicki
------------------------------------------------------------------- Wroclaw University of Agriculture Akademia Rolnicza we Wroclawiu Department of Mathematics Katedra Matematyki -------------------------------------------------------------------