static inline uint16_t mul_8_8 (uint8_t op1, uint8_t op2)
{
uint16_t res;
asm(
"mul %A[op1],%A[op2]\n"
"movw %A[res],r0\n"
"clr __zero_reg__\n"
: [res] "=&r" (res)
: [op1] "a" (op1),
[op2] "a" (op2)
);
return res;
}
static inline __uint24 mul_16_8 (uint16_t op1, uint8_t op2)
{
__uint24 res;
uint8_t zero;
asm(
"clr %[zero]\n"
"mul %A[op1],%A[op2]\n"
"movw %A[res],r0\n"
"mul %B[op1],%A[op2]\n"
"add %B[res],r0\n"
"adc %C[res],r1\n"
"clr __zero_reg__\n"
: [res] "=&r" (res),
[zero] "=&r" (zero)
: [op1] "a" (op1),
[op2] "a" (op2)
);
return res;
}
static inline uint32_t mul_16_16 (uint16_t op1, uint16_t op2)
{
uint32_t res;
uint8_t zero;
asm(
"clr %[zero]\n"
"mul %A[op1],%A[op2]\n"
"movw %A[res],r0\n"
"mul %B[op1],%B[op2]\n"
"movw %C[res],r0\n"
"mul %B[op1],%A[op2]\n"
"add %B[res],r0\n"
"adc %C[res],r1\n"
"adc %D[res],%[zero]\n"
"mul %A[op1],%B[op2]\n"
"add %B[res],r0\n"
"adc %C[res],r1\n"
"adc %D[res],%[zero]\n"
"clr __zero_reg__\n"
: [res] "=&r" (res),
[zero] "=&r" (zero)
: [op1] "a" (op1),
[op2] "a" (op2)
);
return res;
}
c3RhdGljIGlubGluZSB1aW50MTZfdCBtdWxfOF84ICh1aW50OF90IG9wMSwgdWludDhfdCBvcDIpCnsKICAgIHVpbnQxNl90IHJlczsKICAgIAogICAgYXNtKAogICAgICAgICJtdWwgJUFbb3AxXSwlQVtvcDJdXG4iCiAgICAgICAgIm1vdncgJUFbcmVzXSxyMFxuIgogICAgICAgICJjbHIgX196ZXJvX3JlZ19fXG4iCiAgICAgICAgCiAgICAgICAgOiBbcmVzXSAiPSZyIiAocmVzKQogICAgICAgIDogW29wMV0gImEiIChvcDEpLAogICAgICAgICAgW29wMl0gImEiIChvcDIpCiAgICApOwogICAgCiAgICByZXR1cm4gcmVzOwp9CgpzdGF0aWMgaW5saW5lIF9fdWludDI0IG11bF8xNl84ICh1aW50MTZfdCBvcDEsIHVpbnQ4X3Qgb3AyKQp7CiAgICBfX3VpbnQyNCByZXM7CiAgICB1aW50OF90IHplcm87CiAgICAKICAgIGFzbSgKICAgICAgICAiY2xyICVbemVyb11cbiIKICAgICAgICAibXVsICVBW29wMV0sJUFbb3AyXVxuIgogICAgICAgICJtb3Z3ICVBW3Jlc10scjBcbiIKICAgICAgICAibXVsICVCW29wMV0sJUFbb3AyXVxuIgogICAgICAgICJhZGQgJUJbcmVzXSxyMFxuIgogICAgICAgICJhZGMgJUNbcmVzXSxyMVxuIgogICAgICAgICJjbHIgX196ZXJvX3JlZ19fXG4iCiAgICAgICAgOiBbcmVzXSAiPSZyIiAocmVzKSwKICAgICAgICAgIFt6ZXJvXSAiPSZyIiAoemVybykKICAgICAgICA6IFtvcDFdICJhIiAob3AxKSwKICAgICAgICAgIFtvcDJdICJhIiAob3AyKQogICAgKTsKICAgIAogICAgcmV0dXJuIHJlczsKfQoKc3RhdGljIGlubGluZSB1aW50MzJfdCBtdWxfMTZfMTYgKHVpbnQxNl90IG9wMSwgdWludDE2X3Qgb3AyKQp7CiAgICB1aW50MzJfdCByZXM7CiAgICB1aW50OF90IHplcm87CiAgICAKICAgIGFzbSgKICAgICAgICAiY2xyICVbemVyb11cbiIKICAgICAgICAibXVsICVBW29wMV0sJUFbb3AyXVxuIgogICAgICAgICJtb3Z3ICVBW3Jlc10scjBcbiIKICAgICAgICAibXVsICVCW29wMV0sJUJbb3AyXVxuIgogICAgICAgICJtb3Z3ICVDW3Jlc10scjBcbiIKICAgICAgICAibXVsICVCW29wMV0sJUFbb3AyXVxuIgogICAgICAgICJhZGQgJUJbcmVzXSxyMFxuIgogICAgICAgICJhZGMgJUNbcmVzXSxyMVxuIgogICAgICAgICJhZGMgJURbcmVzXSwlW3plcm9dXG4iCiAgICAgICAgIm11bCAlQVtvcDFdLCVCW29wMl1cbiIKICAgICAgICAiYWRkICVCW3Jlc10scjBcbiIKICAgICAgICAiYWRjICVDW3Jlc10scjFcbiIKICAgICAgICAiYWRjICVEW3Jlc10sJVt6ZXJvXVxuIgogICAgICAgICJjbHIgX196ZXJvX3JlZ19fXG4iCiAgICAgICAgOiBbcmVzXSAiPSZyIiAocmVzKSwKICAgICAgICAgIFt6ZXJvXSAiPSZyIiAoemVybykKICAgICAgICA6IFtvcDFdICJhIiAob3AxKSwKICAgICAgICAgIFtvcDJdICJhIiAob3AyKQogICAgKTsKICAgIAogICAgcmV0dXJuIHJlczsKfQ==
prog.c:1:1: error: unknown type name ‘uint16_t’
static inline uint16_t mul_8_8 (uint8_t op1, uint8_t op2)
^
prog.c:1:33: error: unknown type name ‘uint8_t’
static inline uint16_t mul_8_8 (uint8_t op1, uint8_t op2)
^
prog.c:1:46: error: unknown type name ‘uint8_t’
static inline uint16_t mul_8_8 (uint8_t op1, uint8_t op2)
^
prog.c:18:1: error: unknown type name ‘__uint24’
static inline __uint24 mul_16_8 (uint16_t op1, uint8_t op2)
^
prog.c:18:34: error: unknown type name ‘uint16_t’
static inline __uint24 mul_16_8 (uint16_t op1, uint8_t op2)
^
prog.c:18:48: error: unknown type name ‘uint8_t’
static inline __uint24 mul_16_8 (uint16_t op1, uint8_t op2)
^
prog.c:40:1: error: unknown type name ‘uint32_t’
static inline uint32_t mul_16_16 (uint16_t op1, uint16_t op2)
^
prog.c:40:35: error: unknown type name ‘uint16_t’
static inline uint32_t mul_16_16 (uint16_t op1, uint16_t op2)
^
prog.c:40:49: error: unknown type name ‘uint16_t’
static inline uint32_t mul_16_16 (uint16_t op1, uint16_t op2)
^