AVR: Enumerations always use 32 bit variables
Original Reporter info from Mantis: Timm Thaler
-
Reporter name: Timm Thaler
Original Reporter info from Mantis: Timm Thaler
- Reporter name: Timm Thaler
Description:
Enumerations always use 32 bit variables. According to description (https://wiki.freepascal.org/Enum_Type/de) enum type should be as small as possible.
Steps to reproduce:
type
Tnum = (eins, zwei, drei);
var
a, b : uint16;
n : Tnum;
m : (one, two, three, four, five);
procedure testtest();
begin
if (m = three) or (n = drei) then begin
end;
end;
begin
repeat
n := zwei;
m := four;
until false;
end.
compiles to
PsTEST_ss_TESTTEST:
.Lc2:
# [test.lpr]
# [14] begin
# [15] if (m = three) or (n = drei) then begin
lds r20,(U_sPsTEST_ss_M)
lds r18,(U_sPsTEST_ss_M+1)
lds r21,(U_sPsTEST_ss_M+2)
lds r19,(U_sPsTEST_ss_M+3)
cpi r20,2
cpc r18,r1
cpc r21,r1
cpc r19,r1
breq .Lj5
lds r21,(U_sPsTEST_ss_N)
lds r19,(U_sPsTEST_ss_N+1)
lds r18,(U_sPsTEST_ss_N+2)
lds r20,(U_sPsTEST_ss_N+3)
cpi r21,2
cpc r19,r1
cpc r18,r1
cpc r20,r1
brne .Lj7
.Lj5:
.Lj7:
# [18] end;
ret
# [22] n := zwei;
ldi r18,1
sts (U_sPsTEST_ss_N),r18
sts (U_sPsTEST_ss_N+1),r1
sts (U_sPsTEST_ss_N+2),r1
sts (U_sPsTEST_ss_N+3),r1
# [23] m := four;
ldi r18,3
sts (U_sPsTEST_ss_M),r18
sts (U_sPsTEST_ss_M+1),r1
sts (U_sPsTEST_ss_M+2),r1
sts (U_sPsTEST_ss_M+3),r1
Additional information:
Strange: With parser mode -MDelphi enumerations uses 8 bit, with all other parser modes -Mfpc, -MPbjFPC... enumerations uses 32 bit.
Small variables can be forced with {$PACKENUM 1}.
Mantis conversion info:
- Mantis ID: 35873
- OS: embedded
- OS Build: AVR5
- Build: r42480
- Platform: AVR
- Version: 3.3.1