| ... | @@ -5100,11 +5100,11 @@ pub const FuncGen = struct { | ... | @@ -5100,11 +5100,11 @@ pub const FuncGen = struct { |
| 5100 | .memcpy => try self.airMemcpy(inst), | 5100 | .memcpy => try self.airMemcpy(inst), |
| 5101 | .set_union_tag => try self.airSetUnionTag(inst), | 5101 | .set_union_tag => try self.airSetUnionTag(inst), |
| 5102 | .get_union_tag => try self.airGetUnionTag(inst), | 5102 | .get_union_tag => try self.airGetUnionTag(inst), |
| 5103 | .clz => try self.airClzCtz(inst, "llvm.ctlz"), | 5103 | .clz => try self.airClzCtz(inst, .@"llvm.ctlz."), |
| 5104 | .ctz => try self.airClzCtz(inst, "llvm.cttz"), | 5104 | .ctz => try self.airClzCtz(inst, .@"llvm.cttz."), |
| 5105 | .popcount => try self.airBitOp(inst, "llvm.ctpop"), | 5105 | .popcount => try self.airBitOp(inst, .@"llvm.ctpop."), |
| 5106 | .byte_swap => try self.airByteSwap(inst, "llvm.bswap"), | 5106 | .byte_swap => try self.airByteSwap(inst), |
| 5107 | .bit_reverse => try self.airBitOp(inst, "llvm.bitreverse"), | 5107 | .bit_reverse => try self.airBitOp(inst, .@"llvm.bitreverse."), |
| 5108 | .tag_name => try self.airTagName(inst), | 5108 | .tag_name => try self.airTagName(inst), |
| 5109 | .error_name => try self.airErrorName(inst), | 5109 | .error_name => try self.airErrorName(inst), |
| 5110 | .splat => try self.airSplat(inst), | 5110 | .splat => try self.airSplat(inst), |
| ... | @@ -9526,64 +9526,29 @@ pub const FuncGen = struct { | ... | @@ -9526,64 +9526,29 @@ pub const FuncGen = struct { |
| 9526 | return self.buildFloatOp(.neg, operand_ty, 1, .{operand}); | 9526 | return self.buildFloatOp(.neg, operand_ty, 1, .{operand}); |
| 9527 | } | 9527 | } |
| 9528 | | 9528 | |
| 9529 | fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value { | 9529 | fn airClzCtz(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value { |
| 9530 | const o = self.dg.object; | 9530 | const o = self.dg.object; |
| 9531 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | 9531 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 9532 | const operand_ty = self.typeOf(ty_op.operand); | | |
| 9533 | const operand = try self.resolveInst(ty_op.operand); | 9532 | const operand = try self.resolveInst(ty_op.operand); |
| 9534 | | 9533 | |
| 9535 | const llvm_operand_ty = try o.lowerType(operand_ty); | 9534 | const wrong_size_result = try self.wip.bin(intrinsic, operand, (try o.builder.intConst(.i1, 0)).toValue(), ""); |
| 9536 | const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{ llvm_operand_ty, .i1 }, .normal); | | |
| 9537 | const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty}); | | |
| 9538 | | 9535 | |
| 9539 | const params = [_]*llvm.Value{ | | |
| 9540 | operand.toLlvm(&self.wip), | | |
| 9541 | Builder.Constant.false.toLlvm(&o.builder), | | |
| 9542 | }; | | |
| 9543 | const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish( | | |
| 9544 | self.builder.buildCallOld( | | |
| 9545 | llvm_fn_ty.toLlvm(&o.builder), | | |
| 9546 | fn_val, | | |
| 9547 | &params, | | |
| 9548 | params.len, | | |
| 9549 | .C, | | |
| 9550 | .Auto, | | |
| 9551 | "", | | |
| 9552 | ), | | |
| 9553 | &self.wip, | | |
| 9554 | ); | | |
| 9555 | const result_ty = self.typeOfIndex(inst); | 9536 | const result_ty = self.typeOfIndex(inst); |
| 9556 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); | 9537 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); |
| 9557 | } | 9538 | } |
| 9558 | | 9539 | |
| 9559 | fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value { | 9540 | fn airBitOp(self: *FuncGen, inst: Air.Inst.Index, intrinsic: Builder.Function.Instruction.Tag) !Builder.Value { |
| 9560 | const o = self.dg.object; | 9541 | const o = self.dg.object; |
| 9561 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | 9542 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 9562 | const operand_ty = self.typeOf(ty_op.operand); | | |
| 9563 | const operand = try self.resolveInst(ty_op.operand); | 9543 | const operand = try self.resolveInst(ty_op.operand); |
| 9564 | | 9544 | |
| 9565 | const llvm_operand_ty = try o.lowerType(operand_ty); | 9545 | const wrong_size_result = try self.wip.un(intrinsic, operand, ""); |
| 9566 | const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal); | | |
| 9567 | const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty}); | | |
| 9568 | | 9546 | |
| 9569 | const params = [_]*llvm.Value{operand.toLlvm(&self.wip)}; | | |
| 9570 | const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish( | | |
| 9571 | self.builder.buildCallOld( | | |
| 9572 | llvm_fn_ty.toLlvm(&o.builder), | | |
| 9573 | fn_val, | | |
| 9574 | &params, | | |
| 9575 | params.len, | | |
| 9576 | .C, | | |
| 9577 | .Auto, | | |
| 9578 | "", | | |
| 9579 | ), | | |
| 9580 | &self.wip, | | |
| 9581 | ); | | |
| 9582 | const result_ty = self.typeOfIndex(inst); | 9547 | const result_ty = self.typeOfIndex(inst); |
| 9583 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); | 9548 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); |
| 9584 | } | 9549 | } |
| 9585 | | 9550 | |
| 9586 | fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index, llvm_fn_name: []const u8) !Builder.Value { | 9551 | fn airByteSwap(self: *FuncGen, inst: Air.Inst.Index) !Builder.Value { |
| 9587 | const o = self.dg.object; | 9552 | const o = self.dg.object; |
| 9588 | const mod = o.module; | 9553 | const mod = o.module; |
| 9589 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; | 9554 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| ... | @@ -9611,22 +9576,7 @@ pub const FuncGen = struct { | ... | @@ -9611,22 +9576,7 @@ pub const FuncGen = struct { |
| 9611 | bits = bits + 8; | 9576 | bits = bits + 8; |
| 9612 | } | 9577 | } |
| 9613 | | 9578 | |
| 9614 | const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal); | 9579 | const wrong_size_result = try self.wip.un(.@"llvm.bswap.", operand, ""); |
| 9615 | const fn_val = try self.getIntrinsic(llvm_fn_name, &.{llvm_operand_ty}); | | |
| 9616 | | | |
| 9617 | const params = [_]*llvm.Value{operand.toLlvm(&self.wip)}; | | |
| 9618 | const wrong_size_result = (try self.wip.unimplemented(llvm_operand_ty, "")).finish( | | |
| 9619 | self.builder.buildCallOld( | | |
| 9620 | llvm_fn_ty.toLlvm(&o.builder), | | |
| 9621 | fn_val, | | |
| 9622 | &params, | | |
| 9623 | params.len, | | |
| 9624 | .C, | | |
| 9625 | .Auto, | | |
| 9626 | "", | | |
| 9627 | ), | | |
| 9628 | &self.wip, | | |
| 9629 | ); | | |
| 9630 | | 9580 | |
| 9631 | const result_ty = self.typeOfIndex(inst); | 9581 | const result_ty = self.typeOfIndex(inst); |
| 9632 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); | 9582 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); |