@@ -46,16 +46,10 @@ impl Builder<'_, '_> {
4646 ) ,
4747 } ;
4848 let int_ty = SpirvType :: Integer ( width, false ) . def ( self . span ( ) , self ) ;
49- let ( mask_sign, mask_value) = match width {
50- 32 => (
51- self . constant_u32 ( self . span ( ) , 1 << 31 ) ,
52- self . constant_u32 ( self . span ( ) , u32:: MAX >> 1 ) ,
53- ) ,
54- 64 => (
55- self . constant_u64 ( self . span ( ) , 1 << 63 ) ,
56- self . constant_u64 ( self . span ( ) , u64:: MAX >> 1 ) ,
57- ) ,
58- _ => bug ! ( "copysign must have width 32 or 64, not {}" , width) ,
49+ let [ mask_sign, mask_value] = {
50+ let sign_bit = 1u128 . checked_shl ( width - 1 ) . unwrap ( ) ;
51+ let value_mask = sign_bit - 1 ;
52+ [ sign_bit, value_mask] . map ( |v| self . constant_int ( int_ty, v) )
5953 } ;
6054 let val_bits = self . bitcast ( val, int_ty) ;
6155 let sign_bits = self . bitcast ( sign, int_ty) ;
@@ -154,30 +148,44 @@ impl<'a, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'tcx> {
154148 result
155149 }
156150
157- sym:: sqrtf32 | sym:: sqrtf64 => self . gl_op ( GLOp :: Sqrt , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
158- sym:: powif32 | sym:: powif64 => {
151+ sym:: sqrtf32 | sym:: sqrtf64 | sym:: sqrtf128 => {
152+ self . gl_op ( GLOp :: Sqrt , ret_ty, [ args[ 0 ] . immediate ( ) ] )
153+ }
154+ sym:: powif32 | sym:: powif64 | sym:: powif128 => {
159155 let float = self . sitofp ( args[ 1 ] . immediate ( ) , args[ 0 ] . immediate ( ) . ty ) ;
160156 self . gl_op ( GLOp :: Pow , ret_ty, [ args[ 0 ] . immediate ( ) , float] )
161157 }
162- sym:: sinf32 | sym:: sinf64 => self . gl_op ( GLOp :: Sin , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
163- sym:: cosf32 | sym:: cosf64 => self . gl_op ( GLOp :: Cos , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
164- sym:: powf32 | sym:: powf64 => self . gl_op (
158+ sym:: sinf32 | sym:: sinf64 | sym:: sinf128 => {
159+ self . gl_op ( GLOp :: Sin , ret_ty, [ args[ 0 ] . immediate ( ) ] )
160+ }
161+ sym:: cosf32 | sym:: cosf64 | sym:: cosf128 => {
162+ self . gl_op ( GLOp :: Cos , ret_ty, [ args[ 0 ] . immediate ( ) ] )
163+ }
164+ sym:: powf32 | sym:: powf64 | sym:: powf128 => self . gl_op (
165165 GLOp :: Pow ,
166166 ret_ty,
167167 [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
168168 ) ,
169- sym:: expf32 | sym:: expf64 => self . gl_op ( GLOp :: Exp , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
170- sym:: exp2f32 | sym:: exp2f64 => self . gl_op ( GLOp :: Exp2 , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
171- sym:: logf32 | sym:: logf64 => self . gl_op ( GLOp :: Log , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
172- sym:: log2f32 | sym:: log2f64 => self . gl_op ( GLOp :: Log2 , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
173- sym:: log10f32 | sym:: log10f64 => {
169+ sym:: expf32 | sym:: expf64 | sym:: expf128 => {
170+ self . gl_op ( GLOp :: Exp , ret_ty, [ args[ 0 ] . immediate ( ) ] )
171+ }
172+ sym:: exp2f32 | sym:: exp2f64 | sym:: exp2f128 => {
173+ self . gl_op ( GLOp :: Exp2 , ret_ty, [ args[ 0 ] . immediate ( ) ] )
174+ }
175+ sym:: logf32 | sym:: logf64 | sym:: logf128 => {
176+ self . gl_op ( GLOp :: Log , ret_ty, [ args[ 0 ] . immediate ( ) ] )
177+ }
178+ sym:: log2f32 | sym:: log2f64 | sym:: log2f128 => {
179+ self . gl_op ( GLOp :: Log2 , ret_ty, [ args[ 0 ] . immediate ( ) ] )
180+ }
181+ sym:: log10f32 | sym:: log10f64 | sym:: log10f128 => {
174182 // spir-v glsl doesn't have log10, so,
175183 // log10(x) == (1 / ln(10)) * ln(x)
176184 let mul = self . constant_float ( args[ 0 ] . immediate ( ) . ty , 1.0 / 10.0f64 . ln ( ) ) ;
177185 let ln = self . gl_op ( GLOp :: Log , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ;
178186 self . fmul ( mul, ln)
179187 }
180- sym:: fmaf32 | sym:: fmaf64 => self . gl_op (
188+ sym:: fmaf32 | sym:: fmaf64 | sym :: fmaf128 => self . gl_op (
181189 GLOp :: Fma ,
182190 ret_ty,
183191 [
@@ -186,30 +194,37 @@ impl<'a, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'tcx> {
186194 args[ 2 ] . immediate ( ) ,
187195 ] ,
188196 ) ,
189- sym:: fabsf32 | sym:: fabsf64 => self . gl_op ( GLOp :: FAbs , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
190- sym:: minnumf32 | sym:: minnumf64 => self . gl_op (
197+ sym:: fabsf32 | sym:: fabsf64 | sym:: fabsf128 => {
198+ self . gl_op ( GLOp :: FAbs , ret_ty, [ args[ 0 ] . immediate ( ) ] )
199+ }
200+ sym:: minnumf32 | sym:: minnumf64 | sym:: minnumf128 => self . gl_op (
191201 GLOp :: FMin ,
192202 ret_ty,
193203 [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
194204 ) ,
195- sym:: maxnumf32 | sym:: maxnumf64 => self . gl_op (
205+ sym:: maxnumf32 | sym:: maxnumf64 | sym :: maxnumf128 => self . gl_op (
196206 GLOp :: FMax ,
197207 ret_ty,
198208 [ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
199209 ) ,
200- sym:: copysignf32 | sym:: copysignf64 => {
210+ sym:: copysignf32 | sym:: copysignf64 | sym :: copysignf128 => {
201211 let val = args[ 0 ] . immediate ( ) ;
202212 let sign = args[ 1 ] . immediate ( ) ;
203213 self . copysign ( val, sign)
204214 }
205- sym:: floorf32 | sym:: floorf64 => self . gl_op ( GLOp :: Floor , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
206- sym:: ceilf32 | sym:: ceilf64 => self . gl_op ( GLOp :: Ceil , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
207- sym:: truncf32 | sym:: truncf64 => self . gl_op ( GLOp :: Trunc , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ,
208- sym:: rintf32 | sym:: rintf64 => {
215+ sym:: floorf32 | sym:: floorf64 | sym:: floorf128 => {
216+ self . gl_op ( GLOp :: Floor , ret_ty, [ args[ 0 ] . immediate ( ) ] )
217+ }
218+ sym:: ceilf32 | sym:: ceilf64 | sym:: ceilf128 => {
219+ self . gl_op ( GLOp :: Ceil , ret_ty, [ args[ 0 ] . immediate ( ) ] )
220+ }
221+ sym:: truncf32 | sym:: truncf64 | sym:: truncf128 => {
222+ self . gl_op ( GLOp :: Trunc , ret_ty, [ args[ 0 ] . immediate ( ) ] )
223+ }
224+ sym:: round_ties_even_f32 | sym:: round_ties_even_f64 | sym:: round_ties_even_f128 => {
209225 self . gl_op ( GLOp :: RoundEven , ret_ty, [ args[ 0 ] . immediate ( ) ] )
210226 }
211- // TODO: Correctness of all these rounds
212- sym:: nearbyintf32 | sym:: nearbyintf64 | sym:: roundf32 | sym:: roundf64 => {
227+ sym:: roundf32 | sym:: roundf64 | sym:: roundf128 => {
213228 self . gl_op ( GLOp :: Round , ret_ty, [ args[ 0 ] . immediate ( ) ] )
214229 }
215230
0 commit comments