-
Type:
Bug
-
Resolution: Unresolved
-
Priority:
Medium
-
Code Generation Tools
-
CODEGEN-9131
-
ARM_20.2.5.LTS
-
ARM_20.2.6.LTS*
-
default
The attached file has this source code ...
int compare_double(double a, double b)
{
double maxVal = fabs(a) > fabs(b) ? fabs(a) : fabs(b);
return (fabs(a - b) <= maxVal * DBL_EPSILON);
}
Build it and note the use of the registers V2, V3, and V6.
% armcl --opt_level=off --symdebug:none -s file.c & findstr "V2 V3 V6" file.asm
;* Regs Modified : A1,A2,A3,A4,V1,V2,V3,V9,SP,LR,SR *
;* Regs Used : A1,A2,A3,A4,V1,V2,V3,V9,SP,LR,SR *
STMFD SP!, {V1, V2, V3, LR} ; []
BIC V3, A1, #-2147483648 ; [] |6|
MOV V2, A2 ; [] |6|
MOV A1, V3 ; [] |6|
MOV A2, V2 ; [] |6|
LDMFD SP!, {V1, V2, V3, LR} ; []
Recall the following register equivalents:
R5 => V2
R6 => V3
R9 => V6
Next attempt to make R5 and R6 global registers, which means the compiler does not use them.
% armcl --opt_level=off --symdebug:none -s --global_register=r5 --global_register=r6 file.c & findstr "V2 V3 V6" file.asm
;* Regs Modified : A1,A2,A3,A4,V1,V2,V3,V4,V9,SP,LR,SR *
;* Regs Used : A1,A2,A3,A4,V1,V2,V3,V4,V9,SP,LR,SR *
STMFD SP!, {V1, V2, V4, LR} ; []
MOV V2, A2 ; [] |6|
MOV A2, V2 ; [] |6|
LDMFD SP!, {V1, V2, V4, LR} ; []
Note that V2 is used even though --global_register=r5 is an option.
Similar experiments will show that only the last --global_register option is used. The rest are ignored, with no diagnostics.