⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 som.c

📁 基于4个mips核的noc设计
💻 C
📖 第 1 页 / 共 5 页
字号:
  SOM_HOWTO (R_RELOCATION, "R_RELOCATION"),  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),  SOM_HOWTO (R_DATA_ONE_SYMBOL, "R_DATA_ONE_SYMBOL"),  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),  SOM_HOWTO (R_DATA_PLABEL, "R_DATA_PLABEL"),  SOM_HOWTO (R_SPACE_REF, "R_SPACE_REF"),  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),  SOM_HOWTO (R_REPEATED_INIT, "REPEATED_INIT"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_PCREL_CALL, "R_PCREL_CALL"),  SOM_HOWTO (R_SHORT_PCREL_MODE, "R_SHORT_PCREL_MODE"),  SOM_HOWTO (R_LONG_PCREL_MODE, "R_LONG_PCREL_MODE"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_ABS_CALL, "R_ABS_CALL"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_DP_RELATIVE, "R_DP_RELATIVE"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),  SOM_HOWTO (R_DLT_REL, "R_DLT_REL"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_CODE_ONE_SYMBOL, "R_CODE_ONE_SYMBOL"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),  SOM_HOWTO (R_MILLI_REL, "R_MILLI_REL"),  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),  SOM_HOWTO (R_CODE_PLABEL, "R_CODE_PLABEL"),  SOM_HOWTO (R_BREAKPOINT, "R_BREAKPOINT"),  SOM_HOWTO (R_ENTRY, "R_ENTRY"),  SOM_HOWTO (R_ENTRY, "R_ENTRY"),  SOM_HOWTO (R_ALT_ENTRY, "R_ALT_ENTRY"),  SOM_HOWTO (R_EXIT, "R_EXIT"),  SOM_HOWTO (R_BEGIN_TRY, "R_BEGIN_TRY"),  SOM_HOWTO (R_END_TRY, "R_END_TRY"),  SOM_HOWTO (R_END_TRY, "R_END_TRY"),  SOM_HOWTO (R_END_TRY, "R_END_TRY"),  SOM_HOWTO (R_BEGIN_BRTAB, "R_BEGIN_BRTAB"),  SOM_HOWTO (R_END_BRTAB, "R_END_BRTAB"),  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),  SOM_HOWTO (R_STATEMENT, "R_STATEMENT"),  SOM_HOWTO (R_DATA_EXPR, "R_DATA_EXPR"),  SOM_HOWTO (R_CODE_EXPR, "R_CODE_EXPR"),  SOM_HOWTO (R_FSEL, "R_FSEL"),  SOM_HOWTO (R_LSEL, "R_LSEL"),  SOM_HOWTO (R_RSEL, "R_RSEL"),  SOM_HOWTO (R_N_MODE, "R_N_MODE"),  SOM_HOWTO (R_S_MODE, "R_S_MODE"),  SOM_HOWTO (R_D_MODE, "R_D_MODE"),  SOM_HOWTO (R_R_MODE, "R_R_MODE"),  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),  SOM_HOWTO (R_DATA_OVERRIDE, "R_DATA_OVERRIDE"),  SOM_HOWTO (R_TRANSLATED, "R_TRANSLATED"),  SOM_HOWTO (R_AUX_UNWIND, "R_AUX_UNWIND"),  SOM_HOWTO (R_COMP1, "R_COMP1"),  SOM_HOWTO (R_COMP2, "R_COMP2"),  SOM_HOWTO (R_COMP3, "R_COMP3"),  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),  SOM_HOWTO (R_PREV_FIXUP, "R_PREV_FIXUP"),  SOM_HOWTO (R_SEC_STMT, "R_SEC_STMT"),  SOM_HOWTO (R_N0SEL, "R_N0SEL"),  SOM_HOWTO (R_N1SEL, "R_N1SEL"),  SOM_HOWTO (R_LINETAB, "R_LINETAB"),  SOM_HOWTO (R_LINETAB_ESC, "R_LINETAB_ESC"),  SOM_HOWTO (R_LTP_OVERRIDE, "R_LTP_OVERRIDE"),  SOM_HOWTO (R_COMMENT, "R_COMMENT"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED"),  SOM_HOWTO (R_RESERVED, "R_RESERVED")};/* Initialize the SOM relocation queue.  By definition the queue holds   the last four multibyte fixups.  */static voidsom_initialize_reloc_queue (queue)     struct reloc_queue *queue;{  queue[0].reloc = NULL;  queue[0].size = 0;  queue[1].reloc = NULL;  queue[1].size = 0;  queue[2].reloc = NULL;  queue[2].size = 0;  queue[3].reloc = NULL;  queue[3].size = 0;}/* Insert a new relocation into the relocation queue.  */static voidsom_reloc_queue_insert (p, size, queue)     unsigned char *p;     unsigned int size;     struct reloc_queue *queue;{  queue[3].reloc = queue[2].reloc;  queue[3].size = queue[2].size;  queue[2].reloc = queue[1].reloc;  queue[2].size = queue[1].size;  queue[1].reloc = queue[0].reloc;  queue[1].size = queue[0].size;  queue[0].reloc = p;  queue[0].size = size;}/* When an entry in the relocation queue is reused, the entry moves   to the front of the queue.  */static voidsom_reloc_queue_fix (queue, index)     struct reloc_queue *queue;     unsigned int index;{  if (index == 0)    return;  if (index == 1)    {      unsigned char *tmp1 = queue[0].reloc;      unsigned int tmp2 = queue[0].size;      queue[0].reloc = queue[1].reloc;      queue[0].size = queue[1].size;      queue[1].reloc = tmp1;      queue[1].size = tmp2;      return;    }  if (index == 2)    {      unsigned char *tmp1 = queue[0].reloc;      unsigned int tmp2 = queue[0].size;      queue[0].reloc = queue[2].reloc;      queue[0].size = queue[2].size;      queue[2].reloc = queue[1].reloc;      queue[2].size = queue[1].size;      queue[1].reloc = tmp1;      queue[1].size = tmp2;      return;    }  if (index == 3)    {      unsigned char *tmp1 = queue[0].reloc;      unsigned int tmp2 = queue[0].size;      queue[0].reloc = queue[3].reloc;      queue[0].size = queue[3].size;      queue[3].reloc = queue[2].reloc;      queue[3].size = queue[2].size;      queue[2].reloc = queue[1].reloc;      queue[2].size = queue[1].size;      queue[1].reloc = tmp1;      queue[1].size = tmp2;      return;    }  abort ();}/* Search for a particular relocation in the relocation queue.  */static intsom_reloc_queue_find (p, size, queue)     unsigned char *p;     unsigned int size;     struct reloc_queue *queue;{  if (queue[0].reloc && !memcmp (p, queue[0].reloc, size)      && size == queue[0].size)    return 0;  if (queue[1].reloc && !memcmp (p, queue[1].reloc, size)      && size == queue[1].size)    return 1;  if (queue[2].reloc && !memcmp (p, queue[2].reloc, size)      && size == queue[2].size)    return 2;  if (queue[3].reloc && !memcmp (p, queue[3].reloc, size)      && size == queue[3].size)    return 3;  return -1;}static unsigned char *try_prev_fixup (abfd, subspace_reloc_sizep, p, size, queue)     bfd *abfd ATTRIBUTE_UNUSED;     int *subspace_reloc_sizep;     unsigned char *p;     unsigned int size;     struct reloc_queue *queue;{  int queue_index = som_reloc_queue_find (p, size, queue);  if (queue_index != -1)    {      /* Found this in a previous fixup.  Undo the fixup we	 just built and use R_PREV_FIXUP instead.  We saved	 a total of size - 1 bytes in the fixup stream.  */      bfd_put_8 (abfd, R_PREV_FIXUP + queue_index, p);      p += 1;      *subspace_reloc_sizep += 1;      som_reloc_queue_fix (queue, queue_index);    }  else    {      som_reloc_queue_insert (p, size, queue);      *subspace_reloc_sizep += size;      p += size;    }  return p;}/* Emit the proper R_NO_RELOCATION fixups to map the next SKIP   bytes without any relocation.  Update the size of the subspace   relocation stream via SUBSPACE_RELOC_SIZE_P; also return the   current pointer into the relocation stream.  */static unsigned char *som_reloc_skip (abfd, skip, p, subspace_reloc_sizep, queue)     bfd *abfd;     unsigned int skip;     unsigned char *p;     unsigned int *subspace_reloc_sizep;     struct reloc_queue *queue;{  /* Use a 4 byte R_NO_RELOCATION entry with a maximal value     then R_PREV_FIXUPs to get the difference down to a     reasonable size.  */  if (skip >= 0x1000000)    {      skip -= 0x1000000;      bfd_put_8 (abfd, R_NO_RELOCATION + 31, p);      bfd_put_8 (abfd, 0xff, p + 1);      bfd_put_16 (abfd, 0xffff, p + 2);      p = try_prev_fixup (abfd, subspace_reloc_sizep, p, 4, queue);      while (skip >= 0x1000000)	{	  skip -= 0x1000000;	  bfd_put_8 (abfd, R_PREV_FIXUP, p);	  p++;	  *subspace_reloc_sizep += 1;	  /* No need to adjust queue here since we are repeating the	     most recent fixup.  */	}    }  /* The difference must be less than 0x1000000.  Use one     more R_NO_RELOCATION entry to get to the right difference.  */  if ((skip & 3) == 0 && skip <= 0xc0000 && skip > 0)    {      /* Difference can be handled in a simple single-byte	 R_NO_RELOCATION entry.  */      if (skip <= 0x60)	{	  bfd_put_8 (abfd, R_NO_RELOCATION + (skip >> 2) - 1, p);	  *subspace_reloc_sizep += 1;	  p++;	}      /* Handle it with a two byte R_NO_RELOCATION entry.  */      else if (skip <= 0x1000)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -