| 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,13 +530,13 @@ fn genBody(self: *Self, body: []const Air.Inst.Index) InnerError!void { |
| 530 | switch (air_tags[inst]) { | 530 | switch (air_tags[inst]) { |
| 531 | // zig fmt: off | 531 | // zig fmt: off |
| 532 | .add, .ptr_add => try self.airBinOp(inst), | 532 | .add, .ptr_add => try self.airBinOp(inst), |
| 533 | .addwrap => try self.airAddWrap(inst), | 533 | .addwrap => try self.airBinOp(inst), |
| 534 | .add_sat => try self.airAddSat(inst), | 534 | .add_sat => try self.airAddSat(inst), |
| 535 | .sub, .ptr_sub => try self.airBinOp(inst), | 535 | .sub, .ptr_sub => try self.airBinOp(inst), |
| 536 | .subwrap => try self.airSubWrap(inst), | 536 | .subwrap => try self.airBinOp(inst), |
| 537 | .sub_sat => try self.airSubSat(inst), | 537 | .sub_sat => try self.airSubSat(inst), |
| 538 | .mul => try self.airBinOp(inst), | 538 | .mul => try self.airBinOp(inst), |
| 539 | .mulwrap => try self.airMulWrap(inst), | 539 | .mulwrap => try self.airBinOp(inst), |
| 540 | .mul_sat => try self.airMulSat(inst), | 540 | .mul_sat => try self.airMulSat(inst), |
| 541 | .rem => try self.airRem(inst), | 541 | .rem => try self.airRem(inst), |
| 542 | .mod => try self.airMod(inst), | 542 | .mod => try self.airMod(inst), |
| ... | @@ -939,63 +939,85 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -939,63 +939,85 @@ fn airIntCast(self: *Self, inst: Air.Inst.Index) !void { |
| 939 | // return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); | 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 { | 942 | fn truncRegister( |
| 943 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | 943 | self: *Self, |
| 944 | if (self.liveness.isUnused(inst)) | 944 | operand_reg: Register, |
| 945 | return self.finishAir(inst, .dead, .{ ty_op.operand, .none, .none }); | 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); | 964 | fn trunc( |
| 948 | const operand = try self.resolveInst(ty_op.operand); | 965 | self: *Self, |
| 966 | maybe_inst: ?Air.Inst.Index, | ||
| 967 | operand: MCValue, | ||
| 968 | operand_ty: Type, | ||
| 969 | dest_ty: Type, | ||
| 970 | ) !MCValue { | ||
| 949 | const info_a = operand_ty.intInfo(self.target.*); | 971 | const info_a = operand_ty.intInfo(self.target.*); |
| 950 | const info_b = self.air.typeOfIndex(inst).intInfo(self.target.*); | 972 | const info_b = dest_ty.intInfo(self.target.*); |
| 951 | 973 | ||
| 952 | const result: MCValue = blk: { | 974 | if (info_b.bits <= 32) { |
| 953 | if (info_b.bits <= 32) { | 975 | const operand_reg = switch (operand) { |
| 954 | const operand_reg = switch (operand) { | 976 | .register => |r| r, |
| 955 | .register => |r| r, | 977 | else => operand_reg: { |
| 956 | else => operand_reg: { | 978 | if (info_a.bits <= 32) { |
| 957 | if (info_a.bits <= 32) { | 979 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand); |
| 958 | break :operand_reg try self.copyToTmpRegister(operand_ty, operand); | 980 | } else { |
| 959 | } else { | 981 | return self.fail("TODO load least significant word into register", .{}); |
| 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; | ||
| 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); | 988 | const dest_reg = if (maybe_inst) |inst| blk: { |
| 973 | }; | 989 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 974 | 990 | ||
| 975 | switch (info_b.bits) { | 991 | if (operand == .register and self.reuseOperand(inst, ty_op.operand, 0, operand)) { |
| 976 | 32 => { | 992 | break :blk operand_reg; |
| 977 | try self.genSetReg(operand_ty, dest_reg, .{ .register = operand_reg }); | 993 | } else { |
| 978 | break :blk MCValue{ .register = dest_reg }; | 994 | break :blk try self.register_manager.allocReg(inst); |
| 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 | }, | ||
| 995 | } | 995 | } |
| 996 | } else { | 996 | } else try self.register_manager.allocReg(null); |
| 997 | return self.fail("TODO: truncate to ints > 32 bits", .{}); | 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 | return self.finishAir(inst, result, .{ ty_op.operand, .none, .none }); | 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,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 | break :result MCValue{ .register = dest_reg }; | 1128 | break :result MCValue{ .register = dest_reg }; |
| 1103 | } else { | 1129 | } else { |
| 1104 | return self.fail("TODO ARM not on integers > u32/i32", .{}); | 1130 | return self.fail("TODO ARM not on integers > u32/i32", .{}); |
| ... | @@ -1957,8 +1983,8 @@ fn binOpRegister( | ... | @@ -1957,8 +1983,8 @@ fn binOpRegister( |
| 1957 | if (!rhs_is_register) try self.genSetReg(rhs_ty, rhs_reg, rhs); | 1983 | if (!rhs_is_register) try self.genSetReg(rhs_ty, rhs_reg, rhs); |
| 1958 | 1984 | ||
| 1959 | const mir_tag: Mir.Inst.Tag = switch (tag) { | 1985 | const mir_tag: Mir.Inst.Tag = switch (tag) { |
| 1960 | .add, .ptr_add => .add, | 1986 | .add => .add, |
| 1961 | .sub, .ptr_sub => .sub, | 1987 | .sub => .sub, |
| 1962 | .cmp_eq => .cmp, | 1988 | .cmp_eq => .cmp, |
| 1963 | .mul => .mul, | 1989 | .mul => .mul, |
| 1964 | .bit_and, | 1990 | .bit_and, |
| ... | @@ -1967,12 +1993,8 @@ fn binOpRegister( | ... | @@ -1967,12 +1993,8 @@ fn binOpRegister( |
| 1967 | .bit_or, | 1993 | .bit_or, |
| 1968 | .bool_or, | 1994 | .bool_or, |
| 1969 | => .orr, | 1995 | => .orr, |
| 1970 | .shl, | 1996 | .shl_exact => .lsl, |
| 1971 | .shl_exact, | 1997 | .shr_exact => switch (lhs_ty.intInfo(self.target.*).signedness) { |
| 1972 | => .lsl, | ||
| 1973 | .shr, | ||
| 1974 | .shr_exact, | ||
| 1975 | => switch (lhs_ty.intInfo(self.target.*).signedness) { | ||
| 1976 | .signed => Mir.Inst.Tag.asr, | 1998 | .signed => Mir.Inst.Tag.asr, |
| 1977 | .unsigned => Mir.Inst.Tag.lsr, | 1999 | .unsigned => Mir.Inst.Tag.lsr, |
| 1978 | }, | 2000 | }, |
| ... | @@ -1988,16 +2010,12 @@ fn binOpRegister( | ... | @@ -1988,16 +2010,12 @@ fn binOpRegister( |
| 1988 | .bit_or, | 2010 | .bit_or, |
| 1989 | .bool_or, | 2011 | .bool_or, |
| 1990 | .xor, | 2012 | .xor, |
| 1991 | .ptr_add, | ||
| 1992 | .ptr_sub, | ||
| 1993 | => .{ .rr_op = .{ | 2013 | => .{ .rr_op = .{ |
| 1994 | .rd = dest_reg, | 2014 | .rd = dest_reg, |
| 1995 | .rn = lhs_reg, | 2015 | .rn = lhs_reg, |
| 1996 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), | 2016 | .op = Instruction.Operand.reg(rhs_reg, Instruction.Operand.Shift.none), |
| 1997 | } }, | 2017 | } }, |
| 1998 | .shl, | ||
| 1999 | .shl_exact, | 2018 | .shl_exact, |
| 2000 | .shr, | ||
| 2001 | .shr_exact, | 2019 | .shr_exact, |
| 2002 | => .{ .rr_shift = .{ | 2020 | => .{ .rr_shift = .{ |
| 2003 | .rd = dest_reg, | 2021 | .rd = dest_reg, |
| ... | @@ -2094,12 +2112,8 @@ fn binOpImmediate( | ... | @@ -2094,12 +2112,8 @@ fn binOpImmediate( |
| 2094 | .bit_or, | 2112 | .bit_or, |
| 2095 | .bool_or, | 2113 | .bool_or, |
| 2096 | => .orr, | 2114 | => .orr, |
| 2097 | .shl, | 2115 | .shl_exact => .lsl, |
| 2098 | .shl_exact, | 2116 | .shr_exact => switch (lhs_ty.intInfo(self.target.*).signedness) { |
| 2099 | => .lsl, | ||
| 2100 | .shr, | ||
| 2101 | .shr_exact, | ||
| 2102 | => switch (lhs_ty.intInfo(self.target.*).signedness) { | ||
| 2103 | .signed => Mir.Inst.Tag.asr, | 2117 | .signed => Mir.Inst.Tag.asr, |
| 2104 | .unsigned => Mir.Inst.Tag.lsr, | 2118 | .unsigned => Mir.Inst.Tag.lsr, |
| 2105 | }, | 2119 | }, |
| ... | @@ -2120,9 +2134,7 @@ fn binOpImmediate( | ... | @@ -2120,9 +2134,7 @@ fn binOpImmediate( |
| 2120 | .rn = lhs_reg, | 2134 | .rn = lhs_reg, |
| 2121 | .op = Instruction.Operand.fromU32(rhs.immediate).?, | 2135 | .op = Instruction.Operand.fromU32(rhs.immediate).?, |
| 2122 | } }, | 2136 | } }, |
| 2123 | .shl, | ||
| 2124 | .shl_exact, | 2137 | .shl_exact, |
| 2125 | .shr, | ||
| 2126 | .shr_exact, | 2138 | .shr_exact, |
| 2127 | => .{ .rr_shift = .{ | 2139 | => .{ .rr_shift = .{ |
| 2128 | .rd = dest_reg, | 2140 | .rd = dest_reg, |
| ... | @@ -2225,6 +2237,39 @@ fn binOp( | ... | @@ -2225,6 +2237,39 @@ fn binOp( |
| 2225 | else => unreachable, | 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 | .bit_and, | 2273 | .bit_and, |
| 2229 | .bit_or, | 2274 | .bit_or, |
| 2230 | .xor, | 2275 | .xor, |
| ... | @@ -2253,8 +2298,8 @@ fn binOp( | ... | @@ -2253,8 +2298,8 @@ fn binOp( |
| 2253 | else => unreachable, | 2298 | else => unreachable, |
| 2254 | } | 2299 | } |
| 2255 | }, | 2300 | }, |
| 2256 | .shl, | 2301 | .shl_exact, |
| 2257 | .shr, | 2302 | .shr_exact, |
| 2258 | => { | 2303 | => { |
| 2259 | switch (lhs_ty.zigTypeTag()) { | 2304 | switch (lhs_ty.zigTypeTag()) { |
| 2260 | .Vector => return self.fail("TODO ARM binary operations on vectors", .{}), | 2305 | .Vector => return self.fail("TODO ARM binary operations on vectors", .{}), |
| ... | @@ -2275,6 +2320,41 @@ fn binOp( | ... | @@ -2275,6 +2320,41 @@ fn binOp( |
| 2275 | else => unreachable, | 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 | .bool_and, | 2358 | .bool_and, |
| 2279 | .bool_or, | 2359 | .bool_or, |
| 2280 | => { | 2360 | => { |
| ... | @@ -2308,7 +2388,13 @@ fn binOp( | ... | @@ -2308,7 +2388,13 @@ fn binOp( |
| 2308 | const elem_size = @intCast(u32, elem_ty.abiSize(self.target.*)); | 2388 | const elem_size = @intCast(u32, elem_ty.abiSize(self.target.*)); |
| 2309 | 2389 | ||
| 2310 | if (elem_size == 1) { | 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 | } else { | 2398 | } else { |
| 2313 | // convert the offset into a byte offset by | 2399 | // convert the offset into a byte offset by |
| 2314 | // multiplying it with elem_size | 2400 | // multiplying it with elem_size |
| ... | @@ -2876,35 +2962,19 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2876,35 +2962,19 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { |
| 2876 | const condition = Condition.fromCompareOperatorUnsigned(cmp_op); | 2962 | const condition = Condition.fromCompareOperatorUnsigned(cmp_op); |
| 2877 | break :blk condition.negate(); | 2963 | break :blk condition.negate(); |
| 2878 | }, | 2964 | }, |
| 2879 | .register => |reg| blk: { | 2965 | else => blk: { |
| 2880 | try self.spillCompareFlagsIfOccupied(); | 2966 | const reg = switch (cond) { |
| 2881 | 2967 | .register => |r| r, | |
| 2882 | // cmp reg, 1 | 2968 | else => try self.copyToTmpRegister(Type.bool, cond), |
| 2883 | // bne ... | 2969 | }; |
| 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 | }); | ||
| 2893 | 2970 | ||
| 2894 | break :blk .ne; | ||
| 2895 | }, | ||
| 2896 | .stack_offset, | ||
| 2897 | .memory, | ||
| 2898 | .stack_argument_offset, | ||
| 2899 | => blk: { | ||
| 2900 | try self.spillCompareFlagsIfOccupied(); | 2971 | try self.spillCompareFlagsIfOccupied(); |
| 2901 | 2972 | ||
| 2902 | const reg = try self.copyToTmpRegister(Type.initTag(.bool), cond); | ||
| 2903 | |||
| 2904 | // cmp reg, 1 | 2973 | // cmp reg, 1 |
| 2905 | // bne ... | 2974 | // bne ... |
| 2906 | _ = try self.addInst(.{ | 2975 | _ = try self.addInst(.{ |
| 2907 | .tag = .cmp, | 2976 | .tag = .cmp, |
| 2977 | .cond = .al, | ||
| 2908 | .data = .{ .rr_op = .{ | 2978 | .data = .{ .rr_op = .{ |
| 2909 | .rd = .r0, | 2979 | .rd = .r0, |
| 2910 | .rn = reg, | 2980 | .rn = reg, |
| ... | @@ -2914,7 +2984,6 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { | ... | @@ -2914,7 +2984,6 @@ fn airCondBr(self: *Self, inst: Air.Inst.Index) !void { |
| 2914 | 2984 | ||
| 2915 | break :blk .ne; | 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 | break :reloc try self.addInst(.{ | 2989 | break :reloc try self.addInst(.{ |
| ... | @@ -3603,9 +3672,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro | ... | @@ -3603,9 +3672,18 @@ fn genSetStack(self: *Self, ty: Type, stack_offset: u32, mcv: MCValue) InnerErro |
| 3603 | try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off }); | 3672 | try self.genSetReg(ptr_ty, src_reg, .{ .ptr_stack_offset = off }); |
| 3604 | }, | 3673 | }, |
| 3605 | .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }), | 3674 | .memory => |addr| try self.genSetReg(ptr_ty, src_reg, .{ .immediate = @intCast(u32, addr) }), |
| 3606 | .embedded_in_code, | 3675 | .stack_argument_offset => |unadjusted_off| { |
| 3607 | .stack_argument_offset, | 3676 | const adj_off = unadjusted_off + abi_size; |
| 3608 | => return self.fail("TODO genSetStack with src={}", .{mcv}), | 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 | else => unreachable, | 3687 | else => unreachable, |
| 3610 | } | 3688 | } |
| 3611 | 3689 |
src/arch/arm/Emit.zig+7| ... | @@ -112,6 +112,7 @@ pub fn emitMir( | ... | @@ -112,6 +112,7 @@ pub fn emitMir( |
| 112 | .str => try emit.mirLoadStore(inst), | 112 | .str => try emit.mirLoadStore(inst), |
| 113 | .strb => try emit.mirLoadStore(inst), | 113 | .strb => try emit.mirLoadStore(inst), |
| 114 | 114 | ||
| 115 | .ldr_ptr_stack_argument => try emit.mirLoadStackArgument(inst), | ||
| 115 | .ldr_stack_argument => try emit.mirLoadStackArgument(inst), | 116 | .ldr_stack_argument => try emit.mirLoadStackArgument(inst), |
| 116 | .ldrb_stack_argument => try emit.mirLoadStackArgument(inst), | 117 | .ldrb_stack_argument => try emit.mirLoadStackArgument(inst), |
| 117 | .ldrh_stack_argument => try emit.mirLoadStackArgument(inst), | 118 | .ldrh_stack_argument => try emit.mirLoadStackArgument(inst), |
| ... | @@ -597,6 +598,12 @@ fn mirLoadStackArgument(emit: *Emit, inst: Mir.Inst.Index) !void { | ... | @@ -597,6 +598,12 @@ fn mirLoadStackArgument(emit: *Emit, inst: Mir.Inst.Index) !void { |
| 597 | 598 | ||
| 598 | const raw_offset = emit.prologue_stack_space - r_stack_offset.stack_offset; | 599 | const raw_offset = emit.prologue_stack_space - r_stack_offset.stack_offset; |
| 599 | switch (tag) { | 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 | .ldr_stack_argument, | 607 | .ldr_stack_argument, |
| 601 | .ldrb_stack_argument, | 608 | .ldrb_stack_argument, |
| 602 | => { | 609 | => { |
src/arch/arm/Mir.zig+2| ... | @@ -54,6 +54,8 @@ pub const Inst = struct { | ... | @@ -54,6 +54,8 @@ pub const Inst = struct { |
| 54 | eor, | 54 | eor, |
| 55 | /// Load Register | 55 | /// Load Register |
| 56 | ldr, | 56 | ldr, |
| 57 | /// Pseudo-instruction: Load pointer to stack argument offset | ||
| 58 | ldr_ptr_stack_argument, | ||
| 57 | /// Load Register | 59 | /// Load Register |
| 58 | ldr_stack_argument, | 60 | ldr_stack_argument, |
| 59 | /// Load Register Byte | 61 | /// Load Register Byte |
test/behavior/array.zig-1| ... | @@ -202,7 +202,6 @@ fn doSomeMangling(array: *[4]u8) void { | ... | @@ -202,7 +202,6 @@ fn doSomeMangling(array: *[4]u8) void { |
| 202 | 202 | ||
| 203 | test "implicit cast zero sized array ptr to slice" { | 203 | test "implicit cast zero sized array ptr to slice" { |
| 204 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 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 | var b = "".*; | 207 | var b = "".*; |
test/behavior/bitcast.zig-1| ... | @@ -269,7 +269,6 @@ test "bitcast passed as tuple element" { | ... | @@ -269,7 +269,6 @@ test "bitcast passed as tuple element" { |
| 269 | 269 | ||
| 270 | test "triple level result location with bitcast sandwich passed as tuple element" { | 270 | test "triple level result location with bitcast sandwich passed as tuple element" { |
| 271 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 271 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 272 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 273 | 272 | ||
| 274 | const S = struct { | 273 | const S = struct { |
| 275 | fn foo(args: anytype) !void { | 274 | fn foo(args: anytype) !void { |
test/behavior/bugs/11181.zig-2| ... | @@ -2,7 +2,6 @@ const builtin = @import("builtin"); | ... | @@ -2,7 +2,6 @@ const builtin = @import("builtin"); |
| 2 | 2 | ||
| 3 | test "const inferred array of slices" { | 3 | test "const inferred array of slices" { |
| 4 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 4 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 5 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 6 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 5 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 7 | 6 | ||
| 8 | const T = struct { v: bool }; | 7 | const T = struct { v: bool }; |
| ... | @@ -17,7 +16,6 @@ test "const inferred array of slices" { | ... | @@ -17,7 +16,6 @@ test "const inferred array of slices" { |
| 17 | 16 | ||
| 18 | test "var inferred array of slices" { | 17 | test "var inferred array of slices" { |
| 19 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 18 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 20 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 21 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 19 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 22 | 20 | ||
| 23 | const T = struct { v: bool }; | 21 | const T = struct { v: bool }; |
test/behavior/bugs/1421.zig-1| ... | @@ -9,7 +9,6 @@ const S = struct { | ... | @@ -9,7 +9,6 @@ const S = struct { |
| 9 | }; | 9 | }; |
| 10 | 10 | ||
| 11 | test "functions with return type required to be comptime are generic" { | 11 | test "functions with return type required to be comptime are generic" { |
| 12 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 13 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 12 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 14 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | 13 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 15 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 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,7 +6,6 @@ fn foo(a: []u8) void { |
| 6 | 6 | ||
| 7 | test "address of 0 length array" { | 7 | test "address of 0 length array" { |
| 8 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 8 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 9 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 10 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 9 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 11 | 10 | ||
| 12 | var pt: [0]u8 = undefined; | 11 | var pt: [0]u8 = undefined; |
test/behavior/bugs/5474.zig-4| ... | @@ -49,15 +49,11 @@ fn constant() !void { | ... | @@ -49,15 +49,11 @@ fn constant() !void { |
| 49 | } | 49 | } |
| 50 | 50 | ||
| 51 | test "pointer-to-array constness for zero-size elements, var" { | 51 | test "pointer-to-array constness for zero-size elements, var" { |
| 52 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 53 | |||
| 54 | try mutable(); | 52 | try mutable(); |
| 55 | comptime try mutable(); | 53 | comptime try mutable(); |
| 56 | } | 54 | } |
| 57 | 55 | ||
| 58 | test "pointer-to-array constness for zero-size elements, const" { | 56 | test "pointer-to-array constness for zero-size elements, const" { |
| 59 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 60 | |||
| 61 | try constant(); | 57 | try constant(); |
| 62 | comptime try constant(); | 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,7 +30,6 @@ fn constCount(comptime cb: *const CountBy, comptime unused: u32) void { |
| 30 | } | 30 | } |
| 31 | 31 | ||
| 32 | test "comptime struct return should not return the same instance" { | 32 | test "comptime struct return should not return the same instance" { |
| 33 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 34 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 33 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 35 | 34 | ||
| 36 | //the first parameter must be passed by reference to trigger the bug | 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,7 +1080,6 @@ test "compile time int to ptr of function" { |
| 1080 | 1080 | ||
| 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 1081 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 1082 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 1082 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 1083 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 1084 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 1083 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 1085 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 1084 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 1086 | 1085 | ||
| ... | @@ -1129,7 +1128,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A { | ... | @@ -1129,7 +1128,6 @@ fn returnNullLitFromOptionalTypeErrorRef() anyerror!?*A { |
| 1129 | test "peer type resolution: [0]u8 and []const u8" { | 1128 | test "peer type resolution: [0]u8 and []const u8" { |
| 1130 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 1129 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 1131 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0); | 1132 | try expect(peerTypeEmptyArrayAndSlice(true, "hi").len == 0); |
| 1135 | try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1); | 1133 | try expect(peerTypeEmptyArrayAndSlice(false, "hi").len == 1); |
| ... | @@ -1278,8 +1276,6 @@ test "assignment to optional pointer result loc" { | ... | @@ -1278,8 +1276,6 @@ test "assignment to optional pointer result loc" { |
| 1278 | } | 1276 | } |
| 1279 | 1277 | ||
| 1280 | test "cast between *[N]void and []void" { | 1278 | test "cast between *[N]void and []void" { |
| 1281 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 1282 | |||
| 1283 | var a: [4]void = undefined; | 1279 | var a: [4]void = undefined; |
| 1284 | var b: []void = &a; | 1280 | var b: []void = &a; |
| 1285 | try expect(b.len == 4); | 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,7 +389,6 @@ test "ability to give comptime types and non comptime types to same parameter" { |
| 389 | test "function with inferred error set but returning no error" { | 389 | test "function with inferred error set but returning no error" { |
| 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 391 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | const S = struct { | 393 | const S = struct { |
| 395 | fn foo() !void {} | 394 | fn foo() !void {} |
test/behavior/math.zig-8| ... | @@ -367,7 +367,6 @@ test "binary not" { | ... | @@ -367,7 +367,6 @@ test "binary not" { |
| 367 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 367 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 368 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 368 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 369 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | try expect(comptime x: { | 371 | try expect(comptime x: { |
| 373 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; | 372 | break :x ~@as(u16, 0b1010101010101010) == 0b0101010101010101; |
| ... | @@ -488,7 +487,6 @@ fn mod(comptime T: type, a: T, b: T) T { | ... | @@ -488,7 +487,6 @@ fn mod(comptime T: type, a: T, b: T) T { |
| 488 | test "unsigned wrapping" { | 487 | test "unsigned wrapping" { |
| 489 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 488 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 490 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | try testUnsignedWrappingEval(maxInt(u32)); | 491 | try testUnsignedWrappingEval(maxInt(u32)); |
| 494 | comptime try testUnsignedWrappingEval(maxInt(u32)); | 492 | comptime try testUnsignedWrappingEval(maxInt(u32)); |
| ... | @@ -503,7 +501,6 @@ fn testUnsignedWrappingEval(x: u32) !void { | ... | @@ -503,7 +501,6 @@ fn testUnsignedWrappingEval(x: u32) !void { |
| 503 | test "signed wrapping" { | 501 | test "signed wrapping" { |
| 504 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 502 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 505 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | try testSignedWrappingEval(maxInt(i32)); | 505 | try testSignedWrappingEval(maxInt(i32)); |
| 509 | comptime try testSignedWrappingEval(maxInt(i32)); | 506 | comptime try testSignedWrappingEval(maxInt(i32)); |
| ... | @@ -518,7 +515,6 @@ fn testSignedWrappingEval(x: i32) !void { | ... | @@ -518,7 +515,6 @@ fn testSignedWrappingEval(x: i32) !void { |
| 518 | test "signed negation wrapping" { | 515 | test "signed negation wrapping" { |
| 519 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 516 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 520 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | try testSignedNegationWrappingEval(minInt(i16)); | 519 | try testSignedNegationWrappingEval(minInt(i16)); |
| 524 | comptime try testSignedNegationWrappingEval(minInt(i16)); | 520 | comptime try testSignedNegationWrappingEval(minInt(i16)); |
| ... | @@ -532,7 +528,6 @@ fn testSignedNegationWrappingEval(x: i16) !void { | ... | @@ -532,7 +528,6 @@ fn testSignedNegationWrappingEval(x: i16) !void { |
| 532 | test "unsigned negation wrapping" { | 528 | test "unsigned negation wrapping" { |
| 533 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 529 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 534 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 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 | try testUnsignedNegationWrappingEval(1); | 532 | try testUnsignedNegationWrappingEval(1); |
| 538 | comptime try testUnsignedNegationWrappingEval(1); | 533 | comptime try testUnsignedNegationWrappingEval(1); |
| ... | @@ -868,7 +863,6 @@ test "quad hex float literal parsing accurate" { | ... | @@ -868,7 +863,6 @@ test "quad hex float literal parsing accurate" { |
| 868 | 863 | ||
| 869 | test "truncating shift left" { | 864 | test "truncating shift left" { |
| 870 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 865 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 871 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 872 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 866 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 873 | 867 | ||
| 874 | try testShlTrunc(maxInt(u16)); | 868 | try testShlTrunc(maxInt(u16)); |
| ... | @@ -881,7 +875,6 @@ fn testShlTrunc(x: u16) !void { | ... | @@ -881,7 +875,6 @@ fn testShlTrunc(x: u16) !void { |
| 881 | 875 | ||
| 882 | test "exact shift left" { | 876 | test "exact shift left" { |
| 883 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 877 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 884 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 885 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 878 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 886 | 879 | ||
| 887 | try testShlExact(0b00110101); | 880 | try testShlExact(0b00110101); |
| ... | @@ -894,7 +887,6 @@ fn testShlExact(x: u8) !void { | ... | @@ -894,7 +887,6 @@ fn testShlExact(x: u8) !void { |
| 894 | 887 | ||
| 895 | test "exact shift right" { | 888 | test "exact shift right" { |
| 896 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 889 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 897 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 898 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 890 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 899 | 891 | ||
| 900 | try testShrExact(0b10110100); | 892 | try testShrExact(0b10110100); |
test/behavior/optional.zig-1| ... | @@ -26,7 +26,6 @@ pub const EmptyStruct = struct {}; | ... | @@ -26,7 +26,6 @@ pub const EmptyStruct = struct {}; |
| 26 | 26 | ||
| 27 | test "optional pointer to size zero struct" { | 27 | test "optional pointer to size zero struct" { |
| 28 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 28 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 29 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 30 | 29 | ||
| 31 | var e = EmptyStruct{}; | 30 | var e = EmptyStruct{}; |
| 32 | var o: ?*EmptyStruct = &e; | 31 | var o: ?*EmptyStruct = &e; |
test/behavior/ptrcast.zig-1| ... | @@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void { | ... | @@ -59,7 +59,6 @@ fn testReinterpretStructWrappedBytesAsInteger() !void { |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | test "reinterpret bytes of an array into an extern struct" { | 61 | test "reinterpret bytes of an array into an extern struct" { |
| 62 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 63 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 62 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 64 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 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,7 +186,6 @@ test "@sizeOf(T) == 0 doesn't force resolving struct size" { |
| 186 | } | 186 | } |
| 187 | 187 | ||
| 188 | test "@TypeOf() has no runtime side effects" { | 188 | test "@TypeOf() has no runtime side effects" { |
| 189 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 190 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | 189 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 191 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 190 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; |
| 192 | const S = struct { | 191 | const S = struct { |
test/behavior/slice.zig-2| ... | @@ -70,7 +70,6 @@ test "comptime slice of undefined pointer of length 0" { | ... | @@ -70,7 +70,6 @@ test "comptime slice of undefined pointer of length 0" { |
| 70 | test "implicitly cast array of size 0 to slice" { | 70 | test "implicitly cast array of size 0 to slice" { |
| 71 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 71 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 72 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 72 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 73 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 74 | 73 | ||
| 75 | var msg = [_]u8{}; | 74 | var msg = [_]u8{}; |
| 76 | try assertLenIsZero(&msg); | 75 | try assertLenIsZero(&msg); |
| ... | @@ -206,7 +205,6 @@ const y = x[0x100..]; | ... | @@ -206,7 +205,6 @@ const y = x[0x100..]; |
| 206 | test "compile time slice of pointer to hard coded address" { | 205 | test "compile time slice of pointer to hard coded address" { |
| 207 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 206 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 208 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; | 207 | if (builtin.zig_backend == .stage1) return error.SkipZigTest; |
| 209 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 210 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | 208 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 211 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; | 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,7 +926,6 @@ test "anonymous struct literal syntax" { |
| 926 | 926 | ||
| 927 | test "fully anonymous struct" { | 927 | test "fully anonymous struct" { |
| 928 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | const S = struct { | 930 | const S = struct { |
| 932 | fn doTheTest() !void { | 931 | fn doTheTest() !void { |
| ... | @@ -951,7 +950,6 @@ test "fully anonymous struct" { | ... | @@ -951,7 +950,6 @@ test "fully anonymous struct" { |
| 951 | 950 | ||
| 952 | test "fully anonymous list literal" { | 951 | test "fully anonymous list literal" { |
| 953 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | const S = struct { | 954 | const S = struct { |
| 957 | fn doTheTest() !void { | 955 | fn doTheTest() !void { |
test/behavior/struct_contains_null_ptr_itself.zig-1| ... | @@ -3,7 +3,6 @@ const expect = std.testing.expect; | ... | @@ -3,7 +3,6 @@ const expect = std.testing.expect; |
| 3 | const builtin = @import("builtin"); | 3 | const builtin = @import("builtin"); |
| 4 | 4 | ||
| 5 | test "struct contains null pointer which contains original struct" { | 5 | test "struct contains null pointer which contains original struct" { |
| 6 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 7 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 6 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 8 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; | 7 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; |
| 9 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 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,7 +468,6 @@ test "Type.Union from Type.Enum" { |
| 468 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 468 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 469 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 470 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 471 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 472 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 471 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 473 | 472 | ||
| 474 | const Tag = @Type(.{ | 473 | const Tag = @Type(.{ |
| ... | @@ -500,7 +499,6 @@ test "Type.Union from regular enum" { | ... | @@ -500,7 +499,6 @@ test "Type.Union from regular enum" { |
| 500 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO | 499 | if (builtin.zig_backend == .stage2_wasm) return error.SkipZigTest; // TODO |
| 501 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 500 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 502 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO | 501 | if (builtin.zig_backend == .stage2_x86_64) return error.SkipZigTest; // TODO |
| 503 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 504 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 502 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 505 | 503 | ||
| 506 | const E = enum { working_as_expected }; | 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,7 +385,6 @@ extern fn foo(a: usize, b: bool, ...) callconv(.C) usize; |
| 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; | 385 | extern fn fooAligned(a: usize, b: bool, ...) align(4) callconv(.C) usize; |
| 386 | 386 | ||
| 387 | test "type info: generic function types" { | 387 | test "type info: generic function types" { |
| 388 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 389 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 388 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 390 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; | 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,7 +14,6 @@ fn add(args: anytype) i32 { |
| 14 | 14 | ||
| 15 | test "add arbitrary args" { | 15 | test "add arbitrary args" { |
| 16 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10); | 18 | try expect(add(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10); |
| 20 | try expect(add(.{@as(i32, 1234)}) == 1234); | 19 | try expect(add(.{@as(i32, 1234)}) == 1234); |
| ... | @@ -27,14 +26,12 @@ fn readFirstVarArg(args: anytype) void { | ... | @@ -27,14 +26,12 @@ fn readFirstVarArg(args: anytype) void { |
| 27 | 26 | ||
| 28 | test "send void arg to var args" { | 27 | test "send void arg to var args" { |
| 29 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | readFirstVarArg(.{{}}); | 30 | readFirstVarArg(.{{}}); |
| 33 | } | 31 | } |
| 34 | 32 | ||
| 35 | test "pass args directly" { | 33 | test "pass args directly" { |
| 36 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 34 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO |
| 37 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; // TODO | ||
| 38 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO | 35 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; // TODO |
| 39 | 36 | ||
| 40 | try expect(addSomeStuff(.{ @as(i32, 1), @as(i32, 2), @as(i32, 3), @as(i32, 4) }) == 10); | 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,7 +86,6 @@ fn foo2(args: anytype) bool { |
| 89 | 86 | ||
| 90 | test "array of var args functions" { | 87 | test "array of var args functions" { |
| 91 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | try expect(foos[0](.{})); | 90 | try expect(foos[0](.{})); |
| 95 | try expect(!foos[1](.{})); | 91 | try expect(!foos[1](.{})); |
| ... | @@ -97,7 +93,6 @@ test "array of var args functions" { | ... | @@ -97,7 +93,6 @@ test "array of var args functions" { |
| 97 | 93 | ||
| 98 | test "pass zero length array to var args param" { | 94 | test "pass zero length array to var args param" { |
| 99 | if (builtin.zig_backend == .stage2_c) return error.SkipZigTest; // TODO | 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 | doNothingWithFirstArg(.{""}); | 97 | doNothingWithFirstArg(.{""}); |
| 103 | } | 98 | } |
test/behavior/void.zig-1| ... | @@ -19,7 +19,6 @@ test "compare void with void compile time known" { | ... | @@ -19,7 +19,6 @@ test "compare void with void compile time known" { |
| 19 | } | 19 | } |
| 20 | 20 | ||
| 21 | test "iterate over a void slice" { | 21 | test "iterate over a void slice" { |
| 22 | if (builtin.zig_backend == .stage2_arm) return error.SkipZigTest; | ||
| 23 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; | 22 | if (builtin.zig_backend == .stage2_aarch64) return error.SkipZigTest; |
| 24 | 23 | ||
| 25 | var j: usize = 0; | 24 | var j: usize = 0; |