Sema: introduce all_vector_instructions backend feature
Sema is arbitrarily scalarizing some operations, which means that when I try to implement vectorized versions of those operations in a backend, they are impossible to test due to Sema not producing them. Now, I can implement them and then temporarily enable the new feature for that backend in order to test them. Once the backend supports all of them, the feature can be permanently enabled. This also deletes the Air instructions `int_from_bool` and `int_from_ptr`, which are just bitcasts with a fixed result type, since changing `un_op` to `ty_op` takes up the same amount of memory.
This commit is contained in:
@@ -5154,7 +5154,6 @@ pub const FuncGen = struct {
|
||||
.ret_ptr => try self.airRetPtr(inst),
|
||||
.arg => try self.airArg(inst),
|
||||
.bitcast => try self.airBitCast(inst),
|
||||
.int_from_bool => try self.airIntFromBool(inst),
|
||||
.breakpoint => try self.airBreakpoint(inst),
|
||||
.ret_addr => try self.airRetAddr(inst),
|
||||
.frame_addr => try self.airFrameAddress(inst),
|
||||
@@ -5167,7 +5166,6 @@ pub const FuncGen = struct {
|
||||
.trunc => try self.airTrunc(inst),
|
||||
.fptrunc => try self.airFptrunc(inst),
|
||||
.fpext => try self.airFpext(inst),
|
||||
.int_from_ptr => try self.airIntFromPtr(inst),
|
||||
.load => try self.airLoad(body[i..]),
|
||||
.not => try self.airNot(inst),
|
||||
.store => try self.airStore(inst, false),
|
||||
@@ -9435,16 +9433,6 @@ pub const FuncGen = struct {
|
||||
}
|
||||
}
|
||||
|
||||
fn airIntFromPtr(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
|
||||
const o = self.ng.object;
|
||||
const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op;
|
||||
const operand = try self.resolveInst(un_op);
|
||||
const ptr_ty = self.typeOf(un_op);
|
||||
const operand_ptr = try self.sliceOrArrayPtr(operand, ptr_ty);
|
||||
const dest_llvm_ty = try o.lowerType(self.typeOfIndex(inst));
|
||||
return self.wip.cast(.ptrtoint, operand_ptr, dest_llvm_ty, "");
|
||||
}
|
||||
|
||||
fn airBitCast(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
|
||||
const ty_op = self.air.instructions.items(.data)[@intFromEnum(inst)].ty_op;
|
||||
const operand_ty = self.typeOf(ty_op.operand);
|
||||
@@ -9476,6 +9464,10 @@ pub const FuncGen = struct {
|
||||
return self.wip.cast(.inttoptr, operand, llvm_dest_ty, "");
|
||||
}
|
||||
|
||||
if (operand_ty.isPtrAtRuntime(zcu) and inst_ty.zigTypeTag(zcu) == .int) {
|
||||
return self.wip.cast(.ptrtoint, operand, llvm_dest_ty, "");
|
||||
}
|
||||
|
||||
if (operand_ty.zigTypeTag(zcu) == .vector and inst_ty.zigTypeTag(zcu) == .array) {
|
||||
const elem_ty = operand_ty.childType(zcu);
|
||||
if (!result_is_ref) {
|
||||
@@ -9564,12 +9556,6 @@ pub const FuncGen = struct {
|
||||
return self.wip.cast(.bitcast, operand, llvm_dest_ty, "");
|
||||
}
|
||||
|
||||
fn airIntFromBool(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
|
||||
const un_op = self.air.instructions.items(.data)[@intFromEnum(inst)].un_op;
|
||||
const operand = try self.resolveInst(un_op);
|
||||
return operand;
|
||||
}
|
||||
|
||||
fn airArg(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value {
|
||||
const o = self.ng.object;
|
||||
const pt = o.pt;
|
||||
|
||||
Reference in New Issue
Block a user