@@ -2002,6 +2002,142 @@ mod sealed {
2002
2002
vec_ctf_u32 :: < IMM5 > ( self )
2003
2003
}
2004
2004
}
2005
+
2006
+ #[ inline]
2007
+ #[ target_feature( enable = "altivec" ) ]
2008
+ #[ cfg_attr( all( test, target_endian = "little" ) , assert_instr( vmrghb) ) ]
2009
+ #[ cfg_attr( all( test, target_endian = "big" ) , assert_instr( vmrglb) ) ]
2010
+ unsafe fn vec_vmrglb ( a : vector_signed_char , b : vector_signed_char ) -> vector_signed_char {
2011
+ let mergel_perm = transmute ( u8x16:: new (
2012
+ 0x08 , 0x18 , 0x09 , 0x19 , 0x0A , 0x1A , 0x0B , 0x1B , 0x0C , 0x1C , 0x0D , 0x1D , 0x0E , 0x1E ,
2013
+ 0x0F , 0x1F ,
2014
+ ) ) ;
2015
+ vec_perm ( a, b, mergel_perm)
2016
+ }
2017
+
2018
+ #[ inline]
2019
+ #[ target_feature( enable = "altivec" ) ]
2020
+ #[ cfg_attr( all( test, target_endian = "little" ) , assert_instr( vmrghh) ) ]
2021
+ #[ cfg_attr( all( test, target_endian = "big" ) , assert_instr( vmrglh) ) ]
2022
+ unsafe fn vec_vmrglh ( a : vector_signed_short , b : vector_signed_short ) -> vector_signed_short {
2023
+ let mergel_perm = transmute ( u8x16:: new (
2024
+ 0x08 , 0x09 , 0x18 , 0x19 , 0x0A , 0x0B , 0x1A , 0x1B , 0x0C , 0x0D , 0x1C , 0x1D , 0x0E , 0x0F ,
2025
+ 0x1E , 0x1F ,
2026
+ ) ) ;
2027
+ vec_perm ( a, b, mergel_perm)
2028
+ }
2029
+
2030
+ #[ inline]
2031
+ #[ target_feature( enable = "altivec" ) ]
2032
+ #[ cfg_attr(
2033
+ all( test, target_endian = "little" , not( target_feature = "vsx" ) ) ,
2034
+ assert_instr( vmrghw)
2035
+ ) ]
2036
+ #[ cfg_attr(
2037
+ all( test, target_endian = "little" , target_feature = "vsx" ) ,
2038
+ assert_instr( xxmrghw)
2039
+ ) ]
2040
+ #[ cfg_attr(
2041
+ all( test, target_endian = "big" , not( target_feature = "vsx" ) ) ,
2042
+ assert_instr( vmrglw)
2043
+ ) ]
2044
+ #[ cfg_attr(
2045
+ all( test, target_endian = "big" , target_feature = "vsx" ) ,
2046
+ assert_instr( xxmrglw)
2047
+ ) ]
2048
+ unsafe fn vec_vmrglw ( a : vector_signed_int , b : vector_signed_int ) -> vector_signed_int {
2049
+ let mergel_perm = transmute ( u8x16:: new (
2050
+ 0x08 , 0x09 , 0x0A , 0x0B , 0x18 , 0x19 , 0x1A , 0x1B , 0x0C , 0x0D , 0x0E , 0x0F , 0x1C , 0x1D ,
2051
+ 0x1E , 0x1F ,
2052
+ ) ) ;
2053
+ vec_perm ( a, b, mergel_perm)
2054
+ }
2055
+
2056
+ #[ inline]
2057
+ #[ target_feature( enable = "altivec" ) ]
2058
+ #[ cfg_attr( all( test, target_endian = "little" ) , assert_instr( vmrglb) ) ]
2059
+ #[ cfg_attr( all( test, target_endian = "big" ) , assert_instr( vmrghb) ) ]
2060
+ unsafe fn vec_vmrghb ( a : vector_signed_char , b : vector_signed_char ) -> vector_signed_char {
2061
+ let mergel_perm = transmute ( u8x16:: new (
2062
+ 0x00 , 0x10 , 0x01 , 0x11 , 0x02 , 0x12 , 0x03 , 0x13 , 0x04 , 0x14 , 0x05 , 0x15 , 0x06 , 0x16 ,
2063
+ 0x07 , 0x17 ,
2064
+ ) ) ;
2065
+ vec_perm ( a, b, mergel_perm)
2066
+ }
2067
+
2068
+ #[ inline]
2069
+ #[ target_feature( enable = "altivec" ) ]
2070
+ #[ cfg_attr( all( test, target_endian = "little" ) , assert_instr( vmrglh) ) ]
2071
+ #[ cfg_attr( all( test, target_endian = "big" ) , assert_instr( vmrghh) ) ]
2072
+ unsafe fn vec_vmrghh ( a : vector_signed_short , b : vector_signed_short ) -> vector_signed_short {
2073
+ let mergel_perm = transmute ( u8x16:: new (
2074
+ 0x00 , 0x01 , 0x10 , 0x11 , 0x02 , 0x03 , 0x12 , 0x13 , 0x04 , 0x05 , 0x14 , 0x15 , 0x06 , 0x07 ,
2075
+ 0x16 , 0x17 ,
2076
+ ) ) ;
2077
+ vec_perm ( a, b, mergel_perm)
2078
+ }
2079
+
2080
+ #[ inline]
2081
+ #[ target_feature( enable = "altivec" ) ]
2082
+ #[ cfg_attr(
2083
+ all( test, target_endian = "little" , not( target_feature = "vsx" ) ) ,
2084
+ assert_instr( vmrglw)
2085
+ ) ]
2086
+ #[ cfg_attr(
2087
+ all( test, target_endian = "little" , target_feature = "vsx" ) ,
2088
+ assert_instr( xxmrglw)
2089
+ ) ]
2090
+ #[ cfg_attr(
2091
+ all( test, target_endian = "big" , not( target_feature = "vsx" ) ) ,
2092
+ assert_instr( vmrghw)
2093
+ ) ]
2094
+ #[ cfg_attr(
2095
+ all( test, target_endian = "big" , target_feature = "vsx" ) ,
2096
+ assert_instr( xxmrghw)
2097
+ ) ]
2098
+ unsafe fn vec_vmrghw ( a : vector_signed_int , b : vector_signed_int ) -> vector_signed_int {
2099
+ let mergel_perm = transmute ( u8x16:: new (
2100
+ 0x00 , 0x01 , 0x02 , 0x03 , 0x10 , 0x11 , 0x12 , 0x13 , 0x04 , 0x05 , 0x06 , 0x07 , 0x14 , 0x15 ,
2101
+ 0x16 , 0x17 ,
2102
+ ) ) ;
2103
+ vec_perm ( a, b, mergel_perm)
2104
+ }
2105
+
2106
+ pub trait VectorMergeh < Other > {
2107
+ type Result ;
2108
+ unsafe fn vec_mergeh ( self , b : Other ) -> Self :: Result ;
2109
+ }
2110
+
2111
+ impl_vec_trait ! { [ VectorMergeh vec_mergeh] + 2 b ( vec_vmrghb, vec_vmrghh, vec_vmrghw) }
2112
+ impl_vec_trait ! { [ VectorMergeh vec_mergeh] + vec_vmrghw ( vector_float, vector_float) -> vector_float }
2113
+
2114
+ pub trait VectorMergel < Other > {
2115
+ type Result ;
2116
+ unsafe fn vec_mergel ( self , b : Other ) -> Self :: Result ;
2117
+ }
2118
+
2119
+ impl_vec_trait ! { [ VectorMergel vec_mergel] + 2 b ( vec_vmrglb, vec_vmrglh, vec_vmrglw) }
2120
+ impl_vec_trait ! { [ VectorMergel vec_mergel] + vec_vmrglw ( vector_float, vector_float) -> vector_float }
2121
+ }
2122
+
2123
+ /// Vector Merge Low
2124
+ #[ inline]
2125
+ #[ target_feature( enable = "altivec" ) ]
2126
+ pub unsafe fn vec_mergel < T , U > ( a : T , b : U ) -> <T as sealed:: VectorMergel < U > >:: Result
2127
+ where
2128
+ T : sealed:: VectorMergel < U > ,
2129
+ {
2130
+ a. vec_mergel ( b)
2131
+ }
2132
+
2133
+ /// Vector Merge High
2134
+ #[ inline]
2135
+ #[ target_feature( enable = "altivec" ) ]
2136
+ pub unsafe fn vec_mergeh < T , U > ( a : T , b : U ) -> <T as sealed:: VectorMergeh < U > >:: Result
2137
+ where
2138
+ T : sealed:: VectorMergeh < U > ,
2139
+ {
2140
+ a. vec_mergeh ( b)
2005
2141
}
2006
2142
2007
2143
/// Vector Load Indexed.
0 commit comments