| ... | @@ -393,9 +393,39 @@ fn comptimeAdd(comptime a: comptime_int, comptime b: comptime_int) comptime_int | ... | @@ -393,9 +393,39 @@ fn comptimeAdd(comptime a: comptime_int, comptime b: comptime_int) comptime_int |
| 393 | return a + b; | 393 | return a + b; |
| 394 | } | 394 | } |
| 395 | | 395 | |
| | 396 | fn not(comptime T: type, a: T) T { |
| | 397 | return ~a; |
| | 398 | } |
| | 399 | |
| 396 | test "binary not" { | 400 | test "binary not" { |
| 397 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | 401 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 398 | | 402 | |
| | 403 | try expect(not(u0, 0) == 0); |
| | 404 | try expect(not(u1, 0) == 1); |
| | 405 | try expect(not(u1, 1) == 0); |
| | 406 | try expect(not(u5, 0b01001) == 0b10110); |
| | 407 | try expect(not(u5, 0b10110) == 0b01001); |
| | 408 | try expect(not(u16, 0b10101010_10101010) == 0b01010101_01010101); |
| | 409 | try expect(not(u16, 0b01010101_01010101) == 0b10101010_10101010); |
| | 410 | try expect(not(u32, 0xAAAA_3333) == 0x5555_CCCC); |
| | 411 | try expect(not(u32, 0x5555_CCCC) == 0xAAAA_3333); |
| | 412 | try expect(not(u35, 0x4_1111_FFFF) == 0x3_EEEE_0000); |
| | 413 | try expect(not(u35, 0x3_EEEE_0000) == 0x4_1111_FFFF); |
| | 414 | try expect(not(u48, 0x4567_89AB_CDEF) == 0xBA98_7654_3210); |
| | 415 | try expect(not(u48, 0xBA98_7654_3210) == 0x4567_89AB_CDEF); |
| | 416 | try expect(not(u64, 0x0123_4567_89AB_CDEF) == 0xFEDC_BA98_7654_3210); |
| | 417 | try expect(not(u64, 0xFEDC_BA98_7654_3210) == 0x0123_4567_89AB_CDEF); |
| | 418 | |
| | 419 | try expect(not(i0, 0) == 0); |
| | 420 | try expect(not(i1, 0) == -1); |
| | 421 | try expect(not(i1, -1) == 0); |
| | 422 | try expect(not(i5, -2) == 1); |
| | 423 | try expect(not(i5, 3) == -4); |
| | 424 | try expect(not(i32, 0) == -1); |
| | 425 | try expect(not(i32, -2147483648) == 2147483647); |
| | 426 | try expect(not(i64, -1) == 0); |
| | 427 | try expect(not(i64, 0) == -1); |
| | 428 | |
| 399 | try expect(comptime x: { | 429 | try expect(comptime x: { |
| 400 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; | 430 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; |
| 401 | }); | 431 | }); |
| ... | @@ -405,34 +435,40 @@ test "binary not" { | ... | @@ -405,34 +435,40 @@ test "binary not" { |
| 405 | try expect(comptime x: { | 435 | try expect(comptime x: { |
| 406 | break :x ~@as(u0, 0) == 0; | 436 | break :x ~@as(u0, 0) == 0; |
| 407 | }); | 437 | }); |
| 408 | try testBinaryNot(0b1010101010101010); | | |
| 409 | } | 438 | } |
| 410 | | 439 | |
| 411 | fn testBinaryNot(x: u16) !void { | 440 | test "binary not big int <= 128 bits" { |
| 412 | try expect(~x == 0b0101010101010101); | | |
| 413 | } | | |
| 414 | | | |
| 415 | test "binary not 128-bit" { | | |
| 416 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | | |
| 417 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 441 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 418 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | 442 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 419 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO | 443 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 420 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; | 444 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 421 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; | 445 | if (builtin.zig_backend == .stage2_riscv64) return error.SkipZigTest; |
| 422 | | 446 | |
| | 447 | try expect(not(u65, 1) == 0x1_FFFFFFFF_FFFFFFFE); |
| | 448 | try expect(not(u65, 0x1_FFFFFFFF_FFFFFFFE) == 1); |
| | 449 | |
| | 450 | try expect(not(u96, 0x01234567_89ABCDEF_00000001) == 0xFEDCBA98_76543210_FFFFFFFE); |
| | 451 | try expect(not(u96, 0xFEDCBA98_76543210_FFFFFFFE) == 0x01234567_89ABCDEF_00000001); |
| | 452 | |
| | 453 | try expect(not(u128, 0xAAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA) == 0x55555555_55555555_55555555_55555555); |
| | 454 | try expect(not(u128, 0x55555555_55555555_55555555_55555555) == 0xAAAAAAAA_AAAAAAAA_AAAAAAAA_AAAAAAAA); |
| | 455 | |
| | 456 | try expect(not(i65, -1) == 0); |
| | 457 | try expect(not(i65, 0) == -1); |
| | 458 | try expect(not(i65, -18446744073709551616) == 18446744073709551615); |
| | 459 | try expect(not(i65, 18446744073709551615) == -18446744073709551616); |
| | 460 | |
| | 461 | try expect(not(i128, -1) == 0); |
| | 462 | try expect(not(i128, 0) == -1); |
| | 463 | try expect(not(i128, -200) == 199); |
| | 464 | try expect(not(i128, 199) == -200); |
| | 465 | |
| 423 | try expect(comptime x: { | 466 | try expect(comptime x: { |
| 424 | break :x ~@as(u128, 0x55555555_55555555_55555555_55555555) == 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa; | 467 | break :x ~@as(u128, 0x55555555_55555555_55555555_55555555) == 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa; |
| 425 | }); | 468 | }); |
| 426 | try expect(comptime x: { | 469 | try expect(comptime x: { |
| 427 | break :x ~@as(i128, 0x55555555_55555555_55555555_55555555) == @as(i128, @bitCast(@as(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa))); | 470 | break :x ~@as(i128, 0x55555555_55555555_55555555_55555555) == @as(i128, @bitCast(@as(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa))); |
| 428 | }); | 471 | }); |
| 429 | | | |
| 430 | try testBinaryNot128(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa); | | |
| 431 | try testBinaryNot128(i128, @as(i128, @bitCast(@as(u128, 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa)))); | | |
| 432 | } | | |
| 433 | | | |
| 434 | fn testBinaryNot128(comptime Type: type, x: Type) !void { | | |
| 435 | try expect(~x == @as(Type, 0x55555555_55555555_55555555_55555555)); | | |
| 436 | } | 472 | } |
| 437 | | 473 | |
| 438 | test "division" { | 474 | test "division" { |