+ /* A single integer return value is always promoted to a full
+ word. */
+ if (count == 1)
+ {
+ switch (types[0]->__code & GO_CODE_MASK)
+ {
+ case GO_BOOL:
+ case GO_INT8:
+ case GO_INT16:
+ case GO_INT32:
+ case GO_UINT8:
+ case GO_UINT16:
+ case GO_UINT32:
+ case GO_INT:
+ case GO_UINT:
+ {
+ union
+ {
+ unsigned char buf[sizeof (ffi_arg)];
+ ffi_arg v;
+ } u;
+ ffi_arg v;
+
+ __builtin_memcpy (&u.buf, call_result, sizeof (ffi_arg));
+ v = u.v;
+
+ switch (types[0]->__size)
+ {
+ case 1:
+ {
+ uint8_t b;
+
+ b = (uint8_t) v;
+ __builtin_memcpy (results[0], &b, 1);
+ }
+ break;
+
+ case 2:
+ {
+ uint16_t s;
+
+ s = (uint16_t) v;
+ __builtin_memcpy (results[0], &s, 2);
+ }
+ break;
+
+ case 4:
+ {
+ uint32_t w;
+
+ w = (uint32_t) v;
+ __builtin_memcpy (results[0], &w, 4);
+ }
+ break;
+
+ case 8:
+ {
+ uint64_t d;
+
+ d = (uint64_t) v;
+ __builtin_memcpy (results[0], &d, 8);
+ }
+ break;
+
+ default:
+ abort ();
+ }
+ }
+ return;
+
+ default:
+ break;
+ }
+ }
+