diff options
Diffstat (limited to 'gcc/config/i386/i386.c')
-rw-r--r-- | gcc/config/i386/i386.c | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c index 2c637631cae..0e4e46c3888 100644 --- a/gcc/config/i386/i386.c +++ b/gcc/config/i386/i386.c @@ -20769,6 +20769,16 @@ enum ix86_builtins IX86_BUILTIN_MFENCE, IX86_BUILTIN_LFENCE, + IX86_BUILTIN_BSRSI, + IX86_BUILTIN_BSRDI, + IX86_BUILTIN_RDPMC, + IX86_BUILTIN_RDTSC, + IX86_BUILTIN_RDTSCP, + IX86_BUILTIN_ROLQI, + IX86_BUILTIN_ROLHI, + IX86_BUILTIN_RORQI, + IX86_BUILTIN_RORHI, + /* SSE3. */ IX86_BUILTIN_ADDSUBPS, IX86_BUILTIN_HADDPS, @@ -21471,6 +21481,8 @@ enum ix86_special_builtin_type { SPECIAL_FTYPE_UNKNOWN, VOID_FTYPE_VOID, + UINT64_FTYPE_VOID, + UINT64_FTYPE_PINT, V32QI_FTYPE_PCCHAR, V16QI_FTYPE_PCCHAR, V8SF_FTYPE_PCV4SF, @@ -21516,6 +21528,9 @@ enum ix86_builtin_type INT_FTYPE_V4SF_V4SF_PTEST, INT_FTYPE_V2DI_V2DI_PTEST, INT_FTYPE_V2DF_V2DF_PTEST, + INT_FTYPE_INT, + UINT64_FTYPE_INT, + INT64_FTYPE_INT64, INT64_FTYPE_V4SF, INT64_FTYPE_V2DF, INT_FTYPE_V16QI, @@ -21626,6 +21641,8 @@ enum ix86_builtin_type UINT_FTYPE_UINT_UINT, UINT_FTYPE_UINT_USHORT, UINT_FTYPE_UINT_UCHAR, + UINT16_FTYPE_UINT16_INT, + UINT8_FTYPE_UINT8_INT, V8HI_FTYPE_V8HI_INT, V4SI_FTYPE_V4SI_INT, V4HI_FTYPE_V4HI_INT, @@ -21664,6 +21681,9 @@ enum ix86_builtin_type /* Special builtins with variable number of arguments. */ static const struct builtin_description bdesc_special_args[] = { + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtsc, "__builtin_ia32_rdtsc", IX86_BUILTIN_RDTSC, UNKNOWN, (int) UINT64_FTYPE_VOID }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdtscp, "__builtin_ia32_rdtscp", IX86_BUILTIN_RDTSCP, UNKNOWN, (int) UINT64_FTYPE_PINT }, + /* MMX */ { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_emms, "__builtin_ia32_emms", IX86_BUILTIN_EMMS, UNKNOWN, (int) VOID_FTYPE_VOID }, @@ -21744,6 +21764,14 @@ static const struct builtin_description bdesc_special_args[] = /* Builtins with variable number of arguments. */ static const struct builtin_description bdesc_args[] = { + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_bsr, "__builtin_ia32_bsrsi", IX86_BUILTIN_BSRSI, UNKNOWN, (int) INT_FTYPE_INT }, + { OPTION_MASK_ISA_64BIT, CODE_FOR_bsr_rex64, "__builtin_ia32_bsrdi", IX86_BUILTIN_BSRDI, UNKNOWN, (int) INT64_FTYPE_INT64 }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rdpmc, "__builtin_ia32_rdpmc", IX86_BUILTIN_RDPMC, UNKNOWN, (int) UINT64_FTYPE_INT }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlqi3, "__builtin_ia32_rolqi", IX86_BUILTIN_ROLQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotlhi3, "__builtin_ia32_rolhi", IX86_BUILTIN_ROLHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrqi3, "__builtin_ia32_rorqi", IX86_BUILTIN_RORQI, UNKNOWN, (int) UINT8_FTYPE_UINT8_INT }, + { ~OPTION_MASK_ISA_64BIT, CODE_FOR_rotrhi3, "__builtin_ia32_rorhi", IX86_BUILTIN_RORHI, UNKNOWN, (int) UINT16_FTYPE_UINT16_INT }, + /* MMX */ { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv8qi3, "__builtin_ia32_paddb", IX86_BUILTIN_PADDB, UNKNOWN, (int) V8QI_FTYPE_V8QI_V8QI }, { OPTION_MASK_ISA_MMX, CODE_FOR_mmx_addv4hi3, "__builtin_ia32_paddw", IX86_BUILTIN_PADDW, UNKNOWN, (int) V4HI_FTYPE_V4HI_V4HI }, @@ -23388,6 +23416,34 @@ ix86_init_mmx_sse_builtins (void) = build_function_type_list (V2DF_type_node, V2DF_type_node, V2DI_type_node, NULL_TREE); + /* Integer intrinsics. */ + tree uint64_ftype_void + = build_function_type (long_long_unsigned_type_node, + void_list_node); + tree int_ftype_int + = build_function_type_list (integer_type_node, + integer_type_node, NULL_TREE); + tree int64_ftype_int64 + = build_function_type_list (long_long_integer_type_node, + long_long_integer_type_node, + NULL_TREE); + tree uint64_ftype_int + = build_function_type_list (long_long_unsigned_type_node, + integer_type_node, NULL_TREE); + tree uint64_ftype_pint + = build_function_type_list (long_long_unsigned_type_node, + pint_type_node, NULL_TREE); + tree ushort_ftype_ushort_int + = build_function_type_list (short_unsigned_type_node, + short_unsigned_type_node, + integer_type_node, + NULL_TREE); + tree uchar_ftype_uchar_int + = build_function_type_list (unsigned_char_type_node, + unsigned_char_type_node, + integer_type_node, + NULL_TREE); + tree ftype; /* Add all special builtins with variable number of operands. */ @@ -23405,6 +23461,12 @@ ix86_init_mmx_sse_builtins (void) case VOID_FTYPE_VOID: type = void_ftype_void; break; + case UINT64_FTYPE_VOID: + type = uint64_ftype_void; + break; + case UINT64_FTYPE_PINT: + type = uint64_ftype_pint; + break; case V32QI_FTYPE_PCCHAR: type = v32qi_ftype_pcchar; break; @@ -23535,6 +23597,15 @@ ix86_init_mmx_sse_builtins (void) case INT_FTYPE_V2DF_V2DF_PTEST: type = int_ftype_v2df_v2df; break; + case INT_FTYPE_INT: + type = int_ftype_int; + break; + case UINT64_FTYPE_INT: + type = uint64_ftype_int; + break; + case INT64_FTYPE_INT64: + type = int64_ftype_int64; + break; case INT64_FTYPE_V4SF: type = int64_ftype_v4sf; break; @@ -23845,6 +23916,12 @@ ix86_init_mmx_sse_builtins (void) case UINT_FTYPE_UINT_UCHAR: type = unsigned_ftype_unsigned_uchar; break; + case UINT16_FTYPE_UINT16_INT: + type = ushort_ftype_ushort_int; + break; + case UINT8_FTYPE_UINT8_INT: + type = uchar_ftype_uchar_int; + break; case V8HI_FTYPE_V8HI_INT: type = v8hi_ftype_v8hi_int; break; @@ -24924,6 +25001,9 @@ ix86_expand_args_builtin (const struct builtin_description *d, return ix86_expand_sse_ptest (d, exp, target); case FLOAT128_FTYPE_FLOAT128: case FLOAT_FTYPE_FLOAT: + case INT_FTYPE_INT: + case UINT64_FTYPE_INT: + case INT64_FTYPE_INT64: case INT64_FTYPE_V4SF: case INT64_FTYPE_V2DF: case INT_FTYPE_V16QI: @@ -25049,6 +25129,8 @@ ix86_expand_args_builtin (const struct builtin_description *d, case UINT_FTYPE_UINT_UINT: case UINT_FTYPE_UINT_USHORT: case UINT_FTYPE_UINT_UCHAR: + case UINT16_FTYPE_UINT16_INT: + case UINT8_FTYPE_UINT8_INT: nargs = 2; break; case V2DI2TI_FTYPE_V2DI_INT: @@ -25293,6 +25375,12 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, case VOID_FTYPE_VOID: emit_insn (GEN_FCN (icode) (target)); return 0; + case UINT64_FTYPE_VOID: + nargs = 0; + klass = load; + memory = 0; + break; + case UINT64_FTYPE_PINT: case V2DI_FTYPE_PV2DI: case V32QI_FTYPE_PCCHAR: case V16QI_FTYPE_PCCHAR: @@ -25415,6 +25503,9 @@ ix86_expand_special_args_builtin (const struct builtin_description *d, switch (nargs) { + case 0: + pat = GEN_FCN (icode) (target); + break; case 1: pat = GEN_FCN (icode) (target, args[0].op); break; |