diff options
Diffstat (limited to 'gcc')
| -rw-r--r-- | gcc/config/rs6000/altivec.md | 16 | ||||
| -rw-r--r-- | gcc/config/rs6000/vector.md | 27 | ||||
| -rw-r--r-- | gcc/config/rs6000/vsx.md | 33 | ||||
| -rw-r--r-- | gcc/testsuite/gcc.target/powerpc/int_128bit-runnable.c | 16 | 
4 files changed, 52 insertions, 40 deletions
| diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index 0fa69b7..a27e466 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -2226,10 +2226,10 @@    "vsl<VI_char> %0,%1,%2"    [(set_attr "type" "vecsimple")]) -(define_insn "altivec_vslq" -  [(set (match_operand:V1TI 0 "vsx_register_operand" "=v") -	(ashift:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v") -		     (match_operand:V1TI 2 "vsx_register_operand" "v")))] +(define_insn "altivec_vslq_<mode>" +  [(set (match_operand:VEC_TI 0 "vsx_register_operand" "=v") +	(ashift:VEC_TI (match_operand:VEC_TI 1 "vsx_register_operand" "v") +		     (match_operand:VEC_TI 2 "vsx_register_operand" "v")))]    "TARGET_POWER10"    /* Shift amount in needs to be in bits[57:63] of 128-bit operand. */    "vslq %0,%1,%2" @@ -2243,10 +2243,10 @@    "vsr<VI_char> %0,%1,%2"    [(set_attr "type" "vecsimple")]) -(define_insn "altivec_vsrq" -  [(set (match_operand:V1TI 0 "vsx_register_operand" "=v") -	(lshiftrt:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v") -		       (match_operand:V1TI 2 "vsx_register_operand" "v")))] +(define_insn "altivec_vsrq_<mode>" +  [(set (match_operand:VEC_TI 0 "vsx_register_operand" "=v") +	(lshiftrt:VEC_TI (match_operand:VEC_TI 1 "vsx_register_operand" "v") +			   (match_operand:VEC_TI 2 "vsx_register_operand" "v")))]    "TARGET_POWER10"    /* Shift amount in needs to be in bits[57:63] of 128-bit operand. */    "vsrq %0,%1,%2" diff --git a/gcc/config/rs6000/vector.md b/gcc/config/rs6000/vector.md index ea88a97..7e36c788 100644 --- a/gcc/config/rs6000/vector.md +++ b/gcc/config/rs6000/vector.md @@ -26,6 +26,9 @@  ;; Vector int modes  (define_mode_iterator VEC_I [V16QI V8HI V4SI V2DI]) +;; 128-bit int modes +(define_mode_iterator VEC_TI [V1TI TI]) +  ;; Vector int modes for parity  (define_mode_iterator VEC_IP [V8HI  			      V4SI @@ -1620,17 +1623,17 @@    "")  ;; No immediate version of this 128-bit instruction -(define_expand "vashlv1ti3" -  [(set (match_operand:V1TI 0 "vsx_register_operand" "=v") -	(ashift:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v") -		     (match_operand:V1TI 2 "vsx_register_operand" "v")))] +(define_expand "vashl<mode>3" +  [(set (match_operand:VEC_TI 0 "vsx_register_operand" "=v") +	(ashift:VEC_TI (match_operand:VEC_TI 1 "vsx_register_operand") +			 (match_operand:VEC_TI 2 "vsx_register_operand")))]    "TARGET_POWER10"  {    /* Shift amount in needs to be put in bits[57:63] of 128-bit operand2. */ -  rtx tmp = gen_reg_rtx (V1TImode); +  rtx tmp = gen_reg_rtx (<MODE>mode);    emit_insn (gen_xxswapd_v1ti (tmp, operands[2])); -  emit_insn (gen_altivec_vslq (operands[0], operands[1], tmp)); +  emit_insn(gen_altivec_vslq_<mode> (operands[0], operands[1], tmp));    DONE;  }) @@ -1643,17 +1646,17 @@    "")  ;; No immediate version of this 128-bit instruction -(define_expand "vlshrv1ti3" -  [(set (match_operand:V1TI 0 "vsx_register_operand" "=v") -	(lshiftrt:V1TI (match_operand:V1TI 1 "vsx_register_operand" "v") -		       (match_operand:V1TI 2 "vsx_register_operand" "v")))] +(define_expand "vlshr<mode>3" +  [(set (match_operand:VEC_TI 0 "vsx_register_operand" "=v") +	(lshiftrt:VEC_TI (match_operand:VEC_TI 1 "vsx_register_operand") +			   (match_operand:VEC_TI 2 "vsx_register_operand")))]    "TARGET_POWER10"  {    /* Shift amount in needs to be put into bits[57:63] of 128-bit operand2. */ -  rtx tmp = gen_reg_rtx (V1TImode); +  rtx tmp = gen_reg_rtx (<MODE>mode);    emit_insn (gen_xxswapd_v1ti (tmp, operands[2])); -  emit_insn (gen_altivec_vsrq (operands[0], operands[1], tmp)); +  emit_insn(gen_altivec_vsrq_<mode> (operands[0], operands[1], tmp));    DONE;  }) diff --git a/gcc/config/rs6000/vsx.md b/gcc/config/rs6000/vsx.md index 5403d02..ce8f82b 100644 --- a/gcc/config/rs6000/vsx.md +++ b/gcc/config/rs6000/vsx.md @@ -37,9 +37,6 @@  				  TI  				  V1TI]) -;; Iterator for 128-bit integer types that go in a single vector register. -(define_mode_iterator VSX_TI [TI V1TI]) -  ;; Iterator for the 2 32-bit vector types  (define_mode_iterator VSX_W [V4SF V4SI]) @@ -952,9 +949,9 @@  ;; special V1TI container class, which it is not appropriate to use vec_select  ;; for the type.  (define_insn "*vsx_le_permute_<mode>" -  [(set (match_operand:VSX_TI 0 "nonimmediate_operand" "=wa,wa,Z,&r,&r,Q") -	(rotate:VSX_TI -	 (match_operand:VSX_TI 1 "input_operand" "wa,Z,wa,r,Q,r") +  [(set (match_operand:VEC_TI 0 "nonimmediate_operand" "=wa,wa,Z,&r,&r,Q") +	(rotate:VEC_TI +	 (match_operand:VEC_TI 1 "input_operand" "wa,Z,wa,r,Q,r")  	 (const_int 64)))]    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR"    "@ @@ -968,10 +965,10 @@     (set_attr "type" "vecperm,vecload,vecstore,*,load,store")])  (define_insn_and_split "*vsx_le_undo_permute_<mode>" -  [(set (match_operand:VSX_TI 0 "vsx_register_operand" "=wa,wa") -	(rotate:VSX_TI -	 (rotate:VSX_TI -	  (match_operand:VSX_TI 1 "vsx_register_operand" "0,wa") +  [(set (match_operand:VEC_TI 0 "vsx_register_operand" "=wa,wa") +	(rotate:VEC_TI +	 (rotate:VEC_TI +	  (match_operand:VEC_TI 1 "vsx_register_operand" "0,wa")  	  (const_int 64))  	 (const_int 64)))]    "!BYTES_BIG_ENDIAN && TARGET_VSX" @@ -1043,11 +1040,11 @@  ;; Peepholes to catch loads and stores for TImode if TImode landed in  ;; GPR registers on a little endian system.  (define_peephole2 -  [(set (match_operand:VSX_TI 0 "int_reg_operand") -	(rotate:VSX_TI (match_operand:VSX_TI 1 "memory_operand") +  [(set (match_operand:VEC_TI 0 "int_reg_operand") +	(rotate:VEC_TI (match_operand:VEC_TI 1 "memory_operand")  		       (const_int 64))) -   (set (match_operand:VSX_TI 2 "int_reg_operand") -	(rotate:VSX_TI (match_dup 0) +   (set (match_operand:VEC_TI 2 "int_reg_operand") +	(rotate:VEC_TI (match_dup 0)  		       (const_int 64)))]    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR     && (rtx_equal_p (operands[0], operands[2]) @@ -1055,11 +1052,11 @@     [(set (match_dup 2) (match_dup 1))])  (define_peephole2 -  [(set (match_operand:VSX_TI 0 "int_reg_operand") -	(rotate:VSX_TI (match_operand:VSX_TI 1 "int_reg_operand") +  [(set (match_operand:VEC_TI 0 "int_reg_operand") +	(rotate:VEC_TI (match_operand:VEC_TI 1 "int_reg_operand")  		       (const_int 64))) -   (set (match_operand:VSX_TI 2 "memory_operand") -	(rotate:VSX_TI (match_dup 0) +   (set (match_operand:VEC_TI 2 "memory_operand") +	(rotate:VEC_TI (match_dup 0)  		       (const_int 64)))]    "!BYTES_BIG_ENDIAN && TARGET_VSX && !TARGET_P9_VECTOR     && peep2_reg_dead_p (2, operands[0])" diff --git a/gcc/testsuite/gcc.target/powerpc/int_128bit-runnable.c b/gcc/testsuite/gcc.target/powerpc/int_128bit-runnable.c index 625b386..9f7dbc6 100644 --- a/gcc/testsuite/gcc.target/powerpc/int_128bit-runnable.c +++ b/gcc/testsuite/gcc.target/powerpc/int_128bit-runnable.c @@ -52,6 +52,18 @@ void print_i128(__int128_t val)  void abort (void); +__attribute__((noinline)) +__int128_t shift_right (__int128_t a, __uint128_t b) +{ +  return a >> b; +} + +__attribute__((noinline)) +__int128_t shift_left (__int128_t a, __uint128_t b) +{ +  return a << b; +} +  int main ()  {    int i, result_int; @@ -102,7 +114,7 @@ int main ()  #endif    } -  arg1 = 3; +  arg1 = vec_result[0];    uarg2 = 4;    expected_result = arg1*16; @@ -186,7 +198,7 @@ int main ()  #endif    } -  arg1 = 48; +  arg1 = vec_uresult[0];    uarg2 = 4;    expected_result = arg1/16; | 
