| ... | ... | @@ -5100,11 +5100,11 @@ pub const FuncGen = struct { |
| 5100 | 5100 | .memcpy => try self.airMemcpy(inst), |
| 5101 | 5101 | .set_union_tag => try self.airSetUnionTag(inst), |
| 5102 | 5102 | .get_union_tag => try self.airGetUnionTag(inst), |
| 5103 | | .clz => try self.airClzCtz(inst, "llvm.ctlz"), |
| 5104 | | .ctz => try self.airClzCtz(inst, "llvm.cttz"), |
| 5105 | | .popcount => try self.airBitOp(inst, "llvm.ctpop"), |
| 5106 | | .byte_swap => try self.airByteSwap(inst, "llvm.bswap"), |
| 5107 | | .bit_reverse => try self.airBitOp(inst, "llvm.bitreverse"), |
| 5103 | .clz => try self.airClzCtz(inst, .@"llvm.ctlz."), |
| 5104 | .ctz => try self.airClzCtz(inst, .@"llvm.cttz."), |
| 5105 | .popcount => try self.airBitOp(inst, .@"llvm.ctpop."), |
| 5106 | .byte_swap => try self.airByteSwap(inst), |
| 5107 | .bit_reverse => try self.airBitOp(inst, .@"llvm.bitreverse."), |
| 5108 | 5108 | .tag_name => try self.airTagName(inst), |
| 5109 | 5109 | .error_name => try self.airErrorName(inst), |
| 5110 | 5110 | .splat => try self.airSplat(inst), |
| ... | ... | @@ -9526,64 +9526,29 @@ pub const FuncGen = struct { |
| 9526 | 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 | 9530 | const o = self.dg.object; |
| 9531 | 9531 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 9532 | | const operand_ty = self.typeOf(ty_op.operand); |
| 9533 | 9532 | const operand = try self.resolveInst(ty_op.operand); |
| 9534 | 9533 | |
| 9535 | | const llvm_operand_ty = try o.lowerType(operand_ty); |
| 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}); |
| 9534 | const wrong_size_result = try self.wip.bin(intrinsic, operand, (try o.builder.intConst(.i1, 0)).toValue(), ""); |
| 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 | 9536 | const result_ty = self.typeOfIndex(inst); |
| 9556 | 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 | 9541 | const o = self.dg.object; |
| 9561 | 9542 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| 9562 | | const operand_ty = self.typeOf(ty_op.operand); |
| 9563 | 9543 | const operand = try self.resolveInst(ty_op.operand); |
| 9564 | 9544 | |
| 9565 | | const llvm_operand_ty = try o.lowerType(operand_ty); |
| 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}); |
| 9545 | const wrong_size_result = try self.wip.un(intrinsic, operand, ""); |
| 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 | 9547 | const result_ty = self.typeOfIndex(inst); |
| 9583 | 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 | 9552 | const o = self.dg.object; |
| 9588 | 9553 | const mod = o.module; |
| 9589 | 9554 | const ty_op = self.air.instructions.items(.data)[inst].ty_op; |
| ... | ... | @@ -9611,22 +9576,7 @@ pub const FuncGen = struct { |
| 9611 | 9576 | bits = bits + 8; |
| 9612 | 9577 | } |
| 9613 | 9578 | |
| 9614 | | const llvm_fn_ty = try o.builder.fnType(llvm_operand_ty, &.{llvm_operand_ty}, .normal); |
| 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 | | ); |
| 9579 | const wrong_size_result = try self.wip.un(.@"llvm.bswap.", operand, ""); |
| 9630 | 9580 | |
| 9631 | 9581 | const result_ty = self.typeOfIndex(inst); |
| 9632 | 9582 | return self.wip.conv(.unsigned, wrong_size_result, try o.lowerType(result_ty), ""); |