Annotation of qemu/roms/qemu-palcode/memset.c, revision 1.1

1.1     ! root        1: /* The standard memset function.
        !             2: 
        !             3:    Copyright (C) 2011 Richard Henderson
        !             4: 
        !             5:    This file is part of QEMU PALcode.
        !             6: 
        !             7:    This program is free software; you can redistribute it and/or modify
        !             8:    it under the terms of the GNU General Public License as published by
        !             9:    the Free Software Foundation; either version 2 of the License or
        !            10:    (at your option) any later version.
        !            11: 
        !            12:    This program is distributed in the hope that it will be useful,
        !            13:    but WITHOUT ANY WARRANTY; without even the implied warranty of
        !            14:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the text
        !            15:    of the GNU General Public License for more details.
        !            16: 
        !            17:    You should have received a copy of the GNU General Public License
        !            18:    along with this program; see the file COPYING.  If not see
        !            19:    <http://www.gnu.org/licenses/>.  */
        !            20: 
        !            21: 
        !            22: #include <string.h>
        !            23: 
        !            24: void *memset(void *optr, int ival, unsigned long size)
        !            25: {
        !            26:   unsigned long val = ival;
        !            27:   void *ptr = optr;
        !            28: 
        !            29:   if (__builtin_expect (size == 0, 0))
        !            30:     return optr;
        !            31: 
        !            32:   if (__builtin_expect (val != 0, 0))
        !            33:     {
        !            34:       val = val & 0xff;
        !            35:       val |= val << 8;
        !            36:       val |= val << 16;
        !            37:       val |= val << 32;
        !            38:     }
        !            39: 
        !            40:   if (__builtin_expect ((unsigned long)ptr & 1, 0))
        !            41:     {
        !            42:       *(char *)ptr = val;
        !            43:       ptr += 1;
        !            44:       size -= 1;
        !            45:     }
        !            46: 
        !            47:   if (__builtin_expect ((unsigned long)ptr & 2, 0))
        !            48:     {
        !            49:       if (size < 2)
        !            50:        goto tail_1;
        !            51:       *(short *)ptr = val;
        !            52:       ptr += 2;
        !            53:       size -= 2;
        !            54:     }
        !            55: 
        !            56:   if (__builtin_expect ((unsigned long)ptr & 4, 0))
        !            57:     {
        !            58:       if (size < 4)
        !            59:        goto tail_3;
        !            60:       *(int *)ptr = val;
        !            61:       ptr += 4;
        !            62:       size -= 4;
        !            63:     }
        !            64:   
        !            65:   while (size >= 8)
        !            66:     {
        !            67:       *(long *)ptr = val;
        !            68:       ptr += 8;
        !            69:       size -= 8;
        !            70:     }
        !            71: 
        !            72:   if (size >= 4)
        !            73:     {
        !            74:       *(int *)ptr = val;
        !            75:       ptr += 4;
        !            76:       size -= 4;
        !            77:     }
        !            78: 
        !            79:  tail_3:
        !            80:   if (size >= 2)
        !            81:     {
        !            82:       *(short *)ptr = val;
        !            83:       ptr += 2;
        !            84:       size -= 2;
        !            85:     }
        !            86: 
        !            87:  tail_1:
        !            88:   if (size > 0)
        !            89:     {
        !            90:       *(char *)ptr = val;
        !            91:       ptr += 1;
        !            92:       size -= 1;
        !            93:     }
        !            94: 
        !            95:   return optr;
        !            96: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.