Because variables are linked to fixed registers, there is a problem in :
(*__errno_location())=(-_r0);
As __errno_location() uses r0 to return the address of the errno location,
the negated address will be assigned instead of the error code.
Attached patch will resolve this.