Artifact 17a1f21cccc89ef9046661455fc6b590f7ec3f32:


0000: 2f 2a 20 54 68 69 73 20 66 69 6c 65 20 69 73 20  /* This file is 
0010: 64 65 72 69 76 65 64 20 66 72 6f 6d 20 67 63 63  derived from gcc
0020: 2d 32 2e 36 2e 33 2f 6c 69 62 67 63 63 32 2e 63  -2.6.3/libgcc2.c
0030: 2c 20 73 65 63 74 69 6f 6e 20 4c 5f 63 6c 65 61  , section L_clea
0040: 72 5f 63 61 63 68 65 20 2a 2f 0a 0a 2f 2a 20 43  r_cache */../* C
0050: 6f 70 79 72 69 67 68 74 20 28 43 29 20 31 39 38  opyright (C) 198
0060: 39 2c 20 31 39 39 32 2c 20 31 39 39 33 2c 20 31  9, 1992, 1993, 1
0070: 39 39 34 20 46 72 65 65 20 53 6f 66 74 77 61 72  994 Free Softwar
0080: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
0090: 63 2e 0a 0a 54 68 69 73 20 66 69 6c 65 20 69 73  c...This file is
00a0: 20 70 61 72 74 20 6f 66 20 47 4e 55 20 43 43 2e   part of GNU CC.
00b0: 0a 0a 47 4e 55 20 43 43 20 69 73 20 66 72 65 65  ..GNU CC is free
00c0: 20 73 6f 66 74 77 61 72 65 3b 20 79 6f 75 20 63   software; you c
00d0: 61 6e 20 72 65 64 69 73 74 72 69 62 75 74 65 20  an redistribute 
00e0: 69 74 20 61 6e 64 2f 6f 72 20 6d 6f 64 69 66 79  it and/or modify
00f0: 0a 69 74 20 75 6e 64 65 72 20 74 68 65 20 74 65  .it under the te
0100: 72 6d 73 20 6f 66 20 74 68 65 20 47 4e 55 20 47  rms of the GNU G
0110: 65 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69  eneral Public Li
0120: 63 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68  cense as publish
0130: 65 64 20 62 79 0a 74 68 65 20 46 72 65 65 20 53  ed by.the Free S
0140: 6f 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69  oftware Foundati
0150: 6f 6e 3b 20 65 69 74 68 65 72 20 76 65 72 73 69  on; either versi
0160: 6f 6e 20 32 2c 20 6f 72 20 28 61 74 20 79 6f 75  on 2, or (at you
0170: 72 20 6f 70 74 69 6f 6e 29 0a 61 6e 79 20 6c 61  r option).any la
0180: 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 0a 47 4e  ter version...GN
0190: 55 20 43 43 20 69 73 20 64 69 73 74 72 69 62 75  U CC is distribu
01a0: 74 65 64 20 69 6e 20 74 68 65 20 68 6f 70 65 20  ted in the hope 
01b0: 74 68 61 74 20 69 74 20 77 69 6c 6c 20 62 65 20  that it will be 
01c0: 75 73 65 66 75 6c 2c 0a 62 75 74 20 57 49 54 48  useful,.but WITH
01d0: 4f 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59  OUT ANY WARRANTY
01e0: 3b 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74  ; without even t
01f0: 68 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61  he implied warra
0200: 6e 74 79 20 6f 66 0a 4d 45 52 43 48 41 4e 54 41  nty of.MERCHANTA
0210: 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e 45 53  BILITY or FITNES
0220: 53 20 46 4f 52 20 41 20 50 41 52 54 49 43 55 4c  S FOR A PARTICUL
0230: 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53 65 65  AR PURPOSE.  See
0240: 20 74 68 65 0a 47 4e 55 20 47 65 6e 65 72 61 6c   the.GNU General
0250: 20 50 75 62 6c 69 63 20 4c 69 63 65 6e 73 65 20   Public License 
0260: 66 6f 72 20 6d 6f 72 65 20 64 65 74 61 69 6c 73  for more details
0270: 2e 0a 0a 59 6f 75 20 73 68 6f 75 6c 64 20 68 61  ...You should ha
0280: 76 65 20 72 65 63 65 69 76 65 64 20 61 20 63 6f  ve received a co
0290: 70 79 20 6f 66 20 74 68 65 20 47 4e 55 20 47 65  py of the GNU Ge
02a0: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
02b0: 65 6e 73 65 0a 61 6c 6f 6e 67 20 77 69 74 68 20  ense.along with 
02c0: 47 4e 55 20 43 43 3b 20 73 65 65 20 74 68 65 20  GNU CC; see the 
02d0: 66 69 6c 65 20 43 4f 50 59 49 4e 47 2e 20 20 49  file COPYING.  I
02e0: 66 20 6e 6f 74 2c 20 77 72 69 74 65 20 74 6f 0a  f not, write to.
02f0: 74 68 65 20 46 72 65 65 20 53 6f 66 74 77 61 72  the Free Softwar
0300: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 36 37  e Foundation, 67
0310: 35 20 4d 61 73 73 20 41 76 65 2c 20 43 61 6d 62  5 Mass Ave, Camb
0320: 72 69 64 67 65 2c 20 4d 41 20 30 32 31 33 39 2c  ridge, MA 02139,
0330: 20 55 53 41 2e 20 20 2a 2f 0a 0a 0a 2f 2a 20 43   USA.  */.../* C
0340: 6c 65 61 72 20 70 61 72 74 20 6f 66 20 61 6e 20  lear part of an 
0350: 69 6e 73 74 72 75 63 74 69 6f 6e 20 63 61 63 68  instruction cach
0360: 65 2e 20 2a 2f 0a 0a 2f 2a 20 4f 75 72 20 65 6d  e. */../* Our em
0370: 70 68 61 73 69 73 20 68 65 72 65 20 69 73 20 5f  phasis here is _
0380: 6e 6f 74 5f 20 74 6f 20 63 6c 65 61 72 20 61 73  not_ to clear as
0390: 20 66 65 77 20 63 61 63 68 65 20 6c 69 6e 65 73   few cache lines
03a0: 20 61 73 20 70 6f 73 73 69 62 6c 65 0a 20 2a 20   as possible. * 
03b0: 6f 72 20 77 69 74 68 20 61 73 20 66 65 77 20 6d  or with as few m
03c0: 61 63 68 69 6e 65 20 69 6e 73 74 72 75 63 74 69  achine instructi
03d0: 6f 6e 73 20 61 73 20 70 6f 73 73 69 62 6c 65 2c  ons as possible,
03e0: 20 62 75 74 20 74 6f 20 64 6f 20 69 74 20 5f 72   but to do it _r
03f0: 69 67 68 74 5f 2e 0a 20 2a 2f 0a 0a 0a 0a 2f 2a  ight_.. */..../*
0400: 20 54 68 69 73 20 63 6f 64 65 20 69 73 20 61 70   This code is ap
0410: 70 61 72 65 6e 74 6c 79 20 75 6e 74 65 73 74 65  parently unteste
0420: 64 21 21 20 2a 2f 0a 0a 23 69 66 64 65 66 20 5f  d!! */..#ifdef _
0430: 5f 6d 36 38 6b 5f 5f 0a 23 69 66 64 65 66 20 4e  _m68k__.#ifdef N
0440: 65 58 54 0a 23 64 65 66 69 6e 65 20 43 4c 45 41  eXT.#define CLEA
0450: 52 5f 49 4e 53 4e 5f 43 41 43 48 45 28 42 45 47  R_INSN_CACHE(BEG
0460: 2c 20 45 4e 44 29 20 20 20 5c 0a 20 20 20 61 73  , END)   \.   as
0470: 6d 20 76 6f 6c 61 74 69 6c 65 20 28 22 74 72 61  m volatile ("tra
0480: 70 20 23 32 22 29 0a 23 65 6e 64 69 66 0a 23 65  p #2").#endif.#e
0490: 6e 64 69 66 0a 0a 2f 2a 20 54 68 69 73 20 69 73  ndif../* This is
04a0: 20 66 72 6f 6d 20 41 6e 64 72 65 61 73 20 53 74   from Andreas St
04b0: 6f 6c 63 6b 65 20 3c 73 74 6f 6c 63 6b 65 40 49  olcke <stolcke@I
04c0: 43 53 49 2e 42 65 72 6b 65 6c 65 79 2e 45 44 55  CSI.Berkeley.EDU
04d0: 3e 2e 20 2a 2f 0a 23 69 66 20 64 65 66 69 6e 65  >. */.#if define
04e0: 64 28 5f 5f 6d 69 70 73 5f 5f 29 20 7c 7c 20 64  d(__mips__) || d
04f0: 65 66 69 6e 65 64 28 5f 5f 6d 69 70 73 36 34 5f  efined(__mips64_
0500: 5f 29 0a 23 69 66 64 65 66 20 75 6c 74 72 69 78  _).#ifdef ultrix
0510: 0a 23 69 6e 63 6c 75 64 65 20 3c 6d 69 70 73 2f  .#include <mips/
0520: 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6c 73  cachectl.h>.#els
0530: 65 0a 23 69 6e 63 6c 75 64 65 20 3c 73 79 73 2f  e.#include <sys/
0540: 63 61 63 68 65 63 74 6c 2e 68 3e 0a 23 65 6e 64  cachectl.h>.#end
0550: 69 66 0a 23 64 65 66 69 6e 65 20 43 4c 45 41 52  if.#define CLEAR
0560: 5f 49 4e 53 4e 5f 43 41 43 48 45 28 42 45 47 2c  _INSN_CACHE(BEG,
0570: 20 45 4e 44 29 20 20 20 5c 0a 20 20 20 63 61 63   END)   \.   cac
0580: 68 65 66 6c 75 73 68 20 28 42 45 47 2c 20 45 4e  heflush (BEG, EN
0590: 44 20 2d 20 42 45 47 2c 20 42 43 41 43 48 45 29  D - BEG, BCACHE)
05a0: 0a 23 65 6e 64 69 66 0a 0a 23 69 66 64 65 66 20  .#endif..#ifdef 
05b0: 5f 5f 63 6f 6e 76 65 78 5f 5f 0a 23 64 65 66 69  __convex__.#defi
05c0: 6e 65 20 43 4c 45 41 52 5f 49 4e 53 4e 5f 43 41  ne CLEAR_INSN_CA
05d0: 43 48 45 28 42 45 47 2c 20 45 4e 44 29 20 20 20  CHE(BEG, END)   
05e0: 5c 0a 20 20 20 61 73 6d 20 28 22 70 69 63 68 22  \.   asm ("pich"
05f0: 29 0a 23 65 6e 64 69 66 0a 0a 76 6f 69 64 0a 5f  ).#endif..void._
0600: 5f 54 52 5f 63 6c 65 61 72 5f 63 61 63 68 65 20  _TR_clear_cache 
0610: 28 62 65 67 2c 20 65 6e 64 29 0a 20 20 20 20 20  (beg, end).     
0620: 63 68 61 72 20 2a 62 65 67 2c 20 2a 65 6e 64 3b  char *beg, *end;
0630: 0a 7b 0a 23 69 66 64 65 66 20 43 4c 45 41 52 5f  .{.#ifdef CLEAR_
0640: 49 4e 53 4e 5f 43 41 43 48 45 20 0a 20 20 43 4c  INSN_CACHE .  CL
0650: 45 41 52 5f 49 4e 53 4e 5f 43 41 43 48 45 20 28  EAR_INSN_CACHE (
0660: 62 65 67 2c 20 65 6e 64 29 3b 0a 23 65 6c 73 65  beg, end);.#else
0670: 0a 23 69 66 64 65 66 20 49 4e 53 4e 5f 43 41 43  .#ifdef INSN_CAC
0680: 48 45 5f 53 49 5a 45 20 2f 2a 20 54 68 69 73 20  HE_SIZE /* This 
0690: 69 73 20 61 63 74 75 61 6c 6c 79 20 64 65 61 64  is actually dead
06a0: 20 63 6f 64 65 21 21 20 2a 2f 0a 23 64 65 66 69   code!! */.#defi
06b0: 6e 65 20 49 4e 53 4e 5f 43 41 43 48 45 5f 50 4c  ne INSN_CACHE_PL
06c0: 41 4e 45 5f 53 49 5a 45 20 28 49 4e 53 4e 5f 43  ANE_SIZE (INSN_C
06d0: 41 43 48 45 5f 53 49 5a 45 20 2f 20 49 4e 53 4e  ACHE_SIZE / INSN
06e0: 5f 43 41 43 48 45 5f 44 45 50 54 48 29 0a 20 20  _CACHE_DEPTH).  
06f0: 73 74 61 74 69 63 20 63 68 61 72 20 61 72 72 61  static char arra
0700: 79 5b 49 4e 53 4e 5f 43 41 43 48 45 5f 53 49 5a  y[INSN_CACHE_SIZ
0710: 45 20 2b 20 49 4e 53 4e 5f 43 41 43 48 45 5f 50  E + INSN_CACHE_P
0720: 4c 41 4e 45 5f 53 49 5a 45 20 2b 20 49 4e 53 4e  LANE_SIZE + INSN
0730: 5f 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54  _CACHE_LINE_WIDT
0740: 48 5d 3b 0a 20 20 73 74 61 74 69 63 20 69 6e 74  H];.  static int
0750: 20 69 6e 69 74 69 61 6c 69 7a 65 64 20 3d 20 30   initialized = 0
0760: 3b 0a 20 20 69 6e 74 20 6f 66 66 73 65 74 3b 0a  ;.  int offset;.
0770: 20 20 76 6f 69 64 20 2a 73 74 61 72 74 5f 61 64    void *start_ad
0780: 64 72 3b 0a 20 20 76 6f 69 64 20 2a 65 6e 64 5f  dr;.  void *end_
0790: 61 64 64 72 3b 0a 20 20 74 79 70 65 64 65 66 20  addr;.  typedef 
07a0: 28 2a 66 75 6e 63 74 69 6f 6e 5f 70 74 72 29 20  (*function_ptr) 
07b0: 28 29 3b 0a 0a 23 69 66 20 28 49 4e 53 4e 5f 43  ();..#if (INSN_C
07c0: 41 43 48 45 5f 53 49 5a 45 20 2f 20 49 4e 53 4e  ACHE_SIZE / INSN
07d0: 5f 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54  _CACHE_LINE_WIDT
07e0: 48 29 20 3c 20 31 36 0a 20 20 2f 2a 20 49 74 27  H) < 16.  /* It'
07f0: 73 20 63 68 65 61 70 65 72 20 74 6f 20 63 6c 65  s cheaper to cle
0800: 61 72 20 74 68 65 20 77 68 6f 6c 65 20 63 61 63  ar the whole cac
0810: 68 65 2e 0a 20 20 20 20 20 50 75 74 20 69 6e 20  he..     Put in 
0820: 61 20 73 65 72 69 65 73 20 6f 66 20 6a 75 6d 70  a series of jump
0830: 20 69 6e 73 74 72 75 63 74 69 6f 6e 73 20 73 6f   instructions so
0840: 20 74 68 61 74 20 63 61 6c 6c 69 6e 67 20 74 68   that calling th
0850: 65 20 62 65 67 69 6e 6e 69 6e 67 0a 20 20 20 20  e beginning.    
0860: 20 6f 66 20 74 68 65 20 63 61 63 68 65 20 77 69   of the cache wi
0870: 6c 6c 20 63 6c 65 61 72 20 74 68 65 20 77 68 6f  ll clear the who
0880: 6c 65 20 74 68 69 6e 67 2e 20 20 2a 2f 0a 0a 20  le thing.  */.. 
0890: 20 69 66 20 28 21 20 69 6e 69 74 69 61 6c 69 7a   if (! initializ
08a0: 65 64 29 0a 20 20 20 20 7b 0a 20 20 20 20 20 20  ed).    {.      
08b0: 69 6e 74 20 70 74 72 20 3d 20 28 28 28 69 6e 74  int ptr = (((int
08c0: 29 20 61 72 72 61 79 20 2b 20 49 4e 53 4e 5f 43  ) array + INSN_C
08d0: 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48 20  ACHE_LINE_WIDTH 
08e0: 2d 20 31 29 0a 09 09 20 26 20 2d 49 4e 53 4e 5f  - 1)... & -INSN_
08f0: 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48  CACHE_LINE_WIDTH
0900: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 64  );.      int end
0910: 5f 70 74 72 20 3d 20 70 74 72 20 2b 20 49 4e 53  _ptr = ptr + INS
0920: 4e 5f 43 41 43 48 45 5f 53 49 5a 45 3b 0a 0a 20  N_CACHE_SIZE;.. 
0930: 20 20 20 20 20 77 68 69 6c 65 20 28 70 74 72 20       while (ptr 
0940: 3c 20 65 6e 64 5f 70 74 72 29 0a 09 7b 0a 09 20  < end_ptr)..{.. 
0950: 20 2a 28 49 4e 53 54 52 55 43 54 49 4f 4e 5f 54   *(INSTRUCTION_T
0960: 59 50 45 20 2a 29 70 74 72 0a 09 20 20 20 20 3d  YPE *)ptr..    =
0970: 20 4a 55 4d 50 5f 41 48 45 41 44 5f 49 4e 53 54   JUMP_AHEAD_INST
0980: 52 55 43 54 49 4f 4e 20 2b 20 49 4e 53 4e 5f 43  RUCTION + INSN_C
0990: 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48 3b  ACHE_LINE_WIDTH;
09a0: 0a 09 20 20 70 74 72 20 2b 3d 20 49 4e 53 4e 5f  ..  ptr += INSN_
09b0: 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48  CACHE_LINE_WIDTH
09c0: 3b 0a 09 7d 0a 20 20 20 20 20 20 2a 28 49 4e 53  ;..}.      *(INS
09d0: 54 52 55 43 54 49 4f 4e 5f 54 59 50 45 20 2a 29  TRUCTION_TYPE *)
09e0: 28 70 74 72 20 2d 20 49 4e 53 4e 5f 43 41 43 48  (ptr - INSN_CACH
09f0: 45 5f 4c 49 4e 45 5f 57 49 44 54 48 29 20 3d 20  E_LINE_WIDTH) = 
0a00: 52 45 54 55 52 4e 5f 49 4e 53 54 52 55 43 54 49  RETURN_INSTRUCTI
0a10: 4f 4e 3b 0a 0a 20 20 20 20 20 20 69 6e 69 74 69  ON;..      initi
0a20: 61 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20  alized = 1;.    
0a30: 7d 0a 0a 20 20 2f 2a 20 43 61 6c 6c 20 74 68 65  }..  /* Call the
0a40: 20 62 65 67 69 6e 6e 69 6e 67 20 6f 66 20 74 68   beginning of th
0a50: 65 20 73 65 71 75 65 6e 63 65 2e 20 20 2a 2f 0a  e sequence.  */.
0a60: 20 20 28 28 28 66 75 6e 63 74 69 6f 6e 5f 70 74    (((function_pt
0a70: 72 29 20 28 28 28 69 6e 74 29 20 61 72 72 61 79  r) (((int) array
0a80: 20 2b 20 49 4e 53 4e 5f 43 41 43 48 45 5f 4c 49   + INSN_CACHE_LI
0a90: 4e 45 5f 57 49 44 54 48 20 2d 20 31 29 0a 09 09  NE_WIDTH - 1)...
0aa0: 20 20 20 20 26 20 2d 49 4e 53 4e 5f 43 41 43 48      & -INSN_CACH
0ab0: 45 5f 4c 49 4e 45 5f 57 49 44 54 48 29 29 0a 20  E_LINE_WIDTH)). 
0ac0: 20 20 28 29 29 3b 0a 0a 23 65 6c 73 65 20 2f 2a    ());..#else /*
0ad0: 20 43 61 63 68 65 20 69 73 20 6c 61 72 67 65 2e   Cache is large.
0ae0: 20 20 2a 2f 0a 0a 20 20 69 66 20 28 21 20 69 6e    */..  if (! in
0af0: 69 74 69 61 6c 69 7a 65 64 29 0a 20 20 20 20 7b  itialized).    {
0b00: 0a 20 20 20 20 20 20 69 6e 74 20 70 74 72 20 3d  .      int ptr =
0b10: 20 28 28 28 69 6e 74 29 20 61 72 72 61 79 20 2b   (((int) array +
0b20: 20 49 4e 53 4e 5f 43 41 43 48 45 5f 4c 49 4e 45   INSN_CACHE_LINE
0b30: 5f 57 49 44 54 48 20 2d 20 31 29 0a 09 09 20 26  _WIDTH - 1)... &
0b40: 20 2d 49 4e 53 4e 5f 43 41 43 48 45 5f 4c 49 4e   -INSN_CACHE_LIN
0b50: 45 5f 57 49 44 54 48 29 3b 0a 0a 20 20 20 20 20  E_WIDTH);..     
0b60: 20 77 68 69 6c 65 20 28 70 74 72 20 3c 20 28 69   while (ptr < (i
0b70: 6e 74 29 20 61 72 72 61 79 20 2b 20 73 69 7a 65  nt) array + size
0b80: 6f 66 20 61 72 72 61 79 29 0a 09 7b 0a 09 20 20  of array)..{..  
0b90: 2a 28 49 4e 53 54 52 55 43 54 49 4f 4e 5f 54 59  *(INSTRUCTION_TY
0ba0: 50 45 20 2a 29 70 74 72 20 3d 20 52 45 54 55 52  PE *)ptr = RETUR
0bb0: 4e 5f 49 4e 53 54 52 55 43 54 49 4f 4e 3b 0a 09  N_INSTRUCTION;..
0bc0: 20 20 70 74 72 20 2b 3d 20 49 4e 53 4e 5f 43 41    ptr += INSN_CA
0bd0: 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48 3b 0a  CHE_LINE_WIDTH;.
0be0: 09 7d 0a 0a 20 20 20 20 20 20 69 6e 69 74 69 61  .}..      initia
0bf0: 6c 69 7a 65 64 20 3d 20 31 3b 0a 20 20 20 20 7d  lized = 1;.    }
0c00: 0a 0a 20 20 2f 2a 20 46 69 6e 64 20 74 68 65 20  ..  /* Find the 
0c10: 6c 6f 63 61 74 69 6f 6e 20 69 6e 20 61 72 72 61  location in arra
0c20: 79 20 74 68 61 74 20 6f 63 63 75 70 69 65 73 20  y that occupies 
0c30: 74 68 65 20 73 61 6d 65 20 63 61 63 68 65 20 6c  the same cache l
0c40: 69 6e 65 20 61 73 20 42 45 47 2e 20 20 2a 2f 0a  ine as BEG.  */.
0c50: 0a 20 20 6f 66 66 73 65 74 20 3d 20 28 28 69 6e  .  offset = ((in
0c60: 74 29 20 62 65 67 20 26 20 2d 49 4e 53 4e 5f 43  t) beg & -INSN_C
0c70: 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48 29  ACHE_LINE_WIDTH)
0c80: 20 26 20 28 49 4e 53 4e 5f 43 41 43 48 45 5f 50   & (INSN_CACHE_P
0c90: 4c 41 4e 45 5f 53 49 5a 45 20 2d 20 31 29 3b 0a  LANE_SIZE - 1);.
0ca0: 20 20 73 74 61 72 74 5f 61 64 64 72 20 3d 20 28    start_addr = (
0cb0: 28 28 69 6e 74 29 20 28 61 72 72 61 79 20 2b 20  ((int) (array + 
0cc0: 49 4e 53 4e 5f 43 41 43 48 45 5f 50 4c 41 4e 45  INSN_CACHE_PLANE
0cd0: 5f 53 49 5a 45 20 2d 20 31 29 0a 09 09 20 26 20  _SIZE - 1)... & 
0ce0: 2d 49 4e 53 4e 5f 43 41 43 48 45 5f 50 4c 41 4e  -INSN_CACHE_PLAN
0cf0: 45 5f 53 49 5a 45 29 0a 09 09 2b 20 6f 66 66 73  E_SIZE)...+ offs
0d00: 65 74 29 3b 0a 0a 20 20 2f 2a 20 43 6f 6d 70 75  et);..  /* Compu
0d10: 74 65 20 74 68 65 20 63 61 63 68 65 20 61 6c 69  te the cache ali
0d20: 67 6e 6d 65 6e 74 20 6f 66 20 74 68 65 20 70 6c  gnment of the pl
0d30: 61 63 65 20 74 6f 20 73 74 6f 70 20 63 6c 65 61  ace to stop clea
0d40: 72 69 6e 67 2e 20 20 2a 2f 0a 23 69 66 20 30 20  ring.  */.#if 0 
0d50: 20 2f 2a 20 54 68 69 73 20 69 73 20 6e 6f 74 20   /* This is not 
0d60: 6e 65 65 64 65 64 20 66 6f 72 20 67 63 63 27 73  needed for gcc's
0d70: 20 70 75 72 70 6f 73 65 73 2e 20 20 2a 2f 0a 20   purposes.  */. 
0d80: 20 2f 2a 20 49 66 20 74 68 65 20 62 6c 6f 63 6b   /* If the block
0d90: 20 74 6f 20 63 6c 65 61 72 20 69 73 20 62 69 67   to clear is big
0da0: 67 65 72 20 74 68 61 6e 20 61 20 63 61 63 68 65  ger than a cache
0db0: 20 70 6c 61 6e 65 2c 0a 20 20 20 20 20 77 65 20   plane,.     we 
0dc0: 63 6c 65 61 72 20 74 68 65 20 65 6e 74 69 72 65  clear the entire
0dd0: 20 63 61 63 68 65 2c 20 61 6e 64 20 4f 46 46 53   cache, and OFFS
0de0: 45 54 20 69 73 20 61 6c 72 65 61 64 79 20 63 6f  ET is already co
0df0: 72 72 65 63 74 2e 20 20 2a 2f 20 0a 20 20 69 66  rrect.  */ .  if
0e00: 20 28 65 6e 64 20 3c 20 62 65 67 20 2b 20 49 4e   (end < beg + IN
0e10: 53 4e 5f 43 41 43 48 45 5f 50 4c 41 4e 45 5f 53  SN_CACHE_PLANE_S
0e20: 49 5a 45 29 0a 23 65 6e 64 69 66 0a 20 20 20 20  IZE).#endif.    
0e30: 6f 66 66 73 65 74 20 3d 20 28 28 28 69 6e 74 29  offset = (((int)
0e40: 20 28 65 6e 64 20 2b 20 49 4e 53 4e 5f 43 41 43   (end + INSN_CAC
0e50: 48 45 5f 4c 49 4e 45 5f 57 49 44 54 48 20 2d 20  HE_LINE_WIDTH - 
0e60: 31 29 0a 09 20 20 20 20 20 20 20 26 20 2d 49 4e  1)..       & -IN
0e70: 53 4e 5f 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49  SN_CACHE_LINE_WI
0e80: 44 54 48 29 0a 09 20 20 20 20 20 20 26 20 28 49  DTH)..      & (I
0e90: 4e 53 4e 5f 43 41 43 48 45 5f 50 4c 41 4e 45 5f  NSN_CACHE_PLANE_
0ea0: 53 49 5a 45 20 2d 20 31 29 29 3b 0a 0a 23 69 66  SIZE - 1));..#if
0eb0: 20 49 4e 53 4e 5f 43 41 43 48 45 5f 44 45 50 54   INSN_CACHE_DEPT
0ec0: 48 20 3e 20 31 0a 20 20 65 6e 64 5f 61 64 64 72  H > 1.  end_addr
0ed0: 20 3d 20 28 73 74 61 72 74 5f 61 64 64 72 20 26   = (start_addr &
0ee0: 20 2d 49 4e 53 4e 5f 43 41 43 48 45 5f 50 4c 41   -INSN_CACHE_PLA
0ef0: 4e 45 5f 53 49 5a 45 29 20 2b 20 6f 66 66 73 65  NE_SIZE) + offse
0f00: 74 3b 0a 20 20 69 66 20 28 65 6e 64 5f 61 64 64  t;.  if (end_add
0f10: 72 20 3c 3d 20 73 74 61 72 74 5f 61 64 64 72 29  r <= start_addr)
0f20: 0a 20 20 20 20 65 6e 64 5f 61 64 64 72 20 2b 3d  .    end_addr +=
0f30: 20 49 4e 53 4e 5f 43 41 43 48 45 5f 50 4c 41 4e   INSN_CACHE_PLAN
0f40: 45 5f 53 49 5a 45 3b 0a 0a 20 20 66 6f 72 20 28  E_SIZE;..  for (
0f50: 70 6c 61 6e 65 20 3d 20 30 3b 20 70 6c 61 6e 65  plane = 0; plane
0f60: 20 3c 20 49 4e 53 4e 5f 43 41 43 48 45 5f 44 45   < INSN_CACHE_DE
0f70: 50 54 48 3b 20 70 6c 61 6e 65 2b 2b 29 0a 20 20  PTH; plane++).  
0f80: 20 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64    {.      int ad
0f90: 64 72 20 3d 20 73 74 61 72 74 5f 61 64 64 72 20  dr = start_addr 
0fa0: 2b 20 70 6c 61 6e 65 20 2a 20 49 4e 53 4e 5f 43  + plane * INSN_C
0fb0: 41 43 48 45 5f 50 4c 41 4e 45 5f 53 49 5a 45 3b  ACHE_PLANE_SIZE;
0fc0: 0a 20 20 20 20 20 20 69 6e 74 20 73 74 6f 70 20  .      int stop 
0fd0: 3d 20 65 6e 64 5f 61 64 64 72 20 2b 20 70 6c 61  = end_addr + pla
0fe0: 6e 65 20 2a 20 49 4e 53 4e 5f 43 41 43 48 45 5f  ne * INSN_CACHE_
0ff0: 50 4c 41 4e 45 5f 53 49 5a 45 3b 0a 0a 20 20 20  PLANE_SIZE;..   
1000: 20 20 20 77 68 69 6c 65 20 28 61 64 64 72 20 21     while (addr !
1010: 3d 20 73 74 6f 70 29 0a 09 7b 0a 09 20 20 2f 2a  = stop)..{..  /*
1020: 20 43 61 6c 6c 20 74 68 65 20 72 65 74 75 72 6e   Call the return
1030: 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74 20   instruction at 
1040: 41 44 44 52 2e 20 20 2a 2f 0a 09 20 20 28 28 66  ADDR.  */..  ((f
1050: 75 6e 63 74 69 6f 6e 5f 70 74 72 29 20 61 64 64  unction_ptr) add
1060: 72 29 20 28 29 3b 0a 0a 09 20 20 61 64 64 72 20  r) ();...  addr 
1070: 2b 3d 20 49 4e 53 4e 5f 43 41 43 48 45 5f 4c 49  += INSN_CACHE_LI
1080: 4e 45 5f 57 49 44 54 48 3b 0a 09 7d 0a 20 20 20  NE_WIDTH;..}.   
1090: 20 7d 0a 23 65 6c 73 65 20 2f 2a 20 6a 75 73 74   }.#else /* just
10a0: 20 6f 6e 65 20 70 6c 61 6e 65 20 2a 2f 0a 20 20   one plane */.  
10b0: 64 6f 0a 20 20 20 20 7b 0a 20 20 20 20 20 20 2f  do.    {.      /
10c0: 2a 20 43 61 6c 6c 20 74 68 65 20 72 65 74 75 72  * Call the retur
10d0: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 74  n instruction at
10e0: 20 53 54 41 52 54 5f 41 44 44 52 2e 20 20 2a 2f   START_ADDR.  */
10f0: 0a 20 20 20 20 20 20 28 28 66 75 6e 63 74 69 6f  .      ((functio
1100: 6e 5f 70 74 72 29 20 73 74 61 72 74 5f 61 64 64  n_ptr) start_add
1110: 72 29 20 28 29 3b 0a 0a 20 20 20 20 20 20 73 74  r) ();..      st
1120: 61 72 74 5f 61 64 64 72 20 2b 3d 20 49 4e 53 4e  art_addr += INSN
1130: 5f 43 41 43 48 45 5f 4c 49 4e 45 5f 57 49 44 54  _CACHE_LINE_WIDT
1140: 48 3b 0a 20 20 20 20 7d 0a 20 20 77 68 69 6c 65  H;.    }.  while
1150: 20 28 28 73 74 61 72 74 5f 61 64 64 72 20 25 20   ((start_addr % 
1160: 49 4e 53 4e 5f 43 41 43 48 45 5f 53 49 5a 45 29  INSN_CACHE_SIZE)
1170: 20 21 3d 20 6f 66 66 73 65 74 29 3b 0a 23 65 6e   != offset);.#en
1180: 64 69 66 20 2f 2a 20 6a 75 73 74 20 6f 6e 65 20  dif /* just one 
1190: 70 6c 61 6e 65 20 2a 2f 0a 23 65 6e 64 69 66 20  plane */.#endif 
11a0: 2f 2a 20 43 61 63 68 65 20 69 73 20 6c 61 72 67  /* Cache is larg
11b0: 65 20 2a 2f 0a 23 65 6e 64 69 66 20 2f 2a 20 43  e */.#endif /* C
11c0: 61 63 68 65 20 65 78 69 73 74 73 20 2a 2f 0a 23  ache exists */.#
11d0: 65 6e 64 69 66 20 2f 2a 20 43 4c 45 41 52 5f 49  endif /* CLEAR_I
11e0: 4e 53 4e 5f 43 41 43 48 45 20 2a 2f 0a 7d 0a     NSN_CACHE */.}.