mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-09-15 20:30:26 +02:00
+ Xtensa: make use of ABS.S
+ extended test for abs(...) with single tests git-svn-id: trunk@46852 -
This commit is contained in:
parent
d1521e8061
commit
f8b17c410b
@ -106,6 +106,8 @@ uses
|
||||
function spilling_create_load(const ref:treference;r:tregister):Taicpu;
|
||||
function spilling_create_store(r:tregister; const ref:treference):Taicpu;
|
||||
|
||||
function setoppostfix(i : taicpu;pf : toppostfix) : taicpu;
|
||||
|
||||
implementation
|
||||
|
||||
uses cutils, cclasses;
|
||||
@ -495,6 +497,13 @@ uses cutils, cclasses;
|
||||
end;
|
||||
|
||||
|
||||
function setoppostfix(i : taicpu;pf : toppostfix) : taicpu;
|
||||
begin
|
||||
i.oppostfix:=pf;
|
||||
result:=i;
|
||||
end;
|
||||
|
||||
|
||||
procedure InitAsm;
|
||||
begin
|
||||
end;
|
||||
|
@ -30,12 +30,16 @@ unit ncpuinl;
|
||||
|
||||
type
|
||||
tcpuinlineNode = class(tcginlinenode)
|
||||
function first_abs_real: tnode; override;
|
||||
procedure second_abs_long; override;
|
||||
procedure second_abs_real; override;
|
||||
end;
|
||||
|
||||
implementation
|
||||
|
||||
uses
|
||||
cpuinfo,
|
||||
verbose,globals,
|
||||
compinnr,
|
||||
aasmdata,
|
||||
aasmcpu,
|
||||
@ -58,6 +62,29 @@ unit ncpuinl;
|
||||
end;
|
||||
|
||||
|
||||
function tcpuinlinenode.first_abs_real : tnode;
|
||||
begin
|
||||
result:=nil;
|
||||
if is_single(left.resultdef) and (FPUXTENSA_SINGLE in fpu_capabilities[current_settings.fputype]) then
|
||||
expectloc:=LOC_FPUREGISTER
|
||||
else
|
||||
result:=inherited first_abs_real;
|
||||
end;
|
||||
|
||||
|
||||
procedure tcpuinlinenode.second_abs_real;
|
||||
begin
|
||||
if not(is_single(resultdef)) then
|
||||
InternalError(2020091101);
|
||||
secondpass(left);
|
||||
hlcg.location_force_fpureg(current_asmdata.CurrAsmList,left.location,left.resultdef,true);
|
||||
location_reset(location,LOC_FPUREGISTER,OS_F32);
|
||||
location.register:=cg.getfpuregister(current_asmdata.CurrAsmList,location.size);
|
||||
current_asmdata.CurrAsmList.concat(setoppostfix(taicpu.op_reg_reg(A_ABS,location.register,left.location.register),PF_S));
|
||||
end;
|
||||
|
||||
|
||||
|
||||
begin
|
||||
cinlinenode:=tcpuinlinenode;
|
||||
end.
|
||||
|
@ -232,6 +232,51 @@ procedure fail;
|
||||
WriteLn('Success!');
|
||||
end;
|
||||
|
||||
|
||||
procedure test_abs_single;
|
||||
var
|
||||
_result : boolean;
|
||||
value : single;
|
||||
value1: single;
|
||||
begin
|
||||
_result := true;
|
||||
Write('Abs() test with single type...');
|
||||
|
||||
value := VALUE_ONE_REAL;
|
||||
if (trunc(abs(value)) <> trunc(RESULT_CONST_ONE_REAL)) then
|
||||
_result := false;
|
||||
|
||||
value := VALUE_THREE_REAL;
|
||||
if trunc(abs(value)) <> trunc(RESULT_CONST_THREE_REAL) then
|
||||
_result := false;
|
||||
|
||||
value := VALUE_FOUR_REAL;
|
||||
if trunc(abs(value)) <> trunc(RESULT_CONST_FOUR_REAL) then
|
||||
_result := false;
|
||||
|
||||
value := VALUE_ONE_REAL;
|
||||
value1 := abs(value);
|
||||
if trunc(value1) <> trunc(RESULT_ONE_REAL) then
|
||||
_result := false;
|
||||
|
||||
value := VALUE_THREE_REAL;
|
||||
value1 := abs(value);
|
||||
if trunc(value1) <> trunc(RESULT_THREE_REAL) then
|
||||
_result := false;
|
||||
|
||||
value := VALUE_FOUR_REAL;
|
||||
value1 := abs(value);
|
||||
if trunc(value1) <> trunc(RESULT_FOUR_REAL) then
|
||||
_result := false;
|
||||
|
||||
if not _result then
|
||||
fail
|
||||
else
|
||||
WriteLn('Success!');
|
||||
end;
|
||||
|
||||
|
||||
|
||||
procedure test_abs_real;
|
||||
var
|
||||
_result : boolean;
|
||||
@ -294,6 +339,7 @@ Begin
|
||||
test_abs_currency;
|
||||
{$endif SKIP_CURRENCY_TEST}
|
||||
test_abs_real;
|
||||
test_abs_single;
|
||||
test_abs_longint;
|
||||
test_abs_int64;
|
||||
end.
|
||||
|
Loading…
Reference in New Issue
Block a user