@@ -46,16 +46,10 @@ impl Builder<'_, '_> {
46
46
) ,
47
47
} ;
48
48
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) )
59
53
} ;
60
54
let val_bits = self . bitcast ( val, int_ty) ;
61
55
let sign_bits = self . bitcast ( sign, int_ty) ;
@@ -154,30 +148,44 @@ impl<'a, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'tcx> {
154
148
result
155
149
}
156
150
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 => {
159
155
let float = self . sitofp ( args[ 1 ] . immediate ( ) , args[ 0 ] . immediate ( ) . ty ) ;
160
156
self . gl_op ( GLOp :: Pow , ret_ty, [ args[ 0 ] . immediate ( ) , float] )
161
157
}
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 (
165
165
GLOp :: Pow ,
166
166
ret_ty,
167
167
[ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
168
168
) ,
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 => {
174
182
// spir-v glsl doesn't have log10, so,
175
183
// log10(x) == (1 / ln(10)) * ln(x)
176
184
let mul = self . constant_float ( args[ 0 ] . immediate ( ) . ty , 1.0 / 10.0f64 . ln ( ) ) ;
177
185
let ln = self . gl_op ( GLOp :: Log , ret_ty, [ args[ 0 ] . immediate ( ) ] ) ;
178
186
self . fmul ( mul, ln)
179
187
}
180
- sym:: fmaf32 | sym:: fmaf64 => self . gl_op (
188
+ sym:: fmaf32 | sym:: fmaf64 | sym :: fmaf128 => self . gl_op (
181
189
GLOp :: Fma ,
182
190
ret_ty,
183
191
[
@@ -186,30 +194,37 @@ impl<'a, 'tcx> IntrinsicCallBuilderMethods<'tcx> for Builder<'a, 'tcx> {
186
194
args[ 2 ] . immediate ( ) ,
187
195
] ,
188
196
) ,
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 (
191
201
GLOp :: FMin ,
192
202
ret_ty,
193
203
[ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
194
204
) ,
195
- sym:: maxnumf32 | sym:: maxnumf64 => self . gl_op (
205
+ sym:: maxnumf32 | sym:: maxnumf64 | sym :: maxnumf128 => self . gl_op (
196
206
GLOp :: FMax ,
197
207
ret_ty,
198
208
[ args[ 0 ] . immediate ( ) , args[ 1 ] . immediate ( ) ] ,
199
209
) ,
200
- sym:: copysignf32 | sym:: copysignf64 => {
210
+ sym:: copysignf32 | sym:: copysignf64 | sym :: copysignf128 => {
201
211
let val = args[ 0 ] . immediate ( ) ;
202
212
let sign = args[ 1 ] . immediate ( ) ;
203
213
self . copysign ( val, sign)
204
214
}
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 => {
209
225
self . gl_op ( GLOp :: RoundEven , ret_ty, [ args[ 0 ] . immediate ( ) ] )
210
226
}
211
- // TODO: Correctness of all these rounds
212
- sym:: nearbyintf32 | sym:: nearbyintf64 | sym:: roundf32 | sym:: roundf64 => {
227
+ sym:: roundf32 | sym:: roundf64 | sym:: roundf128 => {
213
228
self . gl_op ( GLOp :: Round , ret_ty, [ args[ 0 ] . immediate ( ) ] )
214
229
}
215
230
0 commit comments