Finding a method to construct the outputs separately instead of in this big block would reduce area significantly. I'm not sure such a method exists.