asm volatile (
" sbi %[tifr],1<<%[ocf_bit]\n"
" lds %A[now_low],%[tcnt]+0\n"
" lds %B[now_low],%[tcnt]+1\n"
" in %[tifr_var],%[tifr1]\n"
" andi %[tifr_var],1<<%[tov]\n"
" breq no_overflow_%=\n"
" subi %A[now_high],-1\n"
" sbci %B[now_high],-1\n"
" lds %A[now_low],%[tcnt]+0\n"
" lds %B[now_low],%[tcnt]+1\n"
"no_overflow_%=:\n"
" sub %A[time_plus_past],%A[now_low]\n"
" sbc %B[time_plus_past],%B[now_low]\n"
" sbc %C[time_plus_past],%A[now_high]\n"
" sbc %D[time_plus_past],%B[now_high]\n"
" sub %A[time_plus_past],%A[clearance_plus_past]\n"
" sbc %B[time_plus_past],%B[clearance_plus_past]\n"
" sbc %C[time_plus_past],%C[clearance_plus_past]\n"
" sbc %D[time_plus_past],%D[clearance_plus_past]\n"
" brcc no_saturation_%=\n"
" sub %A[time],%A[time_plus_past]\n"
" sbc %B[time],%B[time_plus_past]\n"
" sbc %C[time],%C[time_plus_past]\n"
" sbc %D[time],%D[time_plus_past]\n"
"no_saturation_%=:\n"
" sts %[ocr]+1,%B[time]\n"
" sts %[ocr]+0,%A[time]\n"
" lds %[tifr_var],%[timsk]\n"
" ori %[tifr_var],1<<%[ocie_bit]\n"
" sts %[timsk],%[tifr_var]\n"
: [now_low] "=&r" (now_low),
[now_high] "=&a" (now_high),
[tifr_var] "=&a" (tifr_var),
[time_plus_past] "=&r" (time_plus_past),
: "[now_high]" (now_high),
"[time_plus_past]" (time_plus_past),
[clearance_plus_past] "r" (clearance_plus_past),
[tcnt] "n" (_SFR_MEM_ADDR(TCNT1)),
[tifr1] "I" (_SFR_IO_ADDR(TIFR1)),
[tov] "n" (TOV1),
[ocr] "n" (ocr_reg + __SFR_OFFSET),
[timsk] "n" (timsk_reg + __SFR_OFFSET),
[ocie_bit] "n" (ocie_bit),
[tifr] "I" (tifr_reg),
[ocf_bit] "n" (ocf_bit)
);
ICAgICAgICAgICAgYXNtIHZvbGF0aWxlICgKICAgICAgICAgICAgICAgICIgICAgc2JpICVbdGlmcl0sMTw8JVtvY2ZfYml0XVxuIgogICAgICAgICAgICAgICAgIiAgICBsZHMgJUFbbm93X2xvd10sJVt0Y250XSswXG4iCiAgICAgICAgICAgICAgICAiICAgIGxkcyAlQltub3dfbG93XSwlW3RjbnRdKzFcbiIKICAgICAgICAgICAgICAgICIgICAgaW4gJVt0aWZyX3Zhcl0sJVt0aWZyMV1cbiIKICAgICAgICAgICAgICAgICIgICAgYW5kaSAlW3RpZnJfdmFyXSwxPDwlW3Rvdl1cbiIKICAgICAgICAgICAgICAgICIgICAgYnJlcSBub19vdmVyZmxvd18lPVxuIgogICAgICAgICAgICAgICAgIiAgICBzdWJpICVBW25vd19oaWdoXSwtMVxuIgogICAgICAgICAgICAgICAgIiAgICBzYmNpICVCW25vd19oaWdoXSwtMVxuIgogICAgICAgICAgICAgICAgIiAgICBsZHMgJUFbbm93X2xvd10sJVt0Y250XSswXG4iCiAgICAgICAgICAgICAgICAiICAgIGxkcyAlQltub3dfbG93XSwlW3RjbnRdKzFcbiIKICAgICAgICAgICAgICAgICJub19vdmVyZmxvd18lPTpcbiIKICAgICAgICAgICAgICAgICIgICAgc3ViICVBW3RpbWVfcGx1c19wYXN0XSwlQVtub3dfbG93XVxuIgogICAgICAgICAgICAgICAgIiAgICBzYmMgJUJbdGltZV9wbHVzX3Bhc3RdLCVCW25vd19sb3ddXG4iCiAgICAgICAgICAgICAgICAiICAgIHNiYyAlQ1t0aW1lX3BsdXNfcGFzdF0sJUFbbm93X2hpZ2hdXG4iCiAgICAgICAgICAgICAgICAiICAgIHNiYyAlRFt0aW1lX3BsdXNfcGFzdF0sJUJbbm93X2hpZ2hdXG4iCiAgICAgICAgICAgICAgICAiICAgIHN1YiAlQVt0aW1lX3BsdXNfcGFzdF0sJUFbY2xlYXJhbmNlX3BsdXNfcGFzdF1cbiIKICAgICAgICAgICAgICAgICIgICAgc2JjICVCW3RpbWVfcGx1c19wYXN0XSwlQltjbGVhcmFuY2VfcGx1c19wYXN0XVxuIgogICAgICAgICAgICAgICAgIiAgICBzYmMgJUNbdGltZV9wbHVzX3Bhc3RdLCVDW2NsZWFyYW5jZV9wbHVzX3Bhc3RdXG4iCiAgICAgICAgICAgICAgICAiICAgIHNiYyAlRFt0aW1lX3BsdXNfcGFzdF0sJURbY2xlYXJhbmNlX3BsdXNfcGFzdF1cbiIKICAgICAgICAgICAgICAgICIgICAgYnJjYyBub19zYXR1cmF0aW9uXyU9XG4iCiAgICAgICAgICAgICAgICAiICAgIHN1YiAlQVt0aW1lXSwlQVt0aW1lX3BsdXNfcGFzdF1cbiIKICAgICAgICAgICAgICAgICIgICAgc2JjICVCW3RpbWVdLCVCW3RpbWVfcGx1c19wYXN0XVxuIgogICAgICAgICAgICAgICAgIiAgICBzYmMgJUNbdGltZV0sJUNbdGltZV9wbHVzX3Bhc3RdXG4iCiAgICAgICAgICAgICAgICAiICAgIHNiYyAlRFt0aW1lXSwlRFt0aW1lX3BsdXNfcGFzdF1cbiIKICAgICAgICAgICAgICAgICJub19zYXR1cmF0aW9uXyU9OlxuIgogICAgICAgICAgICAgICAgIiAgICBzdHMgJVtvY3JdKzEsJUJbdGltZV1cbiIKICAgICAgICAgICAgICAgICIgICAgc3RzICVbb2NyXSswLCVBW3RpbWVdXG4iCiAgICAgICAgICAgICAgICAiICAgIGxkcyAlW3RpZnJfdmFyXSwlW3RpbXNrXVxuIgogICAgICAgICAgICAgICAgIiAgICBvcmkgJVt0aWZyX3Zhcl0sMTw8JVtvY2llX2JpdF1cbiIKICAgICAgICAgICAgICAgICIgICAgc3RzICVbdGltc2tdLCVbdGlmcl92YXJdXG4iCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgIDogW25vd19sb3ddICI9JnIiIChub3dfbG93KSwKICAgICAgICAgICAgICAgICAgW25vd19oaWdoXSAiPSZhIiAobm93X2hpZ2gpLAogICAgICAgICAgICAgICAgICBbdGlmcl92YXJdICI9JmEiICh0aWZyX3ZhciksCiAgICAgICAgICAgICAgICAgIFt0aW1lX3BsdXNfcGFzdF0gIj0mciIgKHRpbWVfcGx1c19wYXN0KSwKICAgICAgICAgICAgICAgICAgW3RpbWVdICI9JnIiICh0aW1lKQogICAgICAgICAgICAgICAgOiAiW25vd19oaWdoXSIgKG5vd19oaWdoKSwKICAgICAgICAgICAgICAgICAgIlt0aW1lX3BsdXNfcGFzdF0iICh0aW1lX3BsdXNfcGFzdCksCiAgICAgICAgICAgICAgICAgICJbdGltZV0iICh0aW1lKSwKICAgICAgICAgICAgICAgICAgW2NsZWFyYW5jZV9wbHVzX3Bhc3RdICJyIiAoY2xlYXJhbmNlX3BsdXNfcGFzdCksCiAgICAgICAgICAgICAgICAgIFt0Y250XSAibiIgKF9TRlJfTUVNX0FERFIoVENOVDEpKSwKICAgICAgICAgICAgICAgICAgW3RpZnIxXSAiSSIgKF9TRlJfSU9fQUREUihUSUZSMSkpLAogICAgICAgICAgICAgICAgICBbdG92XSAibiIgKFRPVjEpLAogICAgICAgICAgICAgICAgICBbb2NyXSAibiIgKG9jcl9yZWcgKyBfX1NGUl9PRkZTRVQpLAogICAgICAgICAgICAgICAgICBbdGltc2tdICJuIiAodGltc2tfcmVnICsgX19TRlJfT0ZGU0VUKSwKICAgICAgICAgICAgICAgICAgW29jaWVfYml0XSAibiIgKG9jaWVfYml0KSwKICAgICAgICAgICAgICAgICAgW3RpZnJdICJJIiAodGlmcl9yZWcpLAogICAgICAgICAgICAgICAgICBbb2NmX2JpdF0gIm4iIChvY2ZfYml0KQogICAgICAgICAgICApOw==