1/* Generic implementation of the UNPACK intrinsic 2 Copyright (C) 2002-2020 Free Software Foundation, Inc. 3 Contributed by Paul Brook <paul@nowt.org> 4 5This file is part of the GNU Fortran runtime library (libgfortran). 6 7Libgfortran is free software; you can redistribute it and/or 8modify it under the terms of the GNU General Public 9License as published by the Free Software Foundation; either 10version 3 of the License, or (at your option) any later version. 11 12Ligbfortran is distributed in the hope that it will be useful, 13but WITHOUT ANY WARRANTY; without even the implied warranty of 14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 15GNU General Public License for more details. 16 17Under Section 7 of GPL version 3, you are granted additional 18permissions described in the GCC Runtime Library Exception, version 193.1, as published by the Free Software Foundation. 20 21You should have received a copy of the GNU General Public License and 22a copy of the GCC Runtime Library Exception along with this program; 23see the files COPYING3 and COPYING.RUNTIME respectively. If not, see 24<http://www.gnu.org/licenses/>. */ 25 26#include "libgfortran.h" 27#include <assert.h> 28#include <string.h> 29 30/* All the bounds checking for unpack in one function. If field is NULL, 31 we don't check it, for the unpack0 functions. */ 32 33static void 34unpack_bounds (gfc_array_char *ret, const gfc_array_char *vector, 35 const gfc_array_l1 *mask, const gfc_array_char *field) 36{ 37 index_type vec_size, mask_count; 38 vec_size = size0 ((array_t *) vector); 39 mask_count = count_0 (mask); 40 if (vec_size < mask_count) 41 runtime_error ("Incorrect size of return value in UNPACK" 42 " intrinsic: should be at least %ld, is" 43 " %ld", (long int) mask_count, 44 (long int) vec_size); 45 46 if (field != NULL) 47 bounds_equal_extents ((array_t *) field, (array_t *) mask, 48 "FIELD", "UNPACK"); 49 50 if (ret->base_addr != NULL) 51 bounds_equal_extents ((array_t *) ret, (array_t *) mask, 52 "return value", "UNPACK"); 53 54} 55 56static void 57unpack_internal (gfc_array_char *ret, const gfc_array_char *vector, 58 const gfc_array_l1 *mask, const gfc_array_char *field, 59 index_type size) 60{ 61 /* r.* indicates the return array. */ 62 index_type rstride[GFC_MAX_DIMENSIONS]; 63 index_type rstride0; 64 index_type rs; 65 char * restrict rptr; 66 /* v.* indicates the vector array. */ 67 index_type vstride0; 68 char *vptr; 69 /* f.* indicates the field array. */ 70 index_type fstride[GFC_MAX_DIMENSIONS]; 71 index_type fstride0; 72 const char *fptr; 73 /* m.* indicates the mask array. */ 74 index_type mstride[GFC_MAX_DIMENSIONS]; 75 index_type mstride0; 76 const GFC_LOGICAL_1 *mptr; 77 78 index_type count[GFC_MAX_DIMENSIONS]; 79 index_type extent[GFC_MAX_DIMENSIONS]; 80 index_type n; 81 index_type dim; 82 83 int empty; 84 int mask_kind; 85 86 empty = 0; 87 88 mptr = mask->base_addr; 89 90 /* Use the same loop for all logical types, by using GFC_LOGICAL_1 91 and using shifting to address size and endian issues. */ 92 93 mask_kind = GFC_DESCRIPTOR_SIZE (mask); 94 95 if (mask_kind == 1 || mask_kind == 2 || mask_kind == 4 || mask_kind == 8 96#ifdef HAVE_GFC_LOGICAL_16 97 || mask_kind == 16 98#endif 99 ) 100 { 101 /* Don't convert a NULL pointer as we use test for NULL below. */ 102 if (mptr) 103 mptr = GFOR_POINTER_TO_L1 (mptr, mask_kind); 104 } 105 else 106 runtime_error ("Funny sized logical array"); 107 108 if (ret->base_addr == NULL) 109 { 110 /* The front end has signalled that we need to populate the 111 return array descriptor. */ 112 dim = GFC_DESCRIPTOR_RANK (mask); 113 rs = 1; 114 for (n = 0; n < dim; n++) 115 { 116 count[n] = 0; 117 GFC_DIMENSION_SET(ret->dim[n], 0, 118 GFC_DESCRIPTOR_EXTENT(mask,n) - 1, rs); 119 extent[n] = GFC_DESCRIPTOR_EXTENT(ret,n); 120 empty = empty || extent[n] <= 0; 121 rstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(ret, n); 122 fstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(field, n); 123 mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n); 124 rs *= extent[n]; 125 } 126 ret->offset = 0; 127 ret->base_addr = xmallocarray (rs, size); 128 } 129 else 130 { 131 dim = GFC_DESCRIPTOR_RANK (ret); 132 for (n = 0; n < dim; n++) 133 { 134 count[n] = 0; 135 extent[n] = GFC_DESCRIPTOR_EXTENT(ret,n); 136 empty = empty || extent[n] <= 0; 137 rstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(ret, n); 138 fstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(field, n); 139 mstride[n] = GFC_DESCRIPTOR_STRIDE_BYTES(mask, n); 140 } 141 } 142 143 if (empty) 144 return; 145 146 /* This assert makes sure GCC knows we can access *stride[0] later. */ 147 assert (dim > 0); 148 149 vstride0 = GFC_DESCRIPTOR_STRIDE_BYTES(vector,0); 150 rstride0 = rstride[0]; 151 fstride0 = fstride[0]; 152 mstride0 = mstride[0]; 153 rptr = ret->base_addr; 154 fptr = field->base_addr; 155 vptr = vector->base_addr; 156 157 while (rptr) 158 { 159 if (*mptr) 160 { 161 /* From vector. */ 162 memcpy (rptr, vptr, size); 163 vptr += vstride0; 164 } 165 else 166 { 167 /* From field. */ 168 memcpy (rptr, fptr, size); 169 } 170 /* Advance to the next element. */ 171 rptr += rstride0; 172 fptr += fstride0; 173 mptr += mstride0; 174 count[0]++; 175 n = 0; 176 while (count[n] == extent[n]) 177 { 178 /* When we get to the end of a dimension, reset it and increment 179 the next dimension. */ 180 count[n] = 0; 181 /* We could precalculate these products, but this is a less 182 frequently used path so probably not worth it. */ 183 rptr -= rstride[n] * extent[n]; 184 fptr -= fstride[n] * extent[n]; 185 mptr -= mstride[n] * extent[n]; 186 n++; 187 if (n >= dim) 188 { 189 /* Break out of the loop. */ 190 rptr = NULL; 191 break; 192 } 193 else 194 { 195 count[n]++; 196 rptr += rstride[n]; 197 fptr += fstride[n]; 198 mptr += mstride[n]; 199 } 200 } 201 } 202} 203 204extern void unpack1 (gfc_array_char *, const gfc_array_char *, 205 const gfc_array_l1 *, const gfc_array_char *); 206export_proto(unpack1); 207 208void 209unpack1 (gfc_array_char *ret, const gfc_array_char *vector, 210 const gfc_array_l1 *mask, const gfc_array_char *field) 211{ 212 index_type type_size; 213 index_type size; 214 215 if (unlikely(compile_options.bounds_check)) 216 unpack_bounds (ret, vector, mask, field); 217 218 type_size = GFC_DTYPE_TYPE_SIZE (vector); 219 size = GFC_DESCRIPTOR_SIZE (vector); 220 221 switch(type_size) 222 { 223 case GFC_DTYPE_LOGICAL_1: 224 case GFC_DTYPE_INTEGER_1: 225 unpack1_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector, 226 mask, (gfc_array_i1 *) field); 227 return; 228 229 case GFC_DTYPE_LOGICAL_2: 230 case GFC_DTYPE_INTEGER_2: 231 unpack1_i2 ((gfc_array_i2 *) ret, (gfc_array_i2 *) vector, 232 mask, (gfc_array_i2 *) field); 233 return; 234 235 case GFC_DTYPE_LOGICAL_4: 236 case GFC_DTYPE_INTEGER_4: 237 unpack1_i4 ((gfc_array_i4 *) ret, (gfc_array_i4 *) vector, 238 mask, (gfc_array_i4 *) field); 239 return; 240 241 case GFC_DTYPE_LOGICAL_8: 242 case GFC_DTYPE_INTEGER_8: 243 unpack1_i8 ((gfc_array_i8 *) ret, (gfc_array_i8 *) vector, 244 mask, (gfc_array_i8 *) field); 245 return; 246 247#ifdef HAVE_GFC_INTEGER_16 248 case GFC_DTYPE_LOGICAL_16: 249 case GFC_DTYPE_INTEGER_16: 250 unpack1_i16 ((gfc_array_i16 *) ret, (gfc_array_i16 *) vector, 251 mask, (gfc_array_i16 *) field); 252 return; 253#endif 254 255 case GFC_DTYPE_REAL_4: 256 unpack1_r4 ((gfc_array_r4 *) ret, (gfc_array_r4 *) vector, 257 mask, (gfc_array_r4 *) field); 258 return; 259 260 case GFC_DTYPE_REAL_8: 261 unpack1_r8 ((gfc_array_r8 *) ret, (gfc_array_r8 *) vector, 262 mask, (gfc_array_r8 *) field); 263 return; 264 265/* FIXME: This here is a hack, which will have to be removed when 266 the array descriptor is reworked. Currently, we don't store the 267 kind value for the type, but only the size. Because on targets with 268 __float128, we have sizeof(logn double) == sizeof(__float128), 269 we cannot discriminate here and have to fall back to the generic 270 handling (which is suboptimal). */ 271#if !defined(GFC_REAL_16_IS_FLOAT128) 272# ifdef HAVE_GFC_REAL_10 273 case GFC_DTYPE_REAL_10: 274 unpack1_r10 ((gfc_array_r10 *) ret, (gfc_array_r10 *) vector, 275 mask, (gfc_array_r10 *) field); 276 return; 277# endif 278 279# ifdef HAVE_GFC_REAL_16 280 case GFC_DTYPE_REAL_16: 281 unpack1_r16 ((gfc_array_r16 *) ret, (gfc_array_r16 *) vector, 282 mask, (gfc_array_r16 *) field); 283 return; 284# endif 285#endif 286 287 case GFC_DTYPE_COMPLEX_4: 288 unpack1_c4 ((gfc_array_c4 *) ret, (gfc_array_c4 *) vector, 289 mask, (gfc_array_c4 *) field); 290 return; 291 292 case GFC_DTYPE_COMPLEX_8: 293 unpack1_c8 ((gfc_array_c8 *) ret, (gfc_array_c8 *) vector, 294 mask, (gfc_array_c8 *) field); 295 return; 296 297/* FIXME: This here is a hack, which will have to be removed when 298 the array descriptor is reworked. Currently, we don't store the 299 kind value for the type, but only the size. Because on targets with 300 __float128, we have sizeof(logn double) == sizeof(__float128), 301 we cannot discriminate here and have to fall back to the generic 302 handling (which is suboptimal). */ 303#if !defined(GFC_REAL_16_IS_FLOAT128) 304# ifdef HAVE_GFC_COMPLEX_10 305 case GFC_DTYPE_COMPLEX_10: 306 unpack1_c10 ((gfc_array_c10 *) ret, (gfc_array_c10 *) vector, 307 mask, (gfc_array_c10 *) field); 308 return; 309# endif 310 311# ifdef HAVE_GFC_COMPLEX_16 312 case GFC_DTYPE_COMPLEX_16: 313 unpack1_c16 ((gfc_array_c16 *) ret, (gfc_array_c16 *) vector, 314 mask, (gfc_array_c16 *) field); 315 return; 316# endif 317#endif 318 319 } 320 321 switch (GFC_DESCRIPTOR_SIZE(ret)) 322 { 323 case 1: 324 unpack1_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector, 325 mask, (gfc_array_i1 *) field); 326 return; 327 328 case 2: 329 if (GFC_UNALIGNED_2(ret->base_addr) || GFC_UNALIGNED_2(vector->base_addr) 330 || GFC_UNALIGNED_2(field->base_addr)) 331 break; 332 else 333 { 334 unpack1_i2 ((gfc_array_i2 *) ret, (gfc_array_i2 *) vector, 335 mask, (gfc_array_i2 *) field); 336 return; 337 } 338 339 case 4: 340 if (GFC_UNALIGNED_4(ret->base_addr) || GFC_UNALIGNED_4(vector->base_addr) 341 || GFC_UNALIGNED_4(field->base_addr)) 342 break; 343 else 344 { 345 unpack1_i4 ((gfc_array_i4 *) ret, (gfc_array_i4 *) vector, 346 mask, (gfc_array_i4 *) field); 347 return; 348 } 349 350 case 8: 351 if (GFC_UNALIGNED_8(ret->base_addr) || GFC_UNALIGNED_8(vector->base_addr) 352 || GFC_UNALIGNED_8(field->base_addr)) 353 break; 354 else 355 { 356 unpack1_i8 ((gfc_array_i8 *) ret, (gfc_array_i8 *) vector, 357 mask, (gfc_array_i8 *) field); 358 return; 359 } 360 361#ifdef HAVE_GFC_INTEGER_16 362 case 16: 363 if (GFC_UNALIGNED_16(ret->base_addr) 364 || GFC_UNALIGNED_16(vector->base_addr) 365 || GFC_UNALIGNED_16(field->base_addr)) 366 break; 367 else 368 { 369 unpack1_i16 ((gfc_array_i16 *) ret, (gfc_array_i16 *) vector, 370 mask, (gfc_array_i16 *) field); 371 return; 372 } 373#endif 374 default: 375 break; 376 } 377 378 unpack_internal (ret, vector, mask, field, size); 379} 380 381 382extern void unpack1_char (gfc_array_char *, GFC_INTEGER_4, 383 const gfc_array_char *, const gfc_array_l1 *, 384 const gfc_array_char *, GFC_INTEGER_4, 385 GFC_INTEGER_4); 386export_proto(unpack1_char); 387 388void 389unpack1_char (gfc_array_char *ret, 390 GFC_INTEGER_4 ret_length __attribute__((unused)), 391 const gfc_array_char *vector, const gfc_array_l1 *mask, 392 const gfc_array_char *field, GFC_INTEGER_4 vector_length, 393 GFC_INTEGER_4 field_length __attribute__((unused))) 394{ 395 396 if (unlikely(compile_options.bounds_check)) 397 unpack_bounds (ret, vector, mask, field); 398 399 unpack_internal (ret, vector, mask, field, vector_length); 400} 401 402 403extern void unpack1_char4 (gfc_array_char *, GFC_INTEGER_4, 404 const gfc_array_char *, const gfc_array_l1 *, 405 const gfc_array_char *, GFC_INTEGER_4, 406 GFC_INTEGER_4); 407export_proto(unpack1_char4); 408 409void 410unpack1_char4 (gfc_array_char *ret, 411 GFC_INTEGER_4 ret_length __attribute__((unused)), 412 const gfc_array_char *vector, const gfc_array_l1 *mask, 413 const gfc_array_char *field, GFC_INTEGER_4 vector_length, 414 GFC_INTEGER_4 field_length __attribute__((unused))) 415{ 416 417 if (unlikely(compile_options.bounds_check)) 418 unpack_bounds (ret, vector, mask, field); 419 420 unpack_internal (ret, vector, mask, field, 421 vector_length * sizeof (gfc_char4_t)); 422} 423 424 425extern void unpack0 (gfc_array_char *, const gfc_array_char *, 426 const gfc_array_l1 *, char *); 427export_proto(unpack0); 428 429void 430unpack0 (gfc_array_char *ret, const gfc_array_char *vector, 431 const gfc_array_l1 *mask, char *field) 432{ 433 gfc_array_char tmp; 434 435 index_type type_size; 436 437 if (unlikely(compile_options.bounds_check)) 438 unpack_bounds (ret, vector, mask, NULL); 439 440 type_size = GFC_DTYPE_TYPE_SIZE (vector); 441 442 switch (type_size) 443 { 444 case GFC_DTYPE_LOGICAL_1: 445 case GFC_DTYPE_INTEGER_1: 446 unpack0_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector, 447 mask, (GFC_INTEGER_1 *) field); 448 return; 449 450 case GFC_DTYPE_LOGICAL_2: 451 case GFC_DTYPE_INTEGER_2: 452 unpack0_i2 ((gfc_array_i2 *) ret, (gfc_array_i2 *) vector, 453 mask, (GFC_INTEGER_2 *) field); 454 return; 455 456 case GFC_DTYPE_LOGICAL_4: 457 case GFC_DTYPE_INTEGER_4: 458 unpack0_i4 ((gfc_array_i4 *) ret, (gfc_array_i4 *) vector, 459 mask, (GFC_INTEGER_4 *) field); 460 return; 461 462 case GFC_DTYPE_LOGICAL_8: 463 case GFC_DTYPE_INTEGER_8: 464 unpack0_i8 ((gfc_array_i8 *) ret, (gfc_array_i8 *) vector, 465 mask, (GFC_INTEGER_8 *) field); 466 return; 467 468#ifdef HAVE_GFC_INTEGER_16 469 case GFC_DTYPE_LOGICAL_16: 470 case GFC_DTYPE_INTEGER_16: 471 unpack0_i16 ((gfc_array_i16 *) ret, (gfc_array_i16 *) vector, 472 mask, (GFC_INTEGER_16 *) field); 473 return; 474#endif 475 476 case GFC_DTYPE_REAL_4: 477 unpack0_r4 ((gfc_array_r4 *) ret, (gfc_array_r4 *) vector, 478 mask, (GFC_REAL_4 *) field); 479 return; 480 481 case GFC_DTYPE_REAL_8: 482 unpack0_r8 ((gfc_array_r8 *) ret, (gfc_array_r8*) vector, 483 mask, (GFC_REAL_8 *) field); 484 return; 485 486/* FIXME: This here is a hack, which will have to be removed when 487 the array descriptor is reworked. Currently, we don't store the 488 kind value for the type, but only the size. Because on targets with 489 __float128, we have sizeof(logn double) == sizeof(__float128), 490 we cannot discriminate here and have to fall back to the generic 491 handling (which is suboptimal). */ 492#if !defined(GFC_REAL_16_IS_FLOAT128) 493# ifdef HAVE_GFC_REAL_10 494 case GFC_DTYPE_REAL_10: 495 unpack0_r10 ((gfc_array_r10 *) ret, (gfc_array_r10 *) vector, 496 mask, (GFC_REAL_10 *) field); 497 return; 498# endif 499 500# ifdef HAVE_GFC_REAL_16 501 case GFC_DTYPE_REAL_16: 502 unpack0_r16 ((gfc_array_r16 *) ret, (gfc_array_r16 *) vector, 503 mask, (GFC_REAL_16 *) field); 504 return; 505# endif 506#endif 507 508 case GFC_DTYPE_COMPLEX_4: 509 unpack0_c4 ((gfc_array_c4 *) ret, (gfc_array_c4 *) vector, 510 mask, (GFC_COMPLEX_4 *) field); 511 return; 512 513 case GFC_DTYPE_COMPLEX_8: 514 unpack0_c8 ((gfc_array_c8 *) ret, (gfc_array_c8 *) vector, 515 mask, (GFC_COMPLEX_8 *) field); 516 return; 517 518/* FIXME: This here is a hack, which will have to be removed when 519 the array descriptor is reworked. Currently, we don't store the 520 kind value for the type, but only the size. Because on targets with 521 __float128, we have sizeof(logn double) == sizeof(__float128), 522 we cannot discriminate here and have to fall back to the generic 523 handling (which is suboptimal). */ 524#if !defined(GFC_REAL_16_IS_FLOAT128) 525# ifdef HAVE_GFC_COMPLEX_10 526 case GFC_DTYPE_COMPLEX_10: 527 unpack0_c10 ((gfc_array_c10 *) ret, (gfc_array_c10 *) vector, 528 mask, (GFC_COMPLEX_10 *) field); 529 return; 530# endif 531 532# ifdef HAVE_GFC_COMPLEX_16 533 case GFC_DTYPE_COMPLEX_16: 534 unpack0_c16 ((gfc_array_c16 *) ret, (gfc_array_c16 *) vector, 535 mask, (GFC_COMPLEX_16 *) field); 536 return; 537# endif 538#endif 539 540 } 541 542 switch (GFC_DESCRIPTOR_SIZE(ret)) 543 { 544 case 1: 545 unpack0_i1 ((gfc_array_i1 *) ret, (gfc_array_i1 *) vector, 546 mask, (GFC_INTEGER_1 *) field); 547 return; 548 549 case 2: 550 if (GFC_UNALIGNED_2(ret->base_addr) || GFC_UNALIGNED_2(vector->base_addr) 551 || GFC_UNALIGNED_2(field)) 552 break; 553 else 554 { 555 unpack0_i2 ((gfc_array_i2 *) ret, (gfc_array_i2 *) vector, 556 mask, (GFC_INTEGER_2 *) field); 557 return; 558 } 559 560 case 4: 561 if (GFC_UNALIGNED_4(ret->base_addr) || GFC_UNALIGNED_4(vector->base_addr) 562 || GFC_UNALIGNED_4(field)) 563 break; 564 else 565 { 566 unpack0_i4 ((gfc_array_i4 *) ret, (gfc_array_i4 *) vector, 567 mask, (GFC_INTEGER_4 *) field); 568 return; 569 } 570 571 case 8: 572 if (GFC_UNALIGNED_8(ret->base_addr) || GFC_UNALIGNED_8(vector->base_addr) 573 || GFC_UNALIGNED_8(field)) 574 break; 575 else 576 { 577 unpack0_i8 ((gfc_array_i8 *) ret, (gfc_array_i8 *) vector, 578 mask, (GFC_INTEGER_8 *) field); 579 return; 580 } 581 582#ifdef HAVE_GFC_INTEGER_16 583 case 16: 584 if (GFC_UNALIGNED_16(ret->base_addr) 585 || GFC_UNALIGNED_16(vector->base_addr) 586 || GFC_UNALIGNED_16(field)) 587 break; 588 else 589 { 590 unpack0_i16 ((gfc_array_i16 *) ret, (gfc_array_i16 *) vector, 591 mask, (GFC_INTEGER_16 *) field); 592 return; 593 } 594#endif 595 } 596 597 memset (&tmp, 0, sizeof (tmp)); 598 GFC_DTYPE_CLEAR(&tmp); 599 tmp.base_addr = field; 600 unpack_internal (ret, vector, mask, &tmp, GFC_DESCRIPTOR_SIZE (vector)); 601} 602 603 604extern void unpack0_char (gfc_array_char *, GFC_INTEGER_4, 605 const gfc_array_char *, const gfc_array_l1 *, 606 char *, GFC_INTEGER_4, GFC_INTEGER_4); 607export_proto(unpack0_char); 608 609void 610unpack0_char (gfc_array_char *ret, 611 GFC_INTEGER_4 ret_length __attribute__((unused)), 612 const gfc_array_char *vector, const gfc_array_l1 *mask, 613 char *field, GFC_INTEGER_4 vector_length, 614 GFC_INTEGER_4 field_length __attribute__((unused))) 615{ 616 gfc_array_char tmp; 617 618 if (unlikely(compile_options.bounds_check)) 619 unpack_bounds (ret, vector, mask, NULL); 620 621 memset (&tmp, 0, sizeof (tmp)); 622 GFC_DTYPE_CLEAR(&tmp); 623 tmp.base_addr = field; 624 unpack_internal (ret, vector, mask, &tmp, vector_length); 625} 626 627 628extern void unpack0_char4 (gfc_array_char *, GFC_INTEGER_4, 629 const gfc_array_char *, const gfc_array_l1 *, 630 char *, GFC_INTEGER_4, GFC_INTEGER_4); 631export_proto(unpack0_char4); 632 633void 634unpack0_char4 (gfc_array_char *ret, 635 GFC_INTEGER_4 ret_length __attribute__((unused)), 636 const gfc_array_char *vector, const gfc_array_l1 *mask, 637 char *field, GFC_INTEGER_4 vector_length, 638 GFC_INTEGER_4 field_length __attribute__((unused))) 639{ 640 gfc_array_char tmp; 641 642 if (unlikely(compile_options.bounds_check)) 643 unpack_bounds (ret, vector, mask, NULL); 644 645 memset (&tmp, 0, sizeof (tmp)); 646 GFC_DTYPE_CLEAR(&tmp); 647 tmp.base_addr = field; 648 unpack_internal (ret, vector, mask, &tmp, 649 vector_length * sizeof (gfc_char4_t)); 650} 651