| ... | @@ -4413,7 +4413,34 @@ fn intFromFloat(cg: *CodeGen, dest_ty: IntType, src_ty: FloatType, operand: WVal | ... | @@ -4413,7 +4413,34 @@ fn intFromFloat(cg: *CodeGen, dest_ty: IntType, src_ty: FloatType, operand: WVal |
| 4413 | return cg.callIntrinsic(intrinsic, &.{.f128_type}, Type.u128, &.{operand}); | 4413 | return cg.callIntrinsic(intrinsic, &.{.f128_type}, Type.u128, &.{operand}); |
| 4414 | }, | 4414 | }, |
| 4415 | }, | 4415 | }, |
| 4416 | else => return cg.fail("TODO: Support intFromFloat for integer bitsize: {d}", .{dest_ty.bits}), | 4416 | else => { |
| | 4417 | const result = try cg.allocInt(dest_ty); |
| | 4418 | |
| | 4419 | switch (src_ty) { |
| | 4420 | .f16 => { |
| | 4421 | const intrinsic: Mir.Intrinsic = if (dest_ty.is_signed) .__fixhfei else .__fixunshfei; |
| | 4422 | _ = try cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type, .f16_type }, .void, &.{ result, .{ .imm32 = dest_ty.bits }, operand }); |
| | 4423 | }, |
| | 4424 | .f32 => { |
| | 4425 | const intrinsic: Mir.Intrinsic = if (dest_ty.is_signed) .__fixsfei else .__fixunssfei; |
| | 4426 | _ = try cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type, .f32_type }, .void, &.{ result, .{ .imm32 = dest_ty.bits }, operand }); |
| | 4427 | }, |
| | 4428 | .f64 => { |
| | 4429 | const intrinsic: Mir.Intrinsic = if (dest_ty.is_signed) .__fixdfei else .__fixunsdfei; |
| | 4430 | _ = try cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type, .f64_type }, .void, &.{ result, .{ .imm32 = dest_ty.bits }, operand }); |
| | 4431 | }, |
| | 4432 | .f80 => { |
| | 4433 | const intrinsic: Mir.Intrinsic = if (dest_ty.is_signed) .__fixxfei else .__fixunsxfei; |
| | 4434 | _ = try cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type, .f80_type }, .void, &.{ result, .{ .imm32 = dest_ty.bits }, operand }); |
| | 4435 | }, |
| | 4436 | .f128 => { |
| | 4437 | const intrinsic: Mir.Intrinsic = if (dest_ty.is_signed) .__fixtfei else .__fixunstfei; |
| | 4438 | _ = try cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type, .f128_type }, .void, &.{ result, .{ .imm32 = dest_ty.bits }, operand }); |
| | 4439 | }, |
| | 4440 | } |
| | 4441 | |
| | 4442 | return result; |
| | 4443 | }, |
| 4417 | } | 4444 | } |
| 4418 | } | 4445 | } |
| 4419 | | 4446 | |
| ... | @@ -4433,7 +4460,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal | ... | @@ -4433,7 +4460,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal |
| 4433 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattihf else .__floatuntihf; | 4460 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattihf else .__floatuntihf; |
| 4434 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f16, &.{operand}); | 4461 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f16, &.{operand}); |
| 4435 | }, | 4462 | }, |
| 4436 | else => return cg.fail("TODO: Support floatFromInt for {d}-bit int to 16-bit float", .{src_ty.bits}), | 4463 | else => { |
| | 4464 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floateihf else .__floatuneihf; |
| | 4465 | return cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type }, Type.f16, &.{ operand, .{ .imm32 = src_ty.bits }}); |
| | 4466 | }, |
| 4437 | }, | 4467 | }, |
| 4438 | .f32 => switch (src_ty.bits) { | 4468 | .f32 => switch (src_ty.bits) { |
| 4439 | 0 => unreachable, | 4469 | 0 => unreachable, |
| ... | @@ -4451,7 +4481,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal | ... | @@ -4451,7 +4481,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal |
| 4451 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattisf else .__floatuntisf; | 4481 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattisf else .__floatuntisf; |
| 4452 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f32, &.{operand}); | 4482 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f32, &.{operand}); |
| 4453 | }, | 4483 | }, |
| 4454 | else => return cg.fail("TODO: Support floatFromInt for {d}-bit int to 32-bit float", .{src_ty.bits}), | 4484 | else => { |
| | 4485 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floateisf else .__floatuneisf; |
| | 4486 | return cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type }, Type.f32, &.{ operand, .{ .imm32 = src_ty.bits }}); |
| | 4487 | }, |
| 4455 | }, | 4488 | }, |
| 4456 | .f64 => switch (src_ty.bits) { | 4489 | .f64 => switch (src_ty.bits) { |
| 4457 | 0 => unreachable, | 4490 | 0 => unreachable, |
| ... | @@ -4469,7 +4502,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal | ... | @@ -4469,7 +4502,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal |
| 4469 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattidf else .__floatuntidf; | 4502 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattidf else .__floatuntidf; |
| 4470 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f64, &.{operand}); | 4503 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f64, &.{operand}); |
| 4471 | }, | 4504 | }, |
| 4472 | else => return cg.fail("TODO: Support floatFromInt for {d}-bit int to 64-bit float", .{src_ty.bits}), | 4505 | else => { |
| | 4506 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floateidf else .__floatuneidf; |
| | 4507 | return cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type }, Type.f64, &.{ operand, .{ .imm32 = src_ty.bits }}); |
| | 4508 | }, |
| 4473 | }, | 4509 | }, |
| 4474 | .f80 => switch (src_ty.bits) { | 4510 | .f80 => switch (src_ty.bits) { |
| 4475 | 0 => unreachable, | 4511 | 0 => unreachable, |
| ... | @@ -4485,7 +4521,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal | ... | @@ -4485,7 +4521,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal |
| 4485 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattixf else .__floatuntixf; | 4521 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattixf else .__floatuntixf; |
| 4486 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f80, &.{operand}); | 4522 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f80, &.{operand}); |
| 4487 | }, | 4523 | }, |
| 4488 | else => return cg.fail("TODO: Support floatFromInt for {d}-bit int to 80-bit float", .{src_ty.bits}), | 4524 | else => { |
| | 4525 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floateixf else .__floatuneixf; |
| | 4526 | return cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type }, Type.f80, &.{ operand, .{ .imm32 = src_ty.bits }}); |
| | 4527 | }, |
| 4489 | }, | 4528 | }, |
| 4490 | .f128 => switch (src_ty.bits) { | 4529 | .f128 => switch (src_ty.bits) { |
| 4491 | 0 => unreachable, | 4530 | 0 => unreachable, |
| ... | @@ -4501,7 +4540,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal | ... | @@ -4501,7 +4540,10 @@ fn floatFromInt(cg: *CodeGen, dest_ty: FloatType, src_ty: IntType, operand: WVal |
| 4501 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattitf else .__floatuntitf; | 4540 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floattitf else .__floatuntitf; |
| 4502 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f128, &.{operand}); | 4541 | return cg.callIntrinsic(intrinsic, &.{.i128_type}, Type.f128, &.{operand}); |
| 4503 | }, | 4542 | }, |
| 4504 | else => return cg.fail("TODO: Support floatFromInt for {d}-bit int to 128-bit float", .{src_ty.bits}), | 4543 | else => { |
| | 4544 | const intrinsic: Mir.Intrinsic = if (src_ty.is_signed) .__floateitf else .__floatuneitf; |
| | 4545 | return cg.callIntrinsic(intrinsic, &.{ .usize_type, .usize_type }, Type.f128, &.{ operand, .{ .imm32 = src_ty.bits }}); |
| | 4546 | }, |
| 4505 | }, | 4547 | }, |
| 4506 | } | 4548 | } |
| 4507 | } | 4549 | } |