| ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 5 |
| ; RUN: llc -verify-machineinstrs -mtriple=aarch64 < %s | FileCheck %s |
| |
| define void @f32_to_u8(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_u8: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzu s0, s0 |
| ; CHECK-NEXT: str b0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptoui float %f to i32 |
| %trunc = trunc i32 %conv to i8 |
| store i8 %trunc, ptr %dst |
| ret void |
| } |
| |
| define void @f32_to_s8(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_s8: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs s0, s0 |
| ; CHECK-NEXT: str b0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptosi float %f to i32 |
| %trunc = trunc i32 %conv to i8 |
| store i8 %trunc, ptr %dst |
| ret void |
| } |
| |
| define void @f32_to_u16(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_u16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzu s0, s0 |
| ; CHECK-NEXT: str h0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptoui float %f to i32 |
| %trunc = trunc i32 %conv to i16 |
| store i16 %trunc, ptr %dst |
| ret void |
| } |
| |
| define void @f32_to_s16(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_s16: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs s0, s0 |
| ; CHECK-NEXT: str h0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptosi float %f to i32 |
| %trunc = trunc i32 %conv to i16 |
| store i16 %trunc, ptr %dst |
| ret void |
| } |
| |
| define void @f32_to_u32(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_u32: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzu s0, s0 |
| ; CHECK-NEXT: str s0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptoui float %f to i32 |
| store i32 %conv, ptr %dst |
| ret void |
| } |
| |
| define void @f32_to_s32(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_s32: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs s0, s0 |
| ; CHECK-NEXT: str s0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptosi float %f to i32 |
| store i32 %conv, ptr %dst |
| ret void |
| } |
| |
| define void @f64_to_u64(double %d, ptr %dst) { |
| ; CHECK-LABEL: f64_to_u64: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzu d0, d0 |
| ; CHECK-NEXT: str d0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptoui double %d to i64 |
| store i64 %conv, ptr %dst |
| ret void |
| } |
| |
| define void @f64_to_s64(double %d, ptr %dst) { |
| ; CHECK-LABEL: f64_to_s64: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs d0, d0 |
| ; CHECK-NEXT: str d0, [x0] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptosi double %d to i64 |
| store i64 %conv, ptr %dst |
| ret void |
| } |
| |
| define i32 @f32_to_i32_multiple_uses(float %f, ptr %dst) { |
| ; CHECK-LABEL: f32_to_i32_multiple_uses: |
| ; CHECK: // %bb.0: // %entry |
| ; CHECK-NEXT: fcvtzs w8, s0 |
| ; CHECK-NEXT: mov x9, x0 |
| ; CHECK-NEXT: mov w0, w8 |
| ; CHECK-NEXT: strb w8, [x9] |
| ; CHECK-NEXT: ret |
| entry: |
| %conv = fptosi float %f to i32 |
| %trunc = trunc i32 %conv to i8 |
| store i8 %trunc, ptr %dst |
| ret i32 %conv |
| } |