Merge pull request #18906 from jacobly0/x86_64-tests
x86_64: pass more tests
This commit is contained in:
@@ -4140,9 +4140,7 @@ fn airCmpOp(
|
||||
if (need_cast) try writer.writeAll("(void*)");
|
||||
try f.writeCValue(writer, lhs, .Other);
|
||||
try v.elem(f, writer);
|
||||
try writer.writeByte(' ');
|
||||
try writer.writeAll(compareOperatorC(operator));
|
||||
try writer.writeByte(' ');
|
||||
if (need_cast) try writer.writeAll("(void*)");
|
||||
try f.writeCValue(writer, rhs, .Other);
|
||||
try v.elem(f, writer);
|
||||
@@ -4181,41 +4179,28 @@ fn airEquality(
|
||||
const writer = f.object.writer();
|
||||
const inst_ty = f.typeOfIndex(inst);
|
||||
const local = try f.allocLocal(inst, inst_ty);
|
||||
const a = try Assignment.start(f, writer, inst_ty);
|
||||
try f.writeCValue(writer, local, .Other);
|
||||
try writer.writeAll(" = ");
|
||||
try a.assign(f, writer);
|
||||
|
||||
if (operand_ty.zigTypeTag(mod) == .Optional and !operand_ty.optionalReprIsPayload(mod)) {
|
||||
// (A && B) || (C && (A == B))
|
||||
// A = lhs.is_null ; B = rhs.is_null ; C = rhs.payload == lhs.payload
|
||||
|
||||
switch (operator) {
|
||||
.eq => {},
|
||||
.neq => try writer.writeByte('!'),
|
||||
else => unreachable,
|
||||
}
|
||||
try writer.writeAll("((");
|
||||
try f.writeCValueMember(writer, lhs, .{ .identifier = "is_null" });
|
||||
try writer.writeAll(" || ");
|
||||
try f.writeCValueMember(writer, rhs, .{ .identifier = "is_null" });
|
||||
try writer.writeAll(" ? ");
|
||||
try f.writeCValueMember(writer, lhs, .{ .identifier = "is_null" });
|
||||
try writer.writeAll(compareOperatorC(operator));
|
||||
try f.writeCValueMember(writer, rhs, .{ .identifier = "is_null" });
|
||||
try writer.writeAll(" : ");
|
||||
try f.writeCValueMember(writer, lhs, .{ .identifier = "payload" });
|
||||
try writer.writeAll(compareOperatorC(operator));
|
||||
try f.writeCValueMember(writer, rhs, .{ .identifier = "payload" });
|
||||
} else {
|
||||
try f.writeCValue(writer, lhs, .Other);
|
||||
try writer.writeAll(".is_null && ");
|
||||
try writer.writeAll(compareOperatorC(operator));
|
||||
try f.writeCValue(writer, rhs, .Other);
|
||||
try writer.writeAll(".is_null) || (");
|
||||
try f.writeCValue(writer, lhs, .Other);
|
||||
try writer.writeAll(".payload == ");
|
||||
try f.writeCValue(writer, rhs, .Other);
|
||||
try writer.writeAll(".payload && ");
|
||||
try f.writeCValue(writer, lhs, .Other);
|
||||
try writer.writeAll(".is_null == ");
|
||||
try f.writeCValue(writer, rhs, .Other);
|
||||
try writer.writeAll(".is_null));\n");
|
||||
|
||||
return local;
|
||||
}
|
||||
|
||||
try f.writeCValue(writer, lhs, .Other);
|
||||
try writer.writeByte(' ');
|
||||
try writer.writeAll(compareOperatorC(operator));
|
||||
try writer.writeByte(' ');
|
||||
try f.writeCValue(writer, rhs, .Other);
|
||||
try writer.writeAll(";\n");
|
||||
try a.end(f, writer);
|
||||
|
||||
return local;
|
||||
}
|
||||
@@ -6109,41 +6094,48 @@ fn airFloatCast(f: *Function, inst: Air.Inst.Index) !CValue {
|
||||
const ty_op = f.air.instructions.items(.data)[@intFromEnum(inst)].ty_op;
|
||||
|
||||
const inst_ty = f.typeOfIndex(inst);
|
||||
const inst_scalar_ty = inst_ty.scalarType(mod);
|
||||
const operand = try f.resolveInst(ty_op.operand);
|
||||
try reap(f, inst, &.{ty_op.operand});
|
||||
const operand_ty = f.typeOf(ty_op.operand);
|
||||
const scalar_ty = operand_ty.scalarType(mod);
|
||||
const target = f.object.dg.module.getTarget();
|
||||
const operation = if (inst_ty.isRuntimeFloat() and operand_ty.isRuntimeFloat())
|
||||
if (inst_ty.floatBits(target) < operand_ty.floatBits(target)) "trunc" else "extend"
|
||||
else if (inst_ty.isInt(mod) and operand_ty.isRuntimeFloat())
|
||||
if (inst_ty.isSignedInt(mod)) "fix" else "fixuns"
|
||||
else if (inst_ty.isRuntimeFloat() and operand_ty.isInt(mod))
|
||||
if (operand_ty.isSignedInt(mod)) "float" else "floatun"
|
||||
const operation = if (inst_scalar_ty.isRuntimeFloat() and scalar_ty.isRuntimeFloat())
|
||||
if (inst_scalar_ty.floatBits(target) < scalar_ty.floatBits(target)) "trunc" else "extend"
|
||||
else if (inst_scalar_ty.isInt(mod) and scalar_ty.isRuntimeFloat())
|
||||
if (inst_scalar_ty.isSignedInt(mod)) "fix" else "fixuns"
|
||||
else if (inst_scalar_ty.isRuntimeFloat() and scalar_ty.isInt(mod))
|
||||
if (scalar_ty.isSignedInt(mod)) "float" else "floatun"
|
||||
else
|
||||
unreachable;
|
||||
|
||||
const writer = f.object.writer();
|
||||
const local = try f.allocLocal(inst, inst_ty);
|
||||
const v = try Vectorize.start(f, inst, writer, operand_ty);
|
||||
const a = try Assignment.start(f, writer, scalar_ty);
|
||||
try f.writeCValue(writer, local, .Other);
|
||||
|
||||
try writer.writeAll(" = ");
|
||||
if (inst_ty.isInt(mod) and operand_ty.isRuntimeFloat()) {
|
||||
try v.elem(f, writer);
|
||||
try a.assign(f, writer);
|
||||
if (inst_scalar_ty.isInt(mod) and scalar_ty.isRuntimeFloat()) {
|
||||
try writer.writeAll("zig_wrap_");
|
||||
try f.object.dg.renderTypeForBuiltinFnName(writer, inst_ty);
|
||||
try f.object.dg.renderTypeForBuiltinFnName(writer, inst_scalar_ty);
|
||||
try writer.writeByte('(');
|
||||
}
|
||||
try writer.writeAll("zig_");
|
||||
try writer.writeAll(operation);
|
||||
try writer.writeAll(compilerRtAbbrev(operand_ty, mod));
|
||||
try writer.writeAll(compilerRtAbbrev(inst_ty, mod));
|
||||
try writer.writeAll(compilerRtAbbrev(scalar_ty, mod));
|
||||
try writer.writeAll(compilerRtAbbrev(inst_scalar_ty, mod));
|
||||
try writer.writeByte('(');
|
||||
try f.writeCValue(writer, operand, .FunctionArgument);
|
||||
try v.elem(f, writer);
|
||||
try writer.writeByte(')');
|
||||
if (inst_ty.isInt(mod) and operand_ty.isRuntimeFloat()) {
|
||||
try f.object.dg.renderBuiltinInfo(writer, inst_ty, .bits);
|
||||
if (inst_scalar_ty.isInt(mod) and scalar_ty.isRuntimeFloat()) {
|
||||
try f.object.dg.renderBuiltinInfo(writer, inst_scalar_ty, .bits);
|
||||
try writer.writeByte(')');
|
||||
}
|
||||
try writer.writeAll(";\n");
|
||||
try a.end(f, writer);
|
||||
try v.end(f, inst, writer);
|
||||
|
||||
return local;
|
||||
}
|
||||
|
||||
@@ -6315,7 +6307,7 @@ fn airCmpBuiltinCall(
|
||||
try v.elem(f, writer);
|
||||
try f.object.dg.renderBuiltinInfo(writer, scalar_ty, info);
|
||||
try writer.writeByte(')');
|
||||
if (!ref_ret) try writer.print(" {s} {}", .{
|
||||
if (!ref_ret) try writer.print("{s}{}", .{
|
||||
compareOperatorC(operator),
|
||||
try f.fmtIntLiteral(Type.i32, try mod.intValue(Type.i32, 0)),
|
||||
});
|
||||
@@ -7661,12 +7653,12 @@ fn compareOperatorAbbrev(operator: std.math.CompareOperator) []const u8 {
|
||||
|
||||
fn compareOperatorC(operator: std.math.CompareOperator) []const u8 {
|
||||
return switch (operator) {
|
||||
.lt => "<",
|
||||
.lte => "<=",
|
||||
.eq => "==",
|
||||
.gte => ">=",
|
||||
.gt => ">",
|
||||
.neq => "!=",
|
||||
.lt => " < ",
|
||||
.lte => " <= ",
|
||||
.eq => " == ",
|
||||
.gte => " >= ",
|
||||
.gt => " > ",
|
||||
.neq => " != ",
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -8646,8 +8646,6 @@ pub const FuncGen = struct {
|
||||
const operand_ty = self.typeOf(ty_op.operand);
|
||||
const dest_ty = self.typeOfIndex(inst);
|
||||
const target = mod.getTarget();
|
||||
const dest_bits = dest_ty.floatBits(target);
|
||||
const src_bits = operand_ty.floatBits(target);
|
||||
|
||||
if (intrinsicsAllowed(dest_ty, target) and intrinsicsAllowed(operand_ty, target)) {
|
||||
return self.wip.cast(.fpext, operand, try o.lowerType(dest_ty), "");
|
||||
@@ -8655,11 +8653,19 @@ pub const FuncGen = struct {
|
||||
const operand_llvm_ty = try o.lowerType(operand_ty);
|
||||
const dest_llvm_ty = try o.lowerType(dest_ty);
|
||||
|
||||
const dest_bits = dest_ty.scalarType(mod).floatBits(target);
|
||||
const src_bits = operand_ty.scalarType(mod).floatBits(target);
|
||||
const fn_name = try o.builder.fmt("__extend{s}f{s}f2", .{
|
||||
compilerRtFloatAbbrev(src_bits), compilerRtFloatAbbrev(dest_bits),
|
||||
});
|
||||
|
||||
const libc_fn = try self.getLibcFunction(fn_name, &.{operand_llvm_ty}, dest_llvm_ty);
|
||||
if (dest_ty.isVector(mod)) return self.buildElementwiseCall(
|
||||
libc_fn,
|
||||
&.{operand},
|
||||
try o.builder.poisonValue(dest_llvm_ty),
|
||||
dest_ty.vectorLen(mod),
|
||||
);
|
||||
return self.wip.call(
|
||||
.normal,
|
||||
.ccc,
|
||||
|
||||
Reference in New Issue
Block a user