| ... | ... | @@ -2044,7 +2044,11 @@ pub const Value = extern union { |
| 2044 | 2044 | if (ty.zigTypeTag() == .Vector) { |
| 2045 | 2045 | var i: usize = 0; |
| 2046 | 2046 | while (i < ty.vectorLen()) : (i += 1) { |
| 2047 | | if (!compareScalar(lhs.indexVectorlike(i), op, rhs.indexVectorlike(i), ty.scalarType(), mod)) { |
| 2047 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 2048 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 2049 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 2050 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 2051 | if (!compareScalar(lhs_elem, op, rhs_elem, ty.scalarType(), mod)) { |
| 2048 | 2052 | return false; |
| 2049 | 2053 | } |
| 2050 | 2054 | } |
| ... | ... | @@ -2793,27 +2797,6 @@ pub const Value = extern union { |
| 2793 | 2797 | }; |
| 2794 | 2798 | } |
| 2795 | 2799 | |
| 2796 | | /// Index into a vector-like `Value`. Asserts `index` is a valid index for `val`. |
| 2797 | | /// Some scalar values are considered vector-like to avoid needing to allocate |
| 2798 | | /// a new `repeated` each time a constant is used. |
| 2799 | | pub fn indexVectorlike(val: Value, index: usize) Value { |
| 2800 | | return switch (val.tag()) { |
| 2801 | | .aggregate => val.castTag(.aggregate).?.data[index], |
| 2802 | | |
| 2803 | | .repeated => val.castTag(.repeated).?.data, |
| 2804 | | // These values will implicitly be treated as `repeated`. |
| 2805 | | .zero, |
| 2806 | | .one, |
| 2807 | | .bool_false, |
| 2808 | | .bool_true, |
| 2809 | | .int_i64, |
| 2810 | | .int_u64, |
| 2811 | | => val, |
| 2812 | | |
| 2813 | | else => unreachable, |
| 2814 | | }; |
| 2815 | | } |
| 2816 | | |
| 2817 | 2800 | /// Asserts the value is a single-item pointer to an array, or an array, |
| 2818 | 2801 | /// or an unknown-length pointer, and returns the element value at the index. |
| 2819 | 2802 | pub fn elemValue(val: Value, mod: *Module, arena: Allocator, index: usize) !Value { |
| ... | ... | @@ -2889,18 +2872,21 @@ pub const Value = extern union { |
| 2889 | 2872 | // to have only one possible value itself. |
| 2890 | 2873 | .the_only_possible_value => return val, |
| 2891 | 2874 | |
| 2892 | | // pointer to integer casted to pointer of array |
| 2893 | | .int_u64, .int_i64 => { |
| 2894 | | assert(index == 0); |
| 2895 | | return val; |
| 2896 | | }, |
| 2897 | | |
| 2898 | 2875 | .opt_payload_ptr => return val.castTag(.opt_payload_ptr).?.data.container_ptr.elemValueAdvanced(mod, index, arena, buffer), |
| 2899 | 2876 | .eu_payload_ptr => return val.castTag(.eu_payload_ptr).?.data.container_ptr.elemValueAdvanced(mod, index, arena, buffer), |
| 2900 | 2877 | |
| 2901 | 2878 | .opt_payload => return val.castTag(.opt_payload).?.data.elemValueAdvanced(mod, index, arena, buffer), |
| 2902 | 2879 | .eu_payload => return val.castTag(.eu_payload).?.data.elemValueAdvanced(mod, index, arena, buffer), |
| 2903 | 2880 | |
| 2881 | // These values will implicitly be treated as `repeated`. |
| 2882 | .zero, |
| 2883 | .one, |
| 2884 | .bool_false, |
| 2885 | .bool_true, |
| 2886 | .int_i64, |
| 2887 | .int_u64, |
| 2888 | => return val, |
| 2889 | |
| 2904 | 2890 | else => unreachable, |
| 2905 | 2891 | } |
| 2906 | 2892 | } |
| ... | ... | @@ -3172,18 +3158,21 @@ pub const Value = extern union { |
| 3172 | 3158 | }; |
| 3173 | 3159 | } |
| 3174 | 3160 | |
| 3175 | | pub fn intToFloat(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target) !Value { |
| 3176 | | return intToFloatAdvanced(val, arena, int_ty, float_ty, target, null) catch |err| switch (err) { |
| 3161 | pub fn intToFloat(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, mod: *Module) !Value { |
| 3162 | return intToFloatAdvanced(val, arena, int_ty, float_ty, mod, null) catch |err| switch (err) { |
| 3177 | 3163 | error.OutOfMemory => return error.OutOfMemory, |
| 3178 | 3164 | else => unreachable, |
| 3179 | 3165 | }; |
| 3180 | 3166 | } |
| 3181 | 3167 | |
| 3182 | | pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, target: Target, opt_sema: ?*Sema) !Value { |
| 3168 | pub fn intToFloatAdvanced(val: Value, arena: Allocator, int_ty: Type, float_ty: Type, mod: *Module, opt_sema: ?*Sema) !Value { |
| 3169 | const target = mod.getTarget(); |
| 3183 | 3170 | if (int_ty.zigTypeTag() == .Vector) { |
| 3184 | 3171 | const result_data = try arena.alloc(Value, int_ty.vectorLen()); |
| 3185 | 3172 | for (result_data) |*scalar, i| { |
| 3186 | | scalar.* = try intToFloatScalar(val.indexVectorlike(i), arena, float_ty.scalarType(), target, opt_sema); |
| 3173 | var buf: Value.ElemValueBuffer = undefined; |
| 3174 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 3175 | scalar.* = try intToFloatScalar(elem_val, arena, float_ty.scalarType(), target, opt_sema); |
| 3187 | 3176 | } |
| 3188 | 3177 | return Value.Tag.aggregate.create(arena, result_data); |
| 3189 | 3178 | } |
| ... | ... | @@ -3289,12 +3278,17 @@ pub const Value = extern union { |
| 3289 | 3278 | rhs: Value, |
| 3290 | 3279 | ty: Type, |
| 3291 | 3280 | arena: Allocator, |
| 3292 | | target: Target, |
| 3281 | mod: *Module, |
| 3293 | 3282 | ) !Value { |
| 3283 | const target = mod.getTarget(); |
| 3294 | 3284 | if (ty.zigTypeTag() == .Vector) { |
| 3295 | 3285 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3296 | 3286 | for (result_data) |*scalar, i| { |
| 3297 | | scalar.* = try intAddSatScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3287 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3288 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3289 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3290 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3291 | scalar.* = try intAddSatScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, target); |
| 3298 | 3292 | } |
| 3299 | 3293 | return Value.Tag.aggregate.create(arena, result_data); |
| 3300 | 3294 | } |
| ... | ... | @@ -3333,12 +3327,17 @@ pub const Value = extern union { |
| 3333 | 3327 | rhs: Value, |
| 3334 | 3328 | ty: Type, |
| 3335 | 3329 | arena: Allocator, |
| 3336 | | target: Target, |
| 3330 | mod: *Module, |
| 3337 | 3331 | ) !Value { |
| 3332 | const target = mod.getTarget(); |
| 3338 | 3333 | if (ty.zigTypeTag() == .Vector) { |
| 3339 | 3334 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3340 | 3335 | for (result_data) |*scalar, i| { |
| 3341 | | scalar.* = try intSubSatScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3336 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3337 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3338 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3339 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3340 | scalar.* = try intSubSatScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, target); |
| 3342 | 3341 | } |
| 3343 | 3342 | return Value.Tag.aggregate.create(arena, result_data); |
| 3344 | 3343 | } |
| ... | ... | @@ -3376,13 +3375,18 @@ pub const Value = extern union { |
| 3376 | 3375 | rhs: Value, |
| 3377 | 3376 | ty: Type, |
| 3378 | 3377 | arena: Allocator, |
| 3379 | | target: Target, |
| 3378 | mod: *Module, |
| 3380 | 3379 | ) !OverflowArithmeticResult { |
| 3380 | const target = mod.getTarget(); |
| 3381 | 3381 | if (ty.zigTypeTag() == .Vector) { |
| 3382 | 3382 | const overflowed_data = try arena.alloc(Value, ty.vectorLen()); |
| 3383 | 3383 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3384 | 3384 | for (result_data) |*scalar, i| { |
| 3385 | | const of_math_result = try intMulWithOverflowScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3385 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3386 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3387 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3388 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3389 | const of_math_result = try intMulWithOverflowScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, target); |
| 3386 | 3390 | overflowed_data[i] = of_math_result.overflowed; |
| 3387 | 3391 | scalar.* = of_math_result.wrapped_result; |
| 3388 | 3392 | } |
| ... | ... | @@ -3435,16 +3439,20 @@ pub const Value = extern union { |
| 3435 | 3439 | rhs: Value, |
| 3436 | 3440 | ty: Type, |
| 3437 | 3441 | arena: Allocator, |
| 3438 | | target: Target, |
| 3442 | mod: *Module, |
| 3439 | 3443 | ) !Value { |
| 3440 | 3444 | if (ty.zigTypeTag() == .Vector) { |
| 3441 | 3445 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3442 | 3446 | for (result_data) |*scalar, i| { |
| 3443 | | scalar.* = try numberMulWrapScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3447 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3448 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3449 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3450 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3451 | scalar.* = try numberMulWrapScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, mod); |
| 3444 | 3452 | } |
| 3445 | 3453 | return Value.Tag.aggregate.create(arena, result_data); |
| 3446 | 3454 | } |
| 3447 | | return numberMulWrapScalar(lhs, rhs, ty, arena, target); |
| 3455 | return numberMulWrapScalar(lhs, rhs, ty, arena, mod); |
| 3448 | 3456 | } |
| 3449 | 3457 | |
| 3450 | 3458 | /// Supports both floats and ints; handles undefined. |
| ... | ... | @@ -3453,19 +3461,19 @@ pub const Value = extern union { |
| 3453 | 3461 | rhs: Value, |
| 3454 | 3462 | ty: Type, |
| 3455 | 3463 | arena: Allocator, |
| 3456 | | target: Target, |
| 3464 | mod: *Module, |
| 3457 | 3465 | ) !Value { |
| 3458 | 3466 | if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef); |
| 3459 | 3467 | |
| 3460 | 3468 | if (ty.zigTypeTag() == .ComptimeInt) { |
| 3461 | | return intMul(lhs, rhs, ty, arena, target); |
| 3469 | return intMul(lhs, rhs, ty, arena, mod); |
| 3462 | 3470 | } |
| 3463 | 3471 | |
| 3464 | 3472 | if (ty.isAnyFloat()) { |
| 3465 | | return floatMul(lhs, rhs, ty, arena, target); |
| 3473 | return floatMul(lhs, rhs, ty, arena, mod); |
| 3466 | 3474 | } |
| 3467 | 3475 | |
| 3468 | | const overflow_result = try intMulWithOverflow(lhs, rhs, ty, arena, target); |
| 3476 | const overflow_result = try intMulWithOverflow(lhs, rhs, ty, arena, mod); |
| 3469 | 3477 | return overflow_result.wrapped_result; |
| 3470 | 3478 | } |
| 3471 | 3479 | |
| ... | ... | @@ -3475,12 +3483,17 @@ pub const Value = extern union { |
| 3475 | 3483 | rhs: Value, |
| 3476 | 3484 | ty: Type, |
| 3477 | 3485 | arena: Allocator, |
| 3478 | | target: Target, |
| 3486 | mod: *Module, |
| 3479 | 3487 | ) !Value { |
| 3488 | const target = mod.getTarget(); |
| 3480 | 3489 | if (ty.zigTypeTag() == .Vector) { |
| 3481 | 3490 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3482 | 3491 | for (result_data) |*scalar, i| { |
| 3483 | | scalar.* = try intMulSatScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3492 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3493 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3494 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3495 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3496 | scalar.* = try intMulSatScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, target); |
| 3484 | 3497 | } |
| 3485 | 3498 | return Value.Tag.aggregate.create(arena, result_data); |
| 3486 | 3499 | } |
| ... | ... | @@ -3547,11 +3560,14 @@ pub const Value = extern union { |
| 3547 | 3560 | } |
| 3548 | 3561 | |
| 3549 | 3562 | /// operands must be (vectors of) integers; handles undefined scalars. |
| 3550 | | pub fn bitwiseNot(val: Value, ty: Type, arena: Allocator, target: Target) !Value { |
| 3563 | pub fn bitwiseNot(val: Value, ty: Type, arena: Allocator, mod: *Module) !Value { |
| 3564 | const target = mod.getTarget(); |
| 3551 | 3565 | if (ty.zigTypeTag() == .Vector) { |
| 3552 | 3566 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3553 | 3567 | for (result_data) |*scalar, i| { |
| 3554 | | scalar.* = try bitwiseNotScalar(val.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3568 | var buf: Value.ElemValueBuffer = undefined; |
| 3569 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 3570 | scalar.* = try bitwiseNotScalar(elem_val, ty.scalarType(), arena, target); |
| 3555 | 3571 | } |
| 3556 | 3572 | return Value.Tag.aggregate.create(arena, result_data); |
| 3557 | 3573 | } |
| ... | ... | @@ -3583,11 +3599,16 @@ pub const Value = extern union { |
| 3583 | 3599 | } |
| 3584 | 3600 | |
| 3585 | 3601 | /// operands must be (vectors of) integers; handles undefined scalars. |
| 3586 | | pub fn bitwiseAnd(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3602 | pub fn bitwiseAnd(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3603 | const target = mod.getTarget(); |
| 3587 | 3604 | if (ty.zigTypeTag() == .Vector) { |
| 3588 | 3605 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3589 | 3606 | for (result_data) |*scalar, i| { |
| 3590 | | scalar.* = try bitwiseAndScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3607 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3608 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3609 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3610 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3611 | scalar.* = try bitwiseAndScalar(lhs_elem, rhs_elem, allocator, target); |
| 3591 | 3612 | } |
| 3592 | 3613 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3593 | 3614 | } |
| ... | ... | @@ -3615,37 +3636,46 @@ pub const Value = extern union { |
| 3615 | 3636 | } |
| 3616 | 3637 | |
| 3617 | 3638 | /// operands must be (vectors of) integers; handles undefined scalars. |
| 3618 | | pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, target: Target) !Value { |
| 3639 | pub fn bitwiseNand(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Module) !Value { |
| 3619 | 3640 | if (ty.zigTypeTag() == .Vector) { |
| 3620 | 3641 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 3621 | 3642 | for (result_data) |*scalar, i| { |
| 3622 | | scalar.* = try bitwiseNandScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 3643 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3644 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3645 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3646 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3647 | scalar.* = try bitwiseNandScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, mod); |
| 3623 | 3648 | } |
| 3624 | 3649 | return Value.Tag.aggregate.create(arena, result_data); |
| 3625 | 3650 | } |
| 3626 | | return bitwiseNandScalar(lhs, rhs, ty, arena, target); |
| 3651 | return bitwiseNandScalar(lhs, rhs, ty, arena, mod); |
| 3627 | 3652 | } |
| 3628 | 3653 | |
| 3629 | 3654 | /// operands must be integers; handles undefined. |
| 3630 | | pub fn bitwiseNandScalar(lhs: Value, rhs: Value, ty: Type, arena: Allocator, target: Target) !Value { |
| 3655 | pub fn bitwiseNandScalar(lhs: Value, rhs: Value, ty: Type, arena: Allocator, mod: *Module) !Value { |
| 3631 | 3656 | if (lhs.isUndef() or rhs.isUndef()) return Value.initTag(.undef); |
| 3632 | 3657 | |
| 3633 | | const anded = try bitwiseAnd(lhs, rhs, ty, arena, target); |
| 3658 | const anded = try bitwiseAnd(lhs, rhs, ty, arena, mod); |
| 3634 | 3659 | |
| 3635 | 3660 | const all_ones = if (ty.isSignedInt()) |
| 3636 | 3661 | try Value.Tag.int_i64.create(arena, -1) |
| 3637 | 3662 | else |
| 3638 | | try ty.maxInt(arena, target); |
| 3663 | try ty.maxInt(arena, mod.getTarget()); |
| 3639 | 3664 | |
| 3640 | | return bitwiseXor(anded, all_ones, ty, arena, target); |
| 3665 | return bitwiseXor(anded, all_ones, ty, arena, mod); |
| 3641 | 3666 | } |
| 3642 | 3667 | |
| 3643 | 3668 | /// operands must be (vectors of) integers; handles undefined scalars. |
| 3644 | | pub fn bitwiseOr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3669 | pub fn bitwiseOr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3670 | const target = mod.getTarget(); |
| 3645 | 3671 | if (ty.zigTypeTag() == .Vector) { |
| 3646 | 3672 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3647 | 3673 | for (result_data) |*scalar, i| { |
| 3648 | | scalar.* = try bitwiseOrScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3674 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3675 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3676 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3677 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3678 | scalar.* = try bitwiseOrScalar(lhs_elem, rhs_elem, allocator, target); |
| 3649 | 3679 | } |
| 3650 | 3680 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3651 | 3681 | } |
| ... | ... | @@ -3672,11 +3702,16 @@ pub const Value = extern union { |
| 3672 | 3702 | } |
| 3673 | 3703 | |
| 3674 | 3704 | /// operands must be (vectors of) integers; handles undefined scalars. |
| 3675 | | pub fn bitwiseXor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3705 | pub fn bitwiseXor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3706 | const target = mod.getTarget(); |
| 3676 | 3707 | if (ty.zigTypeTag() == .Vector) { |
| 3677 | 3708 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3678 | 3709 | for (result_data) |*scalar, i| { |
| 3679 | | scalar.* = try bitwiseXorScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3710 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3711 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3712 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3713 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3714 | scalar.* = try bitwiseXorScalar(lhs_elem, rhs_elem, allocator, target); |
| 3680 | 3715 | } |
| 3681 | 3716 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3682 | 3717 | } |
| ... | ... | @@ -3703,11 +3738,16 @@ pub const Value = extern union { |
| 3703 | 3738 | return fromBigInt(arena, result_bigint.toConst()); |
| 3704 | 3739 | } |
| 3705 | 3740 | |
| 3706 | | pub fn intDiv(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3741 | pub fn intDiv(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3742 | const target = mod.getTarget(); |
| 3707 | 3743 | if (ty.zigTypeTag() == .Vector) { |
| 3708 | 3744 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3709 | 3745 | for (result_data) |*scalar, i| { |
| 3710 | | scalar.* = try intDivScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3746 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3747 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3748 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3749 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3750 | scalar.* = try intDivScalar(lhs_elem, rhs_elem, allocator, target); |
| 3711 | 3751 | } |
| 3712 | 3752 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3713 | 3753 | } |
| ... | ... | @@ -3739,11 +3779,16 @@ pub const Value = extern union { |
| 3739 | 3779 | return fromBigInt(allocator, result_q.toConst()); |
| 3740 | 3780 | } |
| 3741 | 3781 | |
| 3742 | | pub fn intDivFloor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3782 | pub fn intDivFloor(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3783 | const target = mod.getTarget(); |
| 3743 | 3784 | if (ty.zigTypeTag() == .Vector) { |
| 3744 | 3785 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3745 | 3786 | for (result_data) |*scalar, i| { |
| 3746 | | scalar.* = try intDivFloorScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3787 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3788 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3789 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3790 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3791 | scalar.* = try intDivFloorScalar(lhs_elem, rhs_elem, allocator, target); |
| 3747 | 3792 | } |
| 3748 | 3793 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3749 | 3794 | } |
| ... | ... | @@ -3775,11 +3820,16 @@ pub const Value = extern union { |
| 3775 | 3820 | return fromBigInt(allocator, result_q.toConst()); |
| 3776 | 3821 | } |
| 3777 | 3822 | |
| 3778 | | pub fn intMod(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3823 | pub fn intMod(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3824 | const target = mod.getTarget(); |
| 3779 | 3825 | if (ty.zigTypeTag() == .Vector) { |
| 3780 | 3826 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3781 | 3827 | for (result_data) |*scalar, i| { |
| 3782 | | scalar.* = try intModScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3828 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3829 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3830 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3831 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3832 | scalar.* = try intModScalar(lhs_elem, rhs_elem, allocator, target); |
| 3783 | 3833 | } |
| 3784 | 3834 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3785 | 3835 | } |
| ... | ... | @@ -3846,11 +3896,16 @@ pub const Value = extern union { |
| 3846 | 3896 | }; |
| 3847 | 3897 | } |
| 3848 | 3898 | |
| 3849 | | pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, target: Target) !Value { |
| 3899 | pub fn floatRem(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 3900 | const target = mod.getTarget(); |
| 3850 | 3901 | if (float_type.zigTypeTag() == .Vector) { |
| 3851 | 3902 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 3852 | 3903 | for (result_data) |*scalar, i| { |
| 3853 | | scalar.* = try floatRemScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 3904 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3905 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3906 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3907 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3908 | scalar.* = try floatRemScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 3854 | 3909 | } |
| 3855 | 3910 | return Value.Tag.aggregate.create(arena, result_data); |
| 3856 | 3911 | } |
| ... | ... | @@ -3888,11 +3943,16 @@ pub const Value = extern union { |
| 3888 | 3943 | } |
| 3889 | 3944 | } |
| 3890 | 3945 | |
| 3891 | | pub fn floatMod(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, target: Target) !Value { |
| 3946 | pub fn floatMod(lhs: Value, rhs: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 3947 | const target = mod.getTarget(); |
| 3892 | 3948 | if (float_type.zigTypeTag() == .Vector) { |
| 3893 | 3949 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 3894 | 3950 | for (result_data) |*scalar, i| { |
| 3895 | | scalar.* = try floatModScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 3951 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3952 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 3953 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 3954 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 3955 | scalar.* = try floatModScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 3896 | 3956 | } |
| 3897 | 3957 | return Value.Tag.aggregate.create(arena, result_data); |
| 3898 | 3958 | } |
| ... | ... | @@ -3930,11 +3990,16 @@ pub const Value = extern union { |
| 3930 | 3990 | } |
| 3931 | 3991 | } |
| 3932 | 3992 | |
| 3933 | | pub fn intMul(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 3993 | pub fn intMul(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 3994 | const target = mod.getTarget(); |
| 3934 | 3995 | if (ty.zigTypeTag() == .Vector) { |
| 3935 | 3996 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3936 | 3997 | for (result_data) |*scalar, i| { |
| 3937 | | scalar.* = try intMulScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 3998 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 3999 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4000 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4001 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4002 | scalar.* = try intMulScalar(lhs_elem, rhs_elem, allocator, target); |
| 3938 | 4003 | } |
| 3939 | 4004 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3940 | 4005 | } |
| ... | ... | @@ -3962,11 +4027,14 @@ pub const Value = extern union { |
| 3962 | 4027 | return fromBigInt(allocator, result_bigint.toConst()); |
| 3963 | 4028 | } |
| 3964 | 4029 | |
| 3965 | | pub fn intTrunc(val: Value, ty: Type, allocator: Allocator, signedness: std.builtin.Signedness, bits: u16, target: Target) !Value { |
| 4030 | pub fn intTrunc(val: Value, ty: Type, allocator: Allocator, signedness: std.builtin.Signedness, bits: u16, mod: *Module) !Value { |
| 4031 | const target = mod.getTarget(); |
| 3966 | 4032 | if (ty.zigTypeTag() == .Vector) { |
| 3967 | 4033 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3968 | 4034 | for (result_data) |*scalar, i| { |
| 3969 | | scalar.* = try intTruncScalar(val.indexVectorlike(i), allocator, signedness, bits, target); |
| 4035 | var buf: Value.ElemValueBuffer = undefined; |
| 4036 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4037 | scalar.* = try intTruncScalar(elem_val, allocator, signedness, bits, target); |
| 3970 | 4038 | } |
| 3971 | 4039 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3972 | 4040 | } |
| ... | ... | @@ -3980,12 +4048,17 @@ pub const Value = extern union { |
| 3980 | 4048 | allocator: Allocator, |
| 3981 | 4049 | signedness: std.builtin.Signedness, |
| 3982 | 4050 | bits: Value, |
| 3983 | | target: Target, |
| 4051 | mod: *Module, |
| 3984 | 4052 | ) !Value { |
| 4053 | const target = mod.getTarget(); |
| 3985 | 4054 | if (ty.zigTypeTag() == .Vector) { |
| 3986 | 4055 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 3987 | 4056 | for (result_data) |*scalar, i| { |
| 3988 | | scalar.* = try intTruncScalar(val.indexVectorlike(i), allocator, signedness, @intCast(u16, bits.indexVectorlike(i).toUnsignedInt(target)), target); |
| 4057 | var buf: Value.ElemValueBuffer = undefined; |
| 4058 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4059 | var bits_buf: Value.ElemValueBuffer = undefined; |
| 4060 | const bits_elem = bits.elemValueBuffer(mod, i, &bits_buf); |
| 4061 | scalar.* = try intTruncScalar(elem_val, allocator, signedness, @intCast(u16, bits_elem.toUnsignedInt(target)), target); |
| 3989 | 4062 | } |
| 3990 | 4063 | return Value.Tag.aggregate.create(allocator, result_data); |
| 3991 | 4064 | } |
| ... | ... | @@ -4008,11 +4081,16 @@ pub const Value = extern union { |
| 4008 | 4081 | return fromBigInt(allocator, result_bigint.toConst()); |
| 4009 | 4082 | } |
| 4010 | 4083 | |
| 4011 | | pub fn shl(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 4084 | pub fn shl(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 4085 | const target = mod.getTarget(); |
| 4012 | 4086 | if (ty.zigTypeTag() == .Vector) { |
| 4013 | 4087 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 4014 | 4088 | for (result_data) |*scalar, i| { |
| 4015 | | scalar.* = try shlScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 4089 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4090 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4091 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4092 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4093 | scalar.* = try shlScalar(lhs_elem, rhs_elem, allocator, target); |
| 4016 | 4094 | } |
| 4017 | 4095 | return Value.Tag.aggregate.create(allocator, result_data); |
| 4018 | 4096 | } |
| ... | ... | @@ -4043,13 +4121,18 @@ pub const Value = extern union { |
| 4043 | 4121 | rhs: Value, |
| 4044 | 4122 | ty: Type, |
| 4045 | 4123 | allocator: Allocator, |
| 4046 | | target: Target, |
| 4124 | mod: *Module, |
| 4047 | 4125 | ) !OverflowArithmeticResult { |
| 4126 | const target = mod.getTarget(); |
| 4048 | 4127 | if (ty.zigTypeTag() == .Vector) { |
| 4049 | 4128 | const overflowed_data = try allocator.alloc(Value, ty.vectorLen()); |
| 4050 | 4129 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 4051 | 4130 | for (result_data) |*scalar, i| { |
| 4052 | | const of_math_result = try shlWithOverflowScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), allocator, target); |
| 4131 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4132 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4133 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4134 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4135 | const of_math_result = try shlWithOverflowScalar(lhs_elem, rhs_elem, ty.scalarType(), allocator, target); |
| 4053 | 4136 | overflowed_data[i] = of_math_result.overflowed; |
| 4054 | 4137 | scalar.* = of_math_result.wrapped_result; |
| 4055 | 4138 | } |
| ... | ... | @@ -4097,12 +4180,17 @@ pub const Value = extern union { |
| 4097 | 4180 | rhs: Value, |
| 4098 | 4181 | ty: Type, |
| 4099 | 4182 | arena: Allocator, |
| 4100 | | target: Target, |
| 4183 | mod: *Module, |
| 4101 | 4184 | ) !Value { |
| 4185 | const target = mod.getTarget(); |
| 4102 | 4186 | if (ty.zigTypeTag() == .Vector) { |
| 4103 | 4187 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 4104 | 4188 | for (result_data) |*scalar, i| { |
| 4105 | | scalar.* = try shlSatScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 4189 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4190 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4191 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4192 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4193 | scalar.* = try shlSatScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, target); |
| 4106 | 4194 | } |
| 4107 | 4195 | return Value.Tag.aggregate.create(arena, result_data); |
| 4108 | 4196 | } |
| ... | ... | @@ -4141,16 +4229,20 @@ pub const Value = extern union { |
| 4141 | 4229 | rhs: Value, |
| 4142 | 4230 | ty: Type, |
| 4143 | 4231 | arena: Allocator, |
| 4144 | | target: Target, |
| 4232 | mod: *Module, |
| 4145 | 4233 | ) !Value { |
| 4146 | 4234 | if (ty.zigTypeTag() == .Vector) { |
| 4147 | 4235 | const result_data = try arena.alloc(Value, ty.vectorLen()); |
| 4148 | 4236 | for (result_data) |*scalar, i| { |
| 4149 | | scalar.* = try shlTruncScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), ty.scalarType(), arena, target); |
| 4237 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4238 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4239 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4240 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4241 | scalar.* = try shlTruncScalar(lhs_elem, rhs_elem, ty.scalarType(), arena, mod); |
| 4150 | 4242 | } |
| 4151 | 4243 | return Value.Tag.aggregate.create(arena, result_data); |
| 4152 | 4244 | } |
| 4153 | | return shlTruncScalar(lhs, rhs, ty, arena, target); |
| 4245 | return shlTruncScalar(lhs, rhs, ty, arena, mod); |
| 4154 | 4246 | } |
| 4155 | 4247 | |
| 4156 | 4248 | pub fn shlTruncScalar( |
| ... | ... | @@ -4158,19 +4250,24 @@ pub const Value = extern union { |
| 4158 | 4250 | rhs: Value, |
| 4159 | 4251 | ty: Type, |
| 4160 | 4252 | arena: Allocator, |
| 4161 | | target: Target, |
| 4253 | mod: *Module, |
| 4162 | 4254 | ) !Value { |
| 4163 | | const shifted = try lhs.shl(rhs, ty, arena, target); |
| 4164 | | const int_info = ty.intInfo(target); |
| 4165 | | const truncated = try shifted.intTrunc(ty, arena, int_info.signedness, int_info.bits, target); |
| 4255 | const shifted = try lhs.shl(rhs, ty, arena, mod); |
| 4256 | const int_info = ty.intInfo(mod.getTarget()); |
| 4257 | const truncated = try shifted.intTrunc(ty, arena, int_info.signedness, int_info.bits, mod); |
| 4166 | 4258 | return truncated; |
| 4167 | 4259 | } |
| 4168 | 4260 | |
| 4169 | | pub fn shr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, target: Target) !Value { |
| 4261 | pub fn shr(lhs: Value, rhs: Value, ty: Type, allocator: Allocator, mod: *Module) !Value { |
| 4262 | const target = mod.getTarget(); |
| 4170 | 4263 | if (ty.zigTypeTag() == .Vector) { |
| 4171 | 4264 | const result_data = try allocator.alloc(Value, ty.vectorLen()); |
| 4172 | 4265 | for (result_data) |*scalar, i| { |
| 4173 | | scalar.* = try shrScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), allocator, target); |
| 4266 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4267 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4268 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4269 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4270 | scalar.* = try shrScalar(lhs_elem, rhs_elem, allocator, target); |
| 4174 | 4271 | } |
| 4175 | 4272 | return Value.Tag.aggregate.create(allocator, result_data); |
| 4176 | 4273 | } |
| ... | ... | @@ -4212,12 +4309,15 @@ pub const Value = extern union { |
| 4212 | 4309 | val: Value, |
| 4213 | 4310 | float_type: Type, |
| 4214 | 4311 | arena: Allocator, |
| 4215 | | target: Target, |
| 4312 | mod: *Module, |
| 4216 | 4313 | ) !Value { |
| 4314 | const target = mod.getTarget(); |
| 4217 | 4315 | if (float_type.zigTypeTag() == .Vector) { |
| 4218 | 4316 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4219 | 4317 | for (result_data) |*scalar, i| { |
| 4220 | | scalar.* = try floatNegScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4318 | var buf: Value.ElemValueBuffer = undefined; |
| 4319 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4320 | scalar.* = try floatNegScalar(elem_val, float_type.scalarType(), arena, target); |
| 4221 | 4321 | } |
| 4222 | 4322 | return Value.Tag.aggregate.create(arena, result_data); |
| 4223 | 4323 | } |
| ... | ... | @@ -4245,12 +4345,17 @@ pub const Value = extern union { |
| 4245 | 4345 | rhs: Value, |
| 4246 | 4346 | float_type: Type, |
| 4247 | 4347 | arena: Allocator, |
| 4248 | | target: Target, |
| 4348 | mod: *Module, |
| 4249 | 4349 | ) !Value { |
| 4350 | const target = mod.getTarget(); |
| 4250 | 4351 | if (float_type.zigTypeTag() == .Vector) { |
| 4251 | 4352 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4252 | 4353 | for (result_data) |*scalar, i| { |
| 4253 | | scalar.* = try floatDivScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4354 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4355 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4356 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4357 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4358 | scalar.* = try floatDivScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 4254 | 4359 | } |
| 4255 | 4360 | return Value.Tag.aggregate.create(arena, result_data); |
| 4256 | 4361 | } |
| ... | ... | @@ -4299,12 +4404,17 @@ pub const Value = extern union { |
| 4299 | 4404 | rhs: Value, |
| 4300 | 4405 | float_type: Type, |
| 4301 | 4406 | arena: Allocator, |
| 4302 | | target: Target, |
| 4407 | mod: *Module, |
| 4303 | 4408 | ) !Value { |
| 4409 | const target = mod.getTarget(); |
| 4304 | 4410 | if (float_type.zigTypeTag() == .Vector) { |
| 4305 | 4411 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4306 | 4412 | for (result_data) |*scalar, i| { |
| 4307 | | scalar.* = try floatDivFloorScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4413 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4414 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4415 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4416 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4417 | scalar.* = try floatDivFloorScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 4308 | 4418 | } |
| 4309 | 4419 | return Value.Tag.aggregate.create(arena, result_data); |
| 4310 | 4420 | } |
| ... | ... | @@ -4353,12 +4463,17 @@ pub const Value = extern union { |
| 4353 | 4463 | rhs: Value, |
| 4354 | 4464 | float_type: Type, |
| 4355 | 4465 | arena: Allocator, |
| 4356 | | target: Target, |
| 4466 | mod: *Module, |
| 4357 | 4467 | ) !Value { |
| 4468 | const target = mod.getTarget(); |
| 4358 | 4469 | if (float_type.zigTypeTag() == .Vector) { |
| 4359 | 4470 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4360 | 4471 | for (result_data) |*scalar, i| { |
| 4361 | | scalar.* = try floatDivTruncScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4472 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4473 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4474 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4475 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4476 | scalar.* = try floatDivTruncScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 4362 | 4477 | } |
| 4363 | 4478 | return Value.Tag.aggregate.create(arena, result_data); |
| 4364 | 4479 | } |
| ... | ... | @@ -4407,12 +4522,17 @@ pub const Value = extern union { |
| 4407 | 4522 | rhs: Value, |
| 4408 | 4523 | float_type: Type, |
| 4409 | 4524 | arena: Allocator, |
| 4410 | | target: Target, |
| 4525 | mod: *Module, |
| 4411 | 4526 | ) !Value { |
| 4527 | const target = mod.getTarget(); |
| 4412 | 4528 | if (float_type.zigTypeTag() == .Vector) { |
| 4413 | 4529 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4414 | 4530 | for (result_data) |*scalar, i| { |
| 4415 | | scalar.* = try floatMulScalar(lhs.indexVectorlike(i), rhs.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4531 | var lhs_buf: Value.ElemValueBuffer = undefined; |
| 4532 | var rhs_buf: Value.ElemValueBuffer = undefined; |
| 4533 | const lhs_elem = lhs.elemValueBuffer(mod, i, &lhs_buf); |
| 4534 | const rhs_elem = rhs.elemValueBuffer(mod, i, &rhs_buf); |
| 4535 | scalar.* = try floatMulScalar(lhs_elem, rhs_elem, float_type.scalarType(), arena, target); |
| 4416 | 4536 | } |
| 4417 | 4537 | return Value.Tag.aggregate.create(arena, result_data); |
| 4418 | 4538 | } |
| ... | ... | @@ -4456,11 +4576,14 @@ pub const Value = extern union { |
| 4456 | 4576 | } |
| 4457 | 4577 | } |
| 4458 | 4578 | |
| 4459 | | pub fn sqrt(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4579 | pub fn sqrt(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4580 | const target = mod.getTarget(); |
| 4460 | 4581 | if (float_type.zigTypeTag() == .Vector) { |
| 4461 | 4582 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4462 | 4583 | for (result_data) |*scalar, i| { |
| 4463 | | scalar.* = try sqrtScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4584 | var buf: Value.ElemValueBuffer = undefined; |
| 4585 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4586 | scalar.* = try sqrtScalar(elem_val, float_type.scalarType(), arena, target); |
| 4464 | 4587 | } |
| 4465 | 4588 | return Value.Tag.aggregate.create(arena, result_data); |
| 4466 | 4589 | } |
| ... | ... | @@ -4493,11 +4616,14 @@ pub const Value = extern union { |
| 4493 | 4616 | } |
| 4494 | 4617 | } |
| 4495 | 4618 | |
| 4496 | | pub fn sin(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4619 | pub fn sin(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4620 | const target = mod.getTarget(); |
| 4497 | 4621 | if (float_type.zigTypeTag() == .Vector) { |
| 4498 | 4622 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4499 | 4623 | for (result_data) |*scalar, i| { |
| 4500 | | scalar.* = try sinScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4624 | var buf: Value.ElemValueBuffer = undefined; |
| 4625 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4626 | scalar.* = try sinScalar(elem_val, float_type.scalarType(), arena, target); |
| 4501 | 4627 | } |
| 4502 | 4628 | return Value.Tag.aggregate.create(arena, result_data); |
| 4503 | 4629 | } |
| ... | ... | @@ -4530,11 +4656,14 @@ pub const Value = extern union { |
| 4530 | 4656 | } |
| 4531 | 4657 | } |
| 4532 | 4658 | |
| 4533 | | pub fn cos(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4659 | pub fn cos(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4660 | const target = mod.getTarget(); |
| 4534 | 4661 | if (float_type.zigTypeTag() == .Vector) { |
| 4535 | 4662 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4536 | 4663 | for (result_data) |*scalar, i| { |
| 4537 | | scalar.* = try cosScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4664 | var buf: Value.ElemValueBuffer = undefined; |
| 4665 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4666 | scalar.* = try cosScalar(elem_val, float_type.scalarType(), arena, target); |
| 4538 | 4667 | } |
| 4539 | 4668 | return Value.Tag.aggregate.create(arena, result_data); |
| 4540 | 4669 | } |
| ... | ... | @@ -4567,11 +4696,14 @@ pub const Value = extern union { |
| 4567 | 4696 | } |
| 4568 | 4697 | } |
| 4569 | 4698 | |
| 4570 | | pub fn tan(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4699 | pub fn tan(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4700 | const target = mod.getTarget(); |
| 4571 | 4701 | if (float_type.zigTypeTag() == .Vector) { |
| 4572 | 4702 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4573 | 4703 | for (result_data) |*scalar, i| { |
| 4574 | | scalar.* = try tanScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4704 | var buf: Value.ElemValueBuffer = undefined; |
| 4705 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4706 | scalar.* = try tanScalar(elem_val, float_type.scalarType(), arena, target); |
| 4575 | 4707 | } |
| 4576 | 4708 | return Value.Tag.aggregate.create(arena, result_data); |
| 4577 | 4709 | } |
| ... | ... | @@ -4604,11 +4736,14 @@ pub const Value = extern union { |
| 4604 | 4736 | } |
| 4605 | 4737 | } |
| 4606 | 4738 | |
| 4607 | | pub fn exp(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4739 | pub fn exp(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4740 | const target = mod.getTarget(); |
| 4608 | 4741 | if (float_type.zigTypeTag() == .Vector) { |
| 4609 | 4742 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4610 | 4743 | for (result_data) |*scalar, i| { |
| 4611 | | scalar.* = try expScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4744 | var buf: Value.ElemValueBuffer = undefined; |
| 4745 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4746 | scalar.* = try expScalar(elem_val, float_type.scalarType(), arena, target); |
| 4612 | 4747 | } |
| 4613 | 4748 | return Value.Tag.aggregate.create(arena, result_data); |
| 4614 | 4749 | } |
| ... | ... | @@ -4641,11 +4776,14 @@ pub const Value = extern union { |
| 4641 | 4776 | } |
| 4642 | 4777 | } |
| 4643 | 4778 | |
| 4644 | | pub fn exp2(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4779 | pub fn exp2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4780 | const target = mod.getTarget(); |
| 4645 | 4781 | if (float_type.zigTypeTag() == .Vector) { |
| 4646 | 4782 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4647 | 4783 | for (result_data) |*scalar, i| { |
| 4648 | | scalar.* = try exp2Scalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4784 | var buf: Value.ElemValueBuffer = undefined; |
| 4785 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4786 | scalar.* = try exp2Scalar(elem_val, float_type.scalarType(), arena, target); |
| 4649 | 4787 | } |
| 4650 | 4788 | return Value.Tag.aggregate.create(arena, result_data); |
| 4651 | 4789 | } |
| ... | ... | @@ -4678,11 +4816,14 @@ pub const Value = extern union { |
| 4678 | 4816 | } |
| 4679 | 4817 | } |
| 4680 | 4818 | |
| 4681 | | pub fn log(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4819 | pub fn log(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4820 | const target = mod.getTarget(); |
| 4682 | 4821 | if (float_type.zigTypeTag() == .Vector) { |
| 4683 | 4822 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4684 | 4823 | for (result_data) |*scalar, i| { |
| 4685 | | scalar.* = try logScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4824 | var buf: Value.ElemValueBuffer = undefined; |
| 4825 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4826 | scalar.* = try logScalar(elem_val, float_type.scalarType(), arena, target); |
| 4686 | 4827 | } |
| 4687 | 4828 | return Value.Tag.aggregate.create(arena, result_data); |
| 4688 | 4829 | } |
| ... | ... | @@ -4715,11 +4856,14 @@ pub const Value = extern union { |
| 4715 | 4856 | } |
| 4716 | 4857 | } |
| 4717 | 4858 | |
| 4718 | | pub fn log2(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4859 | pub fn log2(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4860 | const target = mod.getTarget(); |
| 4719 | 4861 | if (float_type.zigTypeTag() == .Vector) { |
| 4720 | 4862 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4721 | 4863 | for (result_data) |*scalar, i| { |
| 4722 | | scalar.* = try log2Scalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4864 | var buf: Value.ElemValueBuffer = undefined; |
| 4865 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4866 | scalar.* = try log2Scalar(elem_val, float_type.scalarType(), arena, target); |
| 4723 | 4867 | } |
| 4724 | 4868 | return Value.Tag.aggregate.create(arena, result_data); |
| 4725 | 4869 | } |
| ... | ... | @@ -4752,11 +4896,14 @@ pub const Value = extern union { |
| 4752 | 4896 | } |
| 4753 | 4897 | } |
| 4754 | 4898 | |
| 4755 | | pub fn log10(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4899 | pub fn log10(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4900 | const target = mod.getTarget(); |
| 4756 | 4901 | if (float_type.zigTypeTag() == .Vector) { |
| 4757 | 4902 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4758 | 4903 | for (result_data) |*scalar, i| { |
| 4759 | | scalar.* = try log10Scalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4904 | var buf: Value.ElemValueBuffer = undefined; |
| 4905 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4906 | scalar.* = try log10Scalar(elem_val, float_type.scalarType(), arena, target); |
| 4760 | 4907 | } |
| 4761 | 4908 | return Value.Tag.aggregate.create(arena, result_data); |
| 4762 | 4909 | } |
| ... | ... | @@ -4789,11 +4936,14 @@ pub const Value = extern union { |
| 4789 | 4936 | } |
| 4790 | 4937 | } |
| 4791 | 4938 | |
| 4792 | | pub fn fabs(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4939 | pub fn fabs(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4940 | const target = mod.getTarget(); |
| 4793 | 4941 | if (float_type.zigTypeTag() == .Vector) { |
| 4794 | 4942 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4795 | 4943 | for (result_data) |*scalar, i| { |
| 4796 | | scalar.* = try fabsScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4944 | var buf: Value.ElemValueBuffer = undefined; |
| 4945 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4946 | scalar.* = try fabsScalar(elem_val, float_type.scalarType(), arena, target); |
| 4797 | 4947 | } |
| 4798 | 4948 | return Value.Tag.aggregate.create(arena, result_data); |
| 4799 | 4949 | } |
| ... | ... | @@ -4826,11 +4976,14 @@ pub const Value = extern union { |
| 4826 | 4976 | } |
| 4827 | 4977 | } |
| 4828 | 4978 | |
| 4829 | | pub fn floor(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 4979 | pub fn floor(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 4980 | const target = mod.getTarget(); |
| 4830 | 4981 | if (float_type.zigTypeTag() == .Vector) { |
| 4831 | 4982 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4832 | 4983 | for (result_data) |*scalar, i| { |
| 4833 | | scalar.* = try floorScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 4984 | var buf: Value.ElemValueBuffer = undefined; |
| 4985 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 4986 | scalar.* = try floorScalar(elem_val, float_type.scalarType(), arena, target); |
| 4834 | 4987 | } |
| 4835 | 4988 | return Value.Tag.aggregate.create(arena, result_data); |
| 4836 | 4989 | } |
| ... | ... | @@ -4863,11 +5016,14 @@ pub const Value = extern union { |
| 4863 | 5016 | } |
| 4864 | 5017 | } |
| 4865 | 5018 | |
| 4866 | | pub fn ceil(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 5019 | pub fn ceil(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 5020 | const target = mod.getTarget(); |
| 4867 | 5021 | if (float_type.zigTypeTag() == .Vector) { |
| 4868 | 5022 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4869 | 5023 | for (result_data) |*scalar, i| { |
| 4870 | | scalar.* = try ceilScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 5024 | var buf: Value.ElemValueBuffer = undefined; |
| 5025 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 5026 | scalar.* = try ceilScalar(elem_val, float_type.scalarType(), arena, target); |
| 4871 | 5027 | } |
| 4872 | 5028 | return Value.Tag.aggregate.create(arena, result_data); |
| 4873 | 5029 | } |
| ... | ... | @@ -4900,11 +5056,14 @@ pub const Value = extern union { |
| 4900 | 5056 | } |
| 4901 | 5057 | } |
| 4902 | 5058 | |
| 4903 | | pub fn round(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 5059 | pub fn round(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 5060 | const target = mod.getTarget(); |
| 4904 | 5061 | if (float_type.zigTypeTag() == .Vector) { |
| 4905 | 5062 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4906 | 5063 | for (result_data) |*scalar, i| { |
| 4907 | | scalar.* = try roundScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 5064 | var buf: Value.ElemValueBuffer = undefined; |
| 5065 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 5066 | scalar.* = try roundScalar(elem_val, float_type.scalarType(), arena, target); |
| 4908 | 5067 | } |
| 4909 | 5068 | return Value.Tag.aggregate.create(arena, result_data); |
| 4910 | 5069 | } |
| ... | ... | @@ -4937,11 +5096,14 @@ pub const Value = extern union { |
| 4937 | 5096 | } |
| 4938 | 5097 | } |
| 4939 | 5098 | |
| 4940 | | pub fn trunc(val: Value, float_type: Type, arena: Allocator, target: Target) Allocator.Error!Value { |
| 5099 | pub fn trunc(val: Value, float_type: Type, arena: Allocator, mod: *Module) !Value { |
| 5100 | const target = mod.getTarget(); |
| 4941 | 5101 | if (float_type.zigTypeTag() == .Vector) { |
| 4942 | 5102 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4943 | 5103 | for (result_data) |*scalar, i| { |
| 4944 | | scalar.* = try truncScalar(val.indexVectorlike(i), float_type.scalarType(), arena, target); |
| 5104 | var buf: Value.ElemValueBuffer = undefined; |
| 5105 | const elem_val = val.elemValueBuffer(mod, i, &buf); |
| 5106 | scalar.* = try truncScalar(elem_val, float_type.scalarType(), arena, target); |
| 4945 | 5107 | } |
| 4946 | 5108 | return Value.Tag.aggregate.create(arena, result_data); |
| 4947 | 5109 | } |
| ... | ... | @@ -4980,16 +5142,23 @@ pub const Value = extern union { |
| 4980 | 5142 | mulend2: Value, |
| 4981 | 5143 | addend: Value, |
| 4982 | 5144 | arena: Allocator, |
| 4983 | | target: Target, |
| 4984 | | ) Allocator.Error!Value { |
| 5145 | mod: *Module, |
| 5146 | ) !Value { |
| 5147 | const target = mod.getTarget(); |
| 4985 | 5148 | if (float_type.zigTypeTag() == .Vector) { |
| 4986 | 5149 | const result_data = try arena.alloc(Value, float_type.vectorLen()); |
| 4987 | 5150 | for (result_data) |*scalar, i| { |
| 5151 | var mulend1_buf: Value.ElemValueBuffer = undefined; |
| 5152 | const mulend1_elem = mulend1.elemValueBuffer(mod, i, &mulend1_buf); |
| 5153 | var mulend2_buf: Value.ElemValueBuffer = undefined; |
| 5154 | const mulend2_elem = mulend2.elemValueBuffer(mod, i, &mulend2_buf); |
| 5155 | var addend_buf: Value.ElemValueBuffer = undefined; |
| 5156 | const addend_elem = addend.elemValueBuffer(mod, i, &addend_buf); |
| 4988 | 5157 | scalar.* = try mulAddScalar( |
| 4989 | 5158 | float_type.scalarType(), |
| 4990 | | mulend1.indexVectorlike(i), |
| 4991 | | mulend2.indexVectorlike(i), |
| 4992 | | addend.indexVectorlike(i), |
| 5159 | mulend1_elem, |
| 5160 | mulend2_elem, |
| 5161 | addend_elem, |
| 4993 | 5162 | arena, |
| 4994 | 5163 | target, |
| 4995 | 5164 | ); |