Naja, ganz so "klar" ist das nicht:FPK hat geschrieben:Kurzform: Der Typ des Ergebnisses einer Operation hängt immer von den Typen der Operanden ab, bei arithmetischen Operationen gilt eigentlich immer, dass der Typ gewählt wird, in den beiden Operanden passen, bei word*word ist das eben word, bei word*integer ist das longint. Damit ist klar, dass word*integer eine 32 Bit Operation verursacht.
Code: Alles auswählen
# [42] c_i32 := a_i16 * b_i16;
lds r18,(U_sMT_MATH_ss_A_I16)
lds r21,(U_sMT_MATH_ss_A_I16+1)
lds r22,(U_sMT_MATH_ss_B_I16)
lds r23,(U_sMT_MATH_ss_B_I16+1)
mul r18,r22
mov r19,r0
mov r20,r1
mul r21,r22
add r20,r0
mul r18,r23
add r20,r0
clr r1
mov r21,r20
mov r18,r1
sbrc r20,7
com r18
mov r20,r18
sts (U_sMT_MATH_ss_C_I32),r19
sts (U_sMT_MATH_ss_C_I32+1),r21
sts (U_sMT_MATH_ss_C_I32+2),r18
sts (U_sMT_MATH_ss_C_I32+3),r20
Code: Alles auswählen
# [42] b_u16 := 15 * a_u16;
lds r18,(U_sMT_MATH_ss_A_U16)
lds r19,(U_sMT_MATH_ss_A_U16+1)
mov r20,r1
mov r21,r1
ldi r22,15
mov r23,r1
mov r24,r1
mov r25,r1
call fpc_mul_longint
sts (U_sMT_MATH_ss_B_U16),r22
sts (U_sMT_MATH_ss_B_U16+1),r23
Stimmt für uint16 nicht. Bei int16, uint32, int32 macht er durchaus das Shift über alle 8 Bits für alle 2 oder 4 Bytes. Ich denk mir das doch nicht aus.FPK hat geschrieben:Stimmt für trunk jedenfalls nicht mehr: