📄 s390.c
字号:
switch (GET_CODE (code)) { case GTU: return CC0 | CC1; /* borrow */ case LEU: return CC2 | CC3; /* no borrow */ default: abort (); } break; case CCUmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC1 | CC2 | CC3; case LTU: return CC1; case GTU: return CC2; case LEU: return CC0 | CC1; case GEU: return CC0 | CC2; default: abort (); } break; case CCURmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC2 | CC1 | CC3; case LTU: return CC2; case GTU: return CC1; case LEU: return CC0 | CC2; case GEU: return CC0 | CC1; default: abort (); } break; case CCAPmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC1 | CC2 | CC3; case LT: return CC1 | CC3; case GT: return CC2; case LE: return CC0 | CC1 | CC3; case GE: return CC0 | CC2; default: abort (); } break; case CCANmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC1 | CC2 | CC3; case LT: return CC1; case GT: return CC2 | CC3; case LE: return CC0 | CC1; case GE: return CC0 | CC2 | CC3; default: abort (); } break; case CCSmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC1 | CC2 | CC3; case LT: return CC1; case GT: return CC2; case LE: return CC0 | CC1; case GE: return CC0 | CC2; case UNORDERED: return CC3; case ORDERED: return CC0 | CC1 | CC2; case UNEQ: return CC0 | CC3; case UNLT: return CC1 | CC3; case UNGT: return CC2 | CC3; case UNLE: return CC0 | CC1 | CC3; case UNGE: return CC0 | CC2 | CC3; case LTGT: return CC1 | CC2; default: abort (); } break; case CCSRmode: switch (GET_CODE (code)) { case EQ: return CC0; case NE: return CC2 | CC1 | CC3; case LT: return CC2; case GT: return CC1; case LE: return CC0 | CC2; case GE: return CC0 | CC1; case UNORDERED: return CC3; case ORDERED: return CC0 | CC2 | CC1; case UNEQ: return CC0 | CC3; case UNLT: return CC2 | CC3; case UNGT: return CC1 | CC3; case UNLE: return CC0 | CC2 | CC3; case UNGE: return CC0 | CC1 | CC3; case LTGT: return CC2 | CC1; default: abort (); } break; default: abort (); }}/* If INV is false, return assembler mnemonic string to implement a branch specified by CODE. If INV is true, return mnemonic for the corresponding inverted branch. */static const char *s390_branch_condition_mnemonic (code, inv) rtx code; int inv;{ static const char *const mnemonic[16] = { NULL, "o", "h", "nle", "l", "nhe", "lh", "ne", "e", "nlh", "he", "nl", "le", "nh", "no", NULL }; int mask = s390_branch_condition_mask (code); if (inv) mask ^= 15; if (mask < 1 || mask > 14) abort (); return mnemonic[mask];}/* If OP is an integer constant of mode MODE with exactly one HImode subpart unequal to DEF, return the number of that subpart. As a special case, all HImode subparts of OP are equal to DEF, return zero. Otherwise, return -1. */ints390_single_hi (op, mode, def) rtx op; enum machine_mode mode; int def;{ if (GET_CODE (op) == CONST_INT) { unsigned HOST_WIDE_INT value = 0; int n_parts = GET_MODE_SIZE (mode) / 2; int i, part = -1; for (i = 0; i < n_parts; i++) { if (i == 0) value = (unsigned HOST_WIDE_INT) INTVAL (op); else value >>= 16; if ((value & 0xffff) != (unsigned)(def & 0xffff)) { if (part != -1) return -1; else part = i; } } return part == -1 ? 0 : (n_parts - 1 - part); } else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode) { unsigned HOST_WIDE_INT value = 0; int n_parts = GET_MODE_SIZE (mode) / 2; int i, part = -1; for (i = 0; i < n_parts; i++) { if (i == 0) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op); else if (i == HOST_BITS_PER_WIDE_INT / 16) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op); else value >>= 16; if ((value & 0xffff) != (unsigned)(def & 0xffff)) { if (part != -1) return -1; else part = i; } } return part == -1 ? 0 : (n_parts - 1 - part); } return -1; }/* Extract the HImode part number PART from integer constant OP of mode MODE. */ints390_extract_hi (op, mode, part) rtx op; enum machine_mode mode; int part;{ int n_parts = GET_MODE_SIZE (mode) / 2; if (part < 0 || part >= n_parts) abort(); else part = n_parts - 1 - part; if (GET_CODE (op) == CONST_INT) { unsigned HOST_WIDE_INT value = (unsigned HOST_WIDE_INT) INTVAL (op); return ((value >> (16 * part)) & 0xffff); } else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode) { unsigned HOST_WIDE_INT value; if (part < HOST_BITS_PER_WIDE_INT / 16) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op); else value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op), part -= HOST_BITS_PER_WIDE_INT / 16; return ((value >> (16 * part)) & 0xffff); } abort ();}/* If OP is an integer constant of mode MODE with exactly one QImode subpart unequal to DEF, return the number of that subpart. As a special case, all QImode subparts of OP are equal to DEF, return zero. Otherwise, return -1. */ints390_single_qi (op, mode, def) rtx op; enum machine_mode mode; int def;{ if (GET_CODE (op) == CONST_INT) { unsigned HOST_WIDE_INT value = 0; int n_parts = GET_MODE_SIZE (mode); int i, part = -1; for (i = 0; i < n_parts; i++) { if (i == 0) value = (unsigned HOST_WIDE_INT) INTVAL (op); else value >>= 8; if ((value & 0xff) != (unsigned)(def & 0xff)) { if (part != -1) return -1; else part = i; } } return part == -1 ? 0 : (n_parts - 1 - part); } else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode) { unsigned HOST_WIDE_INT value = 0; int n_parts = GET_MODE_SIZE (mode); int i, part = -1; for (i = 0; i < n_parts; i++) { if (i == 0) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op); else if (i == HOST_BITS_PER_WIDE_INT / 8) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op); else value >>= 8; if ((value & 0xff) != (unsigned)(def & 0xff)) { if (part != -1) return -1; else part = i; } } return part == -1 ? 0 : (n_parts - 1 - part); } return -1; }/* Extract the QImode part number PART from integer constant OP of mode MODE. */ints390_extract_qi (op, mode, part) rtx op; enum machine_mode mode; int part;{ int n_parts = GET_MODE_SIZE (mode); if (part < 0 || part >= n_parts) abort(); else part = n_parts - 1 - part; if (GET_CODE (op) == CONST_INT) { unsigned HOST_WIDE_INT value = (unsigned HOST_WIDE_INT) INTVAL (op); return ((value >> (8 * part)) & 0xff); } else if (GET_CODE (op) == CONST_DOUBLE && GET_MODE (op) == VOIDmode) { unsigned HOST_WIDE_INT value; if (part < HOST_BITS_PER_WIDE_INT / 8) value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_LOW (op); else value = (unsigned HOST_WIDE_INT) CONST_DOUBLE_HIGH (op), part -= HOST_BITS_PER_WIDE_INT / 8; return ((value >> (8 * part)) & 0xff); } abort ();}/* Check whether we can (and want to) split a double-word move in mode MODE from SRC to DST into two single-word moves, moving the subword FIRST_SUBWORD first. */bools390_split_ok_p (dst, src, mode, first_subword) rtx dst; rtx src; enum machine_mode mode; int first_subword;{ /* Floating point registers cannot be split. */ if (FP_REG_P (src) || FP_REG_P (dst)) return false; /* We don't need to split if operands are directly accessable. */ if (s_operand (src, mode) || s_operand (dst, mode)) return false; /* Non-offsettable memory references cannot be split. */ if ((GET_CODE (src) == MEM && !offsettable_memref_p (src)) || (GET_CODE (dst) == MEM && !offsettable_memref_p (dst))) return false; /* Moving the first subword must not clobber a register needed to move the second subword. */ if (register_operand (dst, mode)) { rtx subreg = operand_subword (dst, first_subword, 0, mode); if (reg_overlap_mentioned_p (subreg, src)) return false; } return true;}/* Change optimizations to be performed, depending on the optimization level. LEVEL is the optimization level specified; 2 if `-O2' is specified, 1 if `-O' is specified, and 0 if neither is specified. SIZE is nonzero if `-Os' is specified and zero otherwise. */voidoptimization_options (level, size) int level ATTRIBUTE_UNUSED; int size ATTRIBUTE_UNUSED;{ /* ??? There are apparently still problems with -fcaller-saves. */ flag_caller_saves = 0; /* By default, always emit DWARF-2 unwind info. This allows debugging without maintaining a stack frame back-chain. */ flag_asynchronous_unwind_tables = 1;}voidoverride_options (){ /* Acquire a unique set number for our register saves and restores. */ s390_sr_alias_set = new_alias_set (); /* Set up function hooks. */ init_machine_status = s390_init_machine_status;}/* Map for smallest class containing reg regno. */const enum reg_class regclass_map[FIRST_PSEUDO_REGISTER] ={ GENERAL_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, ADDR_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, FP_REGS, ADDR_REGS, NO_REGS, ADDR_REGS };/* Return true if OP a (const_int 0) operand. OP is the current operation. MODE is the current operation mode. */ intconst0_operand (op, mode) register rtx op; enum machine_mode mode;{ return op == CONST0_RTX (mode);}/* Return true if OP is constant. OP is the current operation. MODE is the current operation mode. */intconsttable_operand (op, mode) rtx op; enum machine_mode mode ATTRIBUTE_UNUSED;{ return CONSTANT_P (op);}/* Return true if the mode of operand OP matches MODE. If MODE is set to VOIDmode, set it to the mode of OP. */ static intcheck_mode (op, mode) register rtx op; enum machine_mode *mode;{ if (*mode == VOIDmode) *mode = GET_MODE (op); else { if (GET_MODE (op) != VOIDmode && GET_MODE (op) != *mode) return 0; } return 1;}/* Return true if OP a valid operand for the LARL instruction. OP is the current operation. MODE is the current operation mode. */intlarl_operand (op, mode) register rtx op; enum machine_mode mode;{ if (! check_mode (op, &mode)) return 0; /* Allow labels and local symbols. */ if (GET_CODE (op) == LABEL_REF) return 1;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -