| author | |
| committer | |
| log | 3c3826bf93f7cbd88ecc30b43afac12cde313ffa |
| tree | 617ffc8f30d7750aad90ddbafcf2e33580a2a02d |
| parent | 87779cfd93fdcb525f386d693a099e4188a3fc44 |
| parent | dcc1de12b097db4971b85cfc0b4e18fec2c8b2c4 |
| signature |
stage2 ARM: misc improvements23 files changed, 189 insertions(+), 143 deletions(-)
src/arch/arm/CodeGen.zig+180-102| ... | ... | @@ -530,13 +530,13 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 530 | 530 | switch (air_tags[inst]) { |
| 531 | 531 | // zig fmt: off |
| 532 | 532 | .add, .ptr_add => try self.airBinOp(inst), |
| 533 | .addwrap => try self.airAddWrap(inst), | |
| 533 | .addwrap => try self.airBinOp(inst), | |
| 534 | 534 | .add_sat => try self.airAddSat(inst), |
| 535 | 535 | .sub, .ptr_sub => try self.airBinOp(inst), |
| 536 | .subwrap => try self.airSubWrap(inst), | |
| 536 | .subwrap => try self.airBinOp(inst), | |
| 537 | 537 | .sub_sat => try self.airSubSat(inst), |
| 538 | 538 | .mul => try self.airBinOp(inst), |
| 539 | .mulwrap => try self.airMulWrap(inst), | |
| 539 | .mulwrap => try self.airBinOp(inst), | |
| 540 | 540 | .mul_sat => try self.airMulSat(inst), |
| 541 | 541 | .rem => try self.airRem(inst), |
| 542 | 542 | .mod => try self.airMod(inst), |
| ... | ... | @@ -939,63 +939,85 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { |
| 939 | 939 | // return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| 940 | 940 | } |
| 941 | 941 | |
| 942 | fn airTrunc(self: *Self, inst: Air.Inst.Index) !void { | |
| 943 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | |
| 944 | if (self.liveness.isUnused(inst)) | |
| 945 | return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none }); | |
| 942 | fn truncRegister( | |
| 943 | self: *Self, | |
| 944 | operand_reg: Register, | |
| 945 | dest_reg: Register, | |
| 946 | int_signedness: std.builtin.Signedness, | |
| 947 | int_bits: u16, | |
| 948 | ) !void { | |
| 949 | // TODO check if sxtb/uxtb/sxth/uxth are more efficient | |
| 950 | _ = try self.addInst(.{ | |
| 951 | .tag = switch (int_signedness) { | |
| 952 | .signed => .sbfx, | |
| 953 | .unsigned => .ubfx, | |
| 954 | }, | |
| 955 | .data = .{ .rr_lsb_width = .{ | |
| 956 | .rd = dest_reg, | |
| 957 | .rn = operand_reg, | |
| 958 | .lsb = 0, | |
| 959 | .width = @intCast(u6, int_bits), | |
| 960 | } }, | |
| 961 | }); | |
| 962 | } | |
| 946 | 963 | |
| 947 | const operand_ty = self.air.typeOf(ty_op.operand); | |
| 948 | const operand = try self.resolveInst(ty_op.operand); | |
| 964 | fn trunc( | |
| 965 | self: *Self, | |
| 966 | maybe_inst: ?Air.Inst.Index, | |
| 967 | operand: MCValue, | |
| 968 | operand_ty: Type, | |
| 969 | dest_ty: Type, | |
| 970 | ) !MCValue { | |
| 949 | 971 | const info_a = operand_ty.intInfo(self.target.*); |
| 950 | const info_b = self.air.typeOfIndex(inst).intInfo(self.target.*); | |
| 951 | ||
| 952 | const result: MCValue = blk: { | |
| 953 | if (info_b.bits <= 32) { | |
| 954 | const operand_reg = switch (operand) { | |
| 955 | .register => |r| r, | |
| 956 | else => operand_reg: { | |
| 957 | if (info_a.bits <= 32) { | |
| 958 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand); | |
| 959 | } else { | |
| 960 | return self.fail("TODO load least significant word into register", .{}); | |
| 961 | } | |
| 962 | }, | |
| 963 | }; | |
| 964 | self.register_manager.freezeRegs(&.{operand_reg}); | |
| 965 | defer self.register_manager.unfreezeRegs(&.{operand_reg}); | |
| 966 | ||
| 967 | const dest_reg = dest_reg: { | |
| 968 | if (operand == .register and self.reuseOperand(inst, ty_op.operand, 0, operand)) { | |
| 969 | break :dest_reg operand_reg; | |
| 972 | const info_b = dest_ty.intInfo(self.target.*); | |
| 973 | ||
| 974 | if (info_b.bits <= 32) { | |
| 975 | const operand_reg = switch (operand) { | |
| 976 | .register => |r| r, | |
| 977 | else => operand_reg: { | |
| 978 | if (info_a.bits <= 32) { | |
| 979 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand); | |
| 980 | } else { | |
| 981 | return self.fail("TODO load least significant word into register", .{}); | |
| 970 | 982 | } |
| 983 | }, | |
| 984 | }; | |
| 985 | self.register_manager.freezeRegs(&.{operand_reg}); | |
| 986 | defer self.register_manager.unfreezeRegs(&.{operand_reg}); | |
| 971 | 987 | |
| 972 | break :dest_reg try self.register_manager.allocReg(null); | |
| 973 | }; | |
| 988 | const dest_reg = if (maybe_inst) |inst| blk: { | |
| 989 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | |
| 974 | 990 | |
| 975 | switch (info_b.bits) { | |
| 976 | 32 => { | |
| 977 | try self.genSetReg(operand_ty, dest_reg, .{ .register = operand_reg }); | |
| 978 | break :blk MCValue{ .register = dest_reg }; | |
| 979 | }, | |
| 980 | else => { | |
| 981 | _ = try self.addInst(.{ | |
| 982 | .tag = switch (info_b.signedness) { | |
| 983 | .signed => .sbfx, | |
| 984 | .unsigned => .ubfx, | |
| 985 | }, | |
| 986 | .data = .{ .rr_lsb_width = .{ | |
| 987 | .rd = dest_reg, | |
| 988 | .rn = operand_reg, | |
| 989 | .lsb = 0, | |
| 990 | .width = @intCast(u6, info_b.bits), | |
| 991 | } }, | |
| 992 | }); | |
| 993 | break :blk MCValue{ .register = dest_reg }; | |
| 994 | }, | |
| 991 | if (operand == .register and self.reuseOperand(inst, ty_op.operand, 0, operand)) { | |
| 992 | break :blk operand_reg; | |
| 993 | } else { | |
| 994 | break :blk try self.register_manager.allocReg(inst); | |
| 995 | 995 | } |
| 996 | } else { | |
| 997 | return self.fail("TODO: truncate to ints > 32 bits", .{}); | |
| 996 | } else try self.register_manager.allocReg(null); | |
| 997 | ||
| 998 | switch (info_b.bits) { | |
| 999 | 32 => { | |
| 1000 | try self.genSetReg(operand_ty, dest_reg, .{ .register = operand_reg }); | |
| 1001 | return MCValue{ .register = dest_reg }; | |
| 1002 | }, | |
| 1003 | else => { | |
| 1004 | try self.truncRegister(operand_reg, dest_reg, info_b.signedness, info_b.bits); | |
| 1005 | return MCValue{ .register = dest_reg }; | |
| 1006 | }, | |
| 998 | 1007 | } |
| 1008 | } else { | |
| 1009 | return self.fail("TODO: truncate to ints > 32 bits", .{}); | |
| 1010 | } | |
| 1011 | } | |
| 1012 | ||
| 1013 | fn airTrunc(self: *Self, inst: Air.Inst.Index) !void { | |
| 1014 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | |
| 1015 | const operand = try self.resolveInst(ty_op.operand); | |
| 1016 | const operand_ty = self.air.typeOf(ty_op.operand); | |
| 1017 | const dest_ty = self.air.typeOfIndex(inst); | |
| 1018 | ||
| 1019 | const result: MCValue = if (self.liveness.isUnused(inst)) .dead else blk: { | |
| 1020 | break :blk try self.trunc(inst, operand, operand_ty, dest_ty); | |
| 999 | 1021 | }; |
| 1000 | 1022 | |
| 1001 | 1023 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); |
| ... | ... | @@ -1099,6 +1121,10 @@ fn airNot(self: *Self, inst: Air.Inst.Index) !void { |
| 1099 | 1121 | } }, |
| 1100 | 1122 | }); |
| 1101 | 1123 | |
| 1124 | if (int_info.bits < 32) { | |
| 1125 | try self.truncRegister(dest_reg, dest_reg, int_info.signedness, int_info.bits); | |
| 1126 | } | |
| 1127 | ||
| 1102 | 1128 | break :result MCValue{ .register = dest_reg }; |
| 1103 | 1129 | } else { |
| 1104 | 1130 | return self.fail("TODO ARM not on integers > u32/i32", .{}); |
| ... | ... | @@ -1957,8 +1983,8 @@ fn binOpRegister( |
| 1957 | 1983 | if (!rhs_is_register) try self.genSetReg(rhs_ty, rhs_reg, rhs); |
| 1958 | 1984 | |
| 1959 | 1985 | const mir_tag: Mir.Inst.Tag = switch (tag) { |
| 1960 | .add, .ptr_add => .add, | |
| 1961 | .sub, .ptr_sub => .sub, | |
| 1986 | .add => .add, | |
| 1987 | .sub => .sub, | |
| 1962 | 1988 | .cmp_eq => .cmp, |
| 1963 | 1989 | .mul => .mul, |
| 1964 | 1990 | .bit_and, |
| ... | ... | @@ -1967,12 +1993,8 @@ fn binOpRegister( |
| 1967 | 1993 | .bit_or, |
| 1968 | 1994 | .bool_or, |
| 1969 | 1995 | => .orr, |
| 1970 | .shl, | |
| 1971 | .shl_exact, | |
| 1972 | => .lsl, | |
| 1973 | .shr, | |
| 1974 | .shr_exact, | |
| 1975 | => switch (lhs_ty.intInfo(self.target.*).signedness) { | |
| 1996 | .shl_exact => .lsl, | |
| 1997 | .shr_exact => switch (lhs_ty.intInfo(self.target.*).signedness) { | |
| 1976 | 1998 | .signed => Mir.Inst.Tag.asr, |
| 1977 | 1999 | .unsigned => Mir.Inst.Tag.lsr, |
| 1978 | 2000 | }, |
| ... | ... | @@ -1988,16 +2010,12 @@ fn binOpRegister( |
| 1988 | 2010 | .bit_or, |
| 1989 | 2011 | .bool_or, |
| 1990 | 2012 | .xor, |
| 1991 | .ptr_add, | |
| 1992 | .ptr_sub, | |
| 1993 | 2013 | => .{ .rr_op = .{ |
| 1994 | 2014 | .rd = dest_reg, |
| 1995 | 2015 | .rn = lhs_reg, |
| 1996 | 2016 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), |
| 1997 | 2017 | } }, |
| 1998 | .shl, | |
| 1999 | 2018 | .shl_exact, |
| 2000 | .shr, | |
| 2001 | 2019 | .shr_exact, |
| 2002 | 2020 | => .{ .rr_shift = .{ |
| 2003 | 2021 | .rd = dest_reg, |
| ... | ... | @@ -2094,12 +2112,8 @@ fn binOpImmediate( |
| 2094 | 2112 | .bit_or, |
| 2095 | 2113 | .bool_or, |
| 2096 | 2114 | => .orr, |
| 2097 | .shl, | |
| 2098 | .shl_exact, | |
| 2099 | => .lsl, | |
| 2100 | .shr, | |
| 2101 | .shr_exact, | |
| 2102 | => switch (lhs_ty.intInfo(self.target.*).signedness) { | |
| 2115 | .shl_exact => .lsl, | |
| 2116 | .shr_exact => switch (lhs_ty.intInfo(self.target.*).signedness) { | |
| 2103 | 2117 | .signed => Mir.Inst.Tag.asr, |
| 2104 | 2118 | .unsigned => Mir.Inst.Tag.lsr, |
| 2105 | 2119 | }, |
| ... | ... | @@ -2120,9 +2134,7 @@ fn binOpImmediate( |
| 2120 | 2134 | .rn = lhs_reg, |
| 2121 | 2135 | .op = Instruction.Operand.fromU32(rhs.immediate).?, |
| 2122 | 2136 | } }, |
| 2123 | .shl, | |
| 2124 | 2137 | .shl_exact, |
| 2125 | .shr, | |
| 2126 | 2138 | .shr_exact, |
| 2127 | 2139 | => .{ .rr_shift = .{ |
| 2128 | 2140 | .rd = dest_reg, |
| ... | ... | @@ -2225,6 +2237,39 @@ fn binOp( |
| 2225 | 2237 | else => unreachable, |
| 2226 | 2238 | } |
| 2227 | 2239 | }, |
| 2240 | .addwrap, | |
| 2241 | .subwrap, | |
| 2242 | .mulwrap, | |
| 2243 | => { | |
| 2244 | const base_tag: Air.Inst.Tag = switch (tag) { | |
| 2245 | .addwrap => .add, | |
| 2246 | .subwrap => .sub, | |
| 2247 | .mulwrap => .mul, | |
| 2248 | else => unreachable, | |
| 2249 | }; | |
| 2250 | ||
| 2251 | // Generate an add/sub/mul | |
| 2252 | const result = try self.binOp(base_tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty); | |
| 2253 | ||
| 2254 | // Truncate if necessary | |
| 2255 | switch (lhs_ty.zigTypeTag()) { | |
| 2256 | .Vector => return self.fail("TODO ARM binary operations on vectors", .{}), | |
| 2257 | .Int => { | |
| 2258 | const int_info = lhs_ty.intInfo(self.target.*); | |
| 2259 | if (int_info.bits <= 32) { | |
| 2260 | const result_reg = result.register; | |
| 2261 | ||
| 2262 | if (int_info.bits < 32) { | |
| 2263 | try self.truncRegister(result_reg, result_reg, int_info.signedness, int_info.bits); | |
| 2264 | return result; | |
| 2265 | } else return result; | |
| 2266 | } else { | |
| 2267 | return self.fail("TODO ARM binary operations on integers > u32/i32", .{}); | |
| 2268 | } | |
| 2269 | }, | |
| 2270 | else => unreachable, | |
| 2271 | } | |
| 2272 | }, | |
| 2228 | 2273 | .bit_and, |
| 2229 | 2274 | .bit_or, |
| 2230 | 2275 | .xor, |
| ... | ... | @@ -2253,8 +2298,8 @@ fn binOp( |
| 2253 | 2298 | else => unreachable, |
| 2254 | 2299 | } |
| 2255 | 2300 | }, |
| 2256 | .shl, | |
| 2257 | .shr, | |
| 2301 | .shl_exact, | |
| 2302 | .shr_exact, | |
| 2258 | 2303 | => { |
| 2259 | 2304 | switch (lhs_ty.zigTypeTag()) { |
| 2260 | 2305 | .Vector => return self.fail("TODO ARM binary operations on vectors", .{}), |
| ... | ... | @@ -2275,6 +2320,41 @@ fn binOp( |
| 2275 | 2320 | else => unreachable, |
| 2276 | 2321 | } |
| 2277 | 2322 | }, |
| 2323 | .shl, | |
| 2324 | .shr, | |
| 2325 | => { | |
| 2326 | const base_tag: Air.Inst.Tag = switch (tag) { | |
| 2327 | .shl => .shl_exact, | |
| 2328 | .shr => .shr_exact, | |
| 2329 | else => unreachable, | |
| 2330 | }; | |
| 2331 | ||
| 2332 | // Generate a shl_exact/shr_exact | |
| 2333 | const result = try self.binOp(base_tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty); | |
| 2334 | ||
| 2335 | // Truncate if necessary | |
| 2336 | switch (tag) { | |
| 2337 | .shr => return result, | |
| 2338 | .shl => switch (lhs_ty.zigTypeTag()) { | |
| 2339 | .Vector => return self.fail("TODO ARM binary operations on vectors", .{}), | |
| 2340 | .Int => { | |
| 2341 | const int_info = lhs_ty.intInfo(self.target.*); | |
| 2342 | if (int_info.bits <= 32) { | |
| 2343 | const result_reg = result.register; | |
| 2344 | ||
| 2345 | if (int_info.bits < 32) { | |
| 2346 | try self.truncRegister(result_reg, result_reg, int_info.signedness, int_info.bits); | |
| 2347 | return result; | |
| 2348 | } else return result; | |
| 2349 | } else { | |
| 2350 | return self.fail("TODO ARM binary operations on integers > u32/i32", .{}); | |
| 2351 | } | |
| 2352 | }, | |
| 2353 | else => unreachable, | |
| 2354 | }, | |
| 2355 | else => unreachable, | |
| 2356 | } | |
| 2357 | }, | |
| 2278 | 2358 | .bool_and, |
| 2279 | 2359 | .bool_or, |
| 2280 | 2360 | => { |
| ... | ... | @@ -2308,7 +2388,13 @@ fn binOp( |
| 2308 | 2388 | const elem_size = @intCast(u32, elem_ty.abiSize(self.target.*)); |
| 2309 | 2389 | |
| 2310 | 2390 | if (elem_size == 1) { |
| 2311 | return try self.binOpRegister(tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty); | |
| 2391 | const base_tag: Air.Inst.Tag = switch (tag) { | |
| 2392 | .ptr_add => .add, | |
| 2393 | .ptr_sub => .sub, | |
| 2394 | else => unreachable, | |
| 2395 | }; | |
| 2396 | ||
| 2397 | return try self.binOpRegister(base_tag, maybe_inst, lhs, rhs, lhs_ty, rhs_ty); | |
| 2312 | 2398 | } else { |
| 2313 | 2399 | // convert the offset into a byte offset by |
| 2314 | 2400 | // multiplying it with elem_size |
| ... | ... | @@ -2876,35 +2962,19 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { |
| 2876 | 2962 | const condition = Condition.fromCompareOperatorUnsigned(cmp_op); |
| 2877 | 2963 | break :blk condition.negate(); |
| 2878 | 2964 | }, |
| 2879 | .register => |reg| blk: { | |
| 2880 | try self.spillCompareFlagsIfOccupied(); | |
| 2881 | ||
| 2882 | // cmp reg, 1 | |
| 2883 | // bne ... | |
| 2884 | _ = try self.addInst(.{ | |
| 2885 | .tag = .cmp, | |
| 2886 | .cond = .al, | |
| 2887 | .data = .{ .rr_op = .{ | |
| 2888 | .rd = .r0, | |
| 2889 | .rn = reg, | |
| 2890 | .op = Instruction.Operand.imm(1, 0), | |
| 2891 | } }, | |
| 2892 | }); | |
| 2965 | else => blk: { | |
| 2966 | const reg = switch (cond) { | |
| 2967 | .register => |r| r, | |
| 2968 | else => try self.copyToTmpRegister(Type.bool, cond), | |
| 2969 | }; | |
| 2893 | 2970 | |
| 2894 | break :blk .ne; | |
| 2895 | }, | |
| 2896 | .stack_offset, | |
| 2897 | .memory, | |
| 2898 | .stack_argument_offset, | |
| 2899 | => blk: { | |
| 2900 | 2971 | try self.spillCompareFlagsIfOccupied(); |
| 2901 | 2972 | |
| 2902 | const reg = try self.copyToTmpRegister(Type.initTag(.bool), cond); | |
| 2903 | ||
| 2904 | 2973 | // cmp reg, 1 |
| 2905 | 2974 | // bne ... |
| 2906 | 2975 | _ = try self.addInst(.{ |
| 2907 | 2976 | .tag = .cmp, |
| 2977 | .cond = .al, | |
| 2908 | 2978 | .data = .{ .rr_op = .{ |
| 2909 | 2979 | .rd = .r0, |
| 2910 | 2980 | .rn = reg, |
| ... | ... | @@ -2914,7 +2984,6 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { |
| 2914 | 2984 | |
| 2915 | 2985 | break :blk .ne; |
| 2916 | 2986 | }, |
| 2917 | else => return self.fail("TODO implement condbr {} when condition is {s}", .{ self.target.cpu.arch, @tagName(cond) }), | |
| 2918 | 2987 | }; |
| 2919 | 2988 | |
| 2920 | 2989 | break :reloc try self.addInst(.{ |
| ... | ... | @@ -3603,9 +3672,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3603 | 3672 | try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off }); |
| 3604 | 3673 | }, |
| 3605 | 3674 | .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }), |
| 3606 | .embedded_in_code, | |
| 3607 | .stack_argument_offset, | |
| 3608 | => return self.fail("TODO genSetStack with src={}", .{mcv}), | |
| 3675 | .stack_argument_offset => |unadjusted_off| { | |
| 3676 | const adj_off = unadjusted_off + abi_size; | |
| 3677 | ||
| 3678 | _ = try self.addInst(.{ | |
| 3679 | .tag = .ldr_ptr_stack_argument, | |
| 3680 | .data = .{ .r_stack_offset = .{ | |
| 3681 | .rt = src_reg, | |
| 3682 | .stack_offset = adj_off, | |
| 3683 | } }, | |
| 3684 | }); | |
| 3685 | }, | |
| 3686 | .embedded_in_code => return self.fail("TODO genSetStack with src={}", .{mcv}), | |
| 3609 | 3687 | else => unreachable, |
| 3610 | 3688 | } |
| 3611 | 3689 |
src/arch/arm/Emit.zig+7| ... | ... | @@ -112,6 +112,7 @@ pub fn emitMir( |
| 112 | 112 | .str => try emit.mirLoadStore(inst), |
| 113 | 113 | .strb => try emit.mirLoadStore(inst), |
| 114 | 114 | |
| 115 | .ldr_ptr_stack_argument => try emit.mirLoadStackArgument(inst), | |
| 115 | 116 | .ldr_stack_argument => try emit.mirLoadStackArgument(inst), |
| 116 | 117 | .ldrb_stack_argument => try emit.mirLoadStackArgument(inst), |
| 117 | 118 | .ldrh_stack_argument => try emit.mirLoadStackArgument(inst), |
| ... | ... | @@ -597,6 +598,12 @@ fn mirLoadStackArgument(emit: *Emit, inst: Mir.Inst.Index) !void { |
| 597 | 598 | |
| 598 | 599 | const raw_offset = emit.prologue_stack_space - r_stack_offset.stack_offset; |
| 599 | 600 | switch (tag) { |
| 601 | .ldr_ptr_stack_argument => { | |
| 602 | const operand = Instruction.Operand.fromU32(raw_offset) orelse | |
| 603 | return emit.fail("TODO mirLoadStack larger offsets", .{}); | |
| 604 | ||
| 605 | try emit.writeInstruction(Instruction.add(cond, r_stack_offset.rt, .fp, operand)); | |
| 606 | }, | |
| 600 | 607 | .ldr_stack_argument, |
| 601 | 608 | .ldrb_stack_argument, |
| 602 | 609 | => { |
src/arch/arm/Mir.zig+2| ... | ... | @@ -54,6 +54,8 @@ pub const Inst = struct { |
| 54 | 54 | eor, |
| 55 | 55 | /// Load Register |
| 56 | 56 | ldr, |
| 57 | /// Pseudo-instruction: Load pointer to stack argument offset | |
| 58 | ldr_ptr_stack_argument, | |
| 57 | 59 | /// Load Register |
| 58 | 60 | ldr_stack_argument, |
| 59 | 61 | /// Load Register Byte |
test/behavior/array.zig-1| ... | ... | @@ -202,7 +202,6 @@ fn doSomeMangling(array: *[4]u8) void { |
| 202 | 202 | |
| 203 | 203 | test "implicit cast zero sized array ptr to slice" { |
| 204 | 204 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 205 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 206 | 205 | |
| 207 | 206 | { |
| 208 | 207 | var b = "".*; |
test/behavior/bitcast.zig-1| ... | ... | @@ -269,7 +269,6 @@ test "bitcast passed as tuple element" { |
| 269 | 269 | |
| 270 | 270 | test "triple level result location with bitcast sandwich passed as tuple element" { |
| 271 | 271 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 272 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 273 | 272 | |
| 274 | 273 | const S = struct { |
| 275 | 274 | fn foo(args: anytype) !void { |
test/behavior/bugs/11181.zig-2| ... | ... | @@ -2,7 +2,6 @@ const builtin = @import("builtin"); |
| 2 | 2 | |
| 3 | 3 | test "const inferred array of slices" { |
| 4 | 4 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 5 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 6 | 5 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 7 | 6 | |
| 8 | 7 | const T = struct { v: bool }; |
| ... | ... | @@ -17,7 +16,6 @@ test "const inferred array of slices" { |
| 17 | 16 | |
| 18 | 17 | test "var inferred array of slices" { |
| 19 | 18 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 20 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 21 | 19 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 22 | 20 | |
| 23 | 21 | const T = struct { v: bool }; |
test/behavior/bugs/1421.zig-1| ... | ... | @@ -9,7 +9,6 @@ const S = struct { |
| 9 | 9 | }; |
| 10 | 10 | |
| 11 | 11 | test "functions with return type required to be comptime are generic" { |
| 12 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 13 | 12 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 14 | 13 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 15 | 14 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
test/behavior/bugs/2692.zig-1| ... | ... | @@ -6,7 +6,6 @@ fn foo(a: []u8) void { |
| 6 | 6 | |
| 7 | 7 | test "address of 0 length array" { |
| 8 | 8 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 9 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 10 | 9 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 11 | 10 | |
| 12 | 11 | var pt: [0]u8 = undefined; |
test/behavior/bugs/5474.zig-4| ... | ... | @@ -49,15 +49,11 @@ fn constant() !void { |
| 49 | 49 | } |
| 50 | 50 | |
| 51 | 51 | test "pointer-to-array constness for zero-size elements, var" { |
| 52 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 53 | ||
| 54 | 52 | try mutable(); |
| 55 | 53 | comptime try mutable(); |
| 56 | 54 | } |
| 57 | 55 | |
| 58 | 56 | test "pointer-to-array constness for zero-size elements, const" { |
| 59 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 60 | ||
| 61 | 57 | try constant(); |
| 62 | 58 | comptime try constant(); |
| 63 | 59 | } |
test/behavior/bugs/828.zig-1| ... | ... | @@ -30,7 +30,6 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void { |
| 30 | 30 | } |
| 31 | 31 | |
| 32 | 32 | test "comptime struct return should not return the same instance" { |
| 33 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 34 | 33 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 35 | 34 | |
| 36 | 35 | //the first parameter must be passed by reference to trigger the bug |
test/behavior/cast.zig-4| ... | ... | @@ -1080,7 +1080,6 @@ test "compile time int to ptr of function" { |
| 1080 | 1080 | |
| 1081 | 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1082 | 1082 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1083 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 1084 | 1083 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1085 | 1084 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1086 | 1085 | |
| ... | ... | @@ -1129,7 +1128,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A { |
| 1129 | 1128 | test "peer type resolution: [0]u8 and []const u8" { |
| 1130 | 1129 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1131 | 1130 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1132 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 1133 | 1131 | |
| 1134 | 1132 | try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0); |
| 1135 | 1133 | try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1); |
| ... | ... | @@ -1278,8 +1276,6 @@ test "assignment to optional pointer result loc" { |
| 1278 | 1276 | } |
| 1279 | 1277 | |
| 1280 | 1278 | test "cast between *[N]void and []void" { |
| 1281 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 1282 | ||
| 1283 | 1279 | var a: [4]void = undefined; |
| 1284 | 1280 | var b: []void = &a; |
| 1285 | 1281 | try expect(b.len == 4); |
test/behavior/fn.zig-1| ... | ... | @@ -389,7 +389,6 @@ test "ability to give comptime types and non comptime types to same parameter" { |
| 389 | 389 | test "function with inferred error set but returning no error" { |
| 390 | 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 391 | 391 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 392 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 393 | 392 | |
| 394 | 393 | const S = struct { |
| 395 | 394 | fn foo() !void {} |
test/behavior/math.zig-8| ... | ... | @@ -367,7 +367,6 @@ test "binary not" { |
| 367 | 367 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 368 | 368 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 369 | 369 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 370 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 371 | 370 | |
| 372 | 371 | try expect(comptime x: { |
| 373 | 372 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; |
| ... | ... | @@ -488,7 +487,6 @@ fn mod(comptime T: type, a: T, b: T) T { |
| 488 | 487 | test "unsigned wrapping" { |
| 489 | 488 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 490 | 489 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 491 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 492 | 490 | |
| 493 | 491 | try testUnsignedWrappingEval(maxInt(u32)); |
| 494 | 492 | comptime try testUnsignedWrappingEval(maxInt(u32)); |
| ... | ... | @@ -503,7 +501,6 @@ fn testUnsignedWrappingEval(x: u32) !void { |
| 503 | 501 | test "signed wrapping" { |
| 504 | 502 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 505 | 503 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 506 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 507 | 504 | |
| 508 | 505 | try testSignedWrappingEval(maxInt(i32)); |
| 509 | 506 | comptime try testSignedWrappingEval(maxInt(i32)); |
| ... | ... | @@ -518,7 +515,6 @@ fn testSignedWrappingEval(x: i32) !void { |
| 518 | 515 | test "signed negation wrapping" { |
| 519 | 516 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 520 | 517 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 521 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 522 | 518 | |
| 523 | 519 | try testSignedNegationWrappingEval(minInt(i16)); |
| 524 | 520 | comptime try testSignedNegationWrappingEval(minInt(i16)); |
| ... | ... | @@ -532,7 +528,6 @@ fn testSignedNegationWrappingEval(x: i16) !void { |
| 532 | 528 | test "unsigned negation wrapping" { |
| 533 | 529 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 534 | 530 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 535 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 536 | 531 | |
| 537 | 532 | try testUnsignedNegationWrappingEval(1); |
| 538 | 533 | comptime try testUnsignedNegationWrappingEval(1); |
| ... | ... | @@ -868,7 +863,6 @@ test "quad hex float literal parsing accurate" { |
| 868 | 863 | |
| 869 | 864 | test "truncating shift left" { |
| 870 | 865 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 871 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 872 | 866 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 873 | 867 | |
| 874 | 868 | try testShlTrunc(maxInt(u16)); |
| ... | ... | @@ -881,7 +875,6 @@ fn testShlTrunc(x: u16) !void { |
| 881 | 875 | |
| 882 | 876 | test "exact shift left" { |
| 883 | 877 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 884 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 885 | 878 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 886 | 879 | |
| 887 | 880 | try testShlExact(0b00110101); |
| ... | ... | @@ -894,7 +887,6 @@ fn testShlExact(x: u8) !void { |
| 894 | 887 | |
| 895 | 888 | test "exact shift right" { |
| 896 | 889 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 897 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 898 | 890 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 899 | 891 | |
| 900 | 892 | try testShrExact(0b10110100); |
test/behavior/optional.zig-1| ... | ... | @@ -26,7 +26,6 @@ pub const EmptyStruct = struct {}; |
| 26 | 26 | |
| 27 | 27 | test "optional pointer to size zero struct" { |
| 28 | 28 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 29 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 30 | 29 | |
| 31 | 30 | var e = EmptyStruct{}; |
| 32 | 31 | var o: ?*EmptyStruct = &e; |
test/behavior/ptrcast.zig-1| ... | ... | @@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void { |
| 59 | 59 | } |
| 60 | 60 | |
| 61 | 61 | test "reinterpret bytes of an array into an extern struct" { |
| 62 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 63 | 62 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 64 | 63 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 65 | 64 |
test/behavior/sizeof_and_typeof.zig-1| ... | ... | @@ -186,7 +186,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" { |
| 186 | 186 | } |
| 187 | 187 | |
| 188 | 188 | test "@TypeOf() has no runtime side effects" { |
| 189 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 190 | 189 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 191 | 190 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 192 | 191 | const S = struct { |
test/behavior/slice.zig-2| ... | ... | @@ -70,7 +70,6 @@ test "comptime slice of undefined pointer of length 0" { |
| 70 | 70 | test "implicitly cast array of size 0 to slice" { |
| 71 | 71 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 72 | 72 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 73 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 74 | 73 | |
| 75 | 74 | var msg = [_]u8{}; |
| 76 | 75 | try assertLenIsZero(&msg); |
| ... | ... | @@ -206,7 +205,6 @@ const y = x[0x100..]; |
| 206 | 205 | test "compile time slice of pointer to hard coded address" { |
| 207 | 206 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 208 | 207 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 209 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 210 | 208 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 211 | 209 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; |
| 212 | 210 |
test/behavior/struct.zig-2| ... | ... | @@ -926,7 +926,6 @@ test "anonymous struct literal syntax" { |
| 926 | 926 | |
| 927 | 927 | test "fully anonymous struct" { |
| 928 | 928 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 929 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 930 | 929 | |
| 931 | 930 | const S = struct { |
| 932 | 931 | fn doTheTest() !void { |
| ... | ... | @@ -951,7 +950,6 @@ test "fully anonymous struct" { |
| 951 | 950 | |
| 952 | 951 | test "fully anonymous list literal" { |
| 953 | 952 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 954 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 955 | 953 | |
| 956 | 954 | const S = struct { |
| 957 | 955 | fn doTheTest() !void { |
test/behavior/struct_contains_null_ptr_itself.zig-1| ... | ... | @@ -3,7 +3,6 @@ const expect = std.testing.expect; |
| 3 | 3 | const builtin = @import("builtin"); |
| 4 | 4 | |
| 5 | 5 | test "struct contains null pointer which contains original struct" { |
| 6 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 7 | 6 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 8 | 7 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 9 | 8 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
test/behavior/type.zig-2| ... | ... | @@ -468,7 +468,6 @@ test "Type.Union from Type.Enum" { |
| 468 | 468 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 469 | 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 470 | 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 471 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 472 | 471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 473 | 472 | |
| 474 | 473 | const Tag = @Type(.{ |
| ... | ... | @@ -500,7 +499,6 @@ test "Type.Union from regular enum" { |
| 500 | 499 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 501 | 500 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 502 | 501 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 503 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 504 | 502 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 505 | 503 | |
| 506 | 504 | const E = enum { working_as_expected }; |
test/behavior/type_info.zig-1| ... | ... | @@ -385,7 +385,6 @@ extern fn foo(a: usize, b: bool, ...) callconv(.C) usize; |
| 385 | 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; |
| 386 | 386 | |
| 387 | 387 | test "type info: generic function types" { |
| 388 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 389 | 388 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 390 | 389 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 391 | 390 |
test/behavior/var_args.zig-5| ... | ... | @@ -14,7 +14,6 @@ fn add(args: anytype) i32 { |
| 14 | 14 | |
| 15 | 15 | test "add arbitrary args" { |
| 16 | 16 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 17 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 18 | 17 | |
| 19 | 18 | try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10); |
| 20 | 19 | try expect(add(.{@as(i32, 1234)}) == 1234); |
| ... | ... | @@ -27,14 +26,12 @@ fn readFirstVarArg(args: anytype) void { |
| 27 | 26 | |
| 28 | 27 | test "send void arg to var args" { |
| 29 | 28 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 30 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 31 | 29 | |
| 32 | 30 | readFirstVarArg(.{{}}); |
| 33 | 31 | } |
| 34 | 32 | |
| 35 | 33 | test "pass args directly" { |
| 36 | 34 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 37 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 38 | 35 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 39 | 36 | |
| 40 | 37 | try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10); |
| ... | ... | @@ -89,7 +86,6 @@ fn foo2(args: anytype) bool { |
| 89 | 86 | |
| 90 | 87 | test "array of var args functions" { |
| 91 | 88 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 92 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 93 | 89 | |
| 94 | 90 | try expect(foos[0](.{})); |
| 95 | 91 | try expect(!foos[1](.{})); |
| ... | ... | @@ -97,7 +93,6 @@ test "array of var args functions" { |
| 97 | 93 | |
| 98 | 94 | test "pass zero length array to var args param" { |
| 99 | 95 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 100 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | |
| 101 | 96 | |
| 102 | 97 | doNothingWithFirstArg(.{""}); |
| 103 | 98 | } |
test/behavior/void.zig-1| ... | ... | @@ -19,7 +19,6 @@ test "compare void with void compile time known" { |
| 19 | 19 | } |
| 20 | 20 | |
| 21 | 21 | test "iterate over a void slice" { |
| 22 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | |
| 23 | 22 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 24 | 23 | |
| 25 | 24 | var j: usize = 0; |