| ... | ... | @@ -393,9 +393,39 @@ fn comptimeAdd(comptime a: comptime_int, comptime b: comptime_int) comptime_int |
| 393 | 393 | return a + b; |
| 394 | 394 | } |
| 395 | 395 | |
| 396 | fn not(comptime T: type, a: T) T { |
| 397 | return ~a; |
| 398 | } |
| 399 | |
| 396 | 400 | test "binary not" { |
| 397 | 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 | 429 | try expect(comptime x: { |
| 400 | 430 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; |
| 401 | 431 | }); |
| ... | ... | @@ -405,34 +435,40 @@ test "binary not" { |
| 405 | 435 | try expect(comptime x: { |
| 406 | 436 | break :x ~@as(u0, 0) == 0; |
| 407 | 437 | }); |
| 408 | | try testBinaryNot(0b1010101010101010); |
| 409 | 438 | } |
| 410 | 439 | |
| 411 | | fn testBinaryNot(x: u16) !void { |
| 412 | | try expect(~x == 0b0101010101010101); |
| 413 | | } |
| 414 | | |
| 415 | | test "binary not 128-bit" { |
| 416 | | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 440 | test "binary not big int <= 128 bits" { |
| 417 | 441 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 418 | 442 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO |
| 419 | 443 | if (builtin.zig_backend == .stage2_sparc64) return error.SkipZigTest; // TODO |
| 420 | 444 | if (builtin.zig_backend == .stage2_spirv64) return error.SkipZigTest; |
| 421 | 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 | 466 | try expect(comptime x: { |
| 424 | 467 | break :x ~@as(u128, 0x55555555_55555555_55555555_55555555) == 0xaaaaaaaa_aaaaaaaa_aaaaaaaa_aaaaaaaa; |
| 425 | 468 | }); |
| 426 | 469 | try expect(comptime x: { |
| 427 | 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 | 474 | test "division" { |