| 
5 | 5 | ; RUN: llc -mtriple=arm-unknown-linux-eabi -mattr=+vfp2 < %s | FileCheck -check-prefixes=AAPCS-SOFT,EABI-SOFT %s  | 
6 | 6 | ; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=soft < %s | FileCheck -check-prefix=APCS %s  | 
7 | 7 | ; RUN: llc -mtriple=armv7-unknown-linux -target-abi=apcs -float-abi=hard < %s | FileCheck -check-prefix=APCS %s  | 
 | 8 | +; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 < %s | FileCheck -check-prefix=WATCHABI-HARD %s  | 
 | 9 | +; RUN: llc -mtriple=armv7k-apple-watchos2.0 -mcpu=cortex-a7 -float-abi=soft < %s | FileCheck -check-prefix=WATCHABI-SOFT %s  | 
8 | 10 | 
 
  | 
9 | 11 | define i1 @test(half %self) #0 {  | 
10 | 12 | ; GNU-AAPCS-HARD-LABEL: test:  | 
@@ -72,6 +74,26 @@ define i1 @test(half %self) #0 {  | 
72 | 74 | ; APCS-NEXT:    movwvs r0, #1  | 
73 | 75 | ; APCS-NEXT:    pop {lr}  | 
74 | 76 | ; APCS-NEXT:    bx lr  | 
 | 77 | +;  | 
 | 78 | +; WATCHABI-HARD-LABEL: test:  | 
 | 79 | +; WATCHABI-HARD:       @ %bb.0:  | 
 | 80 | +; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 81 | +; WATCHABI-HARD-NEXT:    mov r0, #0  | 
 | 82 | +; WATCHABI-HARD-NEXT:    vcmp.f32 s0, s0  | 
 | 83 | +; WATCHABI-HARD-NEXT:    vmrs APSR_nzcv, fpscr  | 
 | 84 | +; WATCHABI-HARD-NEXT:    movwvs r0, #1  | 
 | 85 | +; WATCHABI-HARD-NEXT:    bx lr  | 
 | 86 | +;  | 
 | 87 | +; WATCHABI-SOFT-LABEL: test:  | 
 | 88 | +; WATCHABI-SOFT:       @ %bb.0:  | 
 | 89 | +; WATCHABI-SOFT-NEXT:    vmov s0, r0  | 
 | 90 | +; WATCHABI-SOFT-NEXT:    mov r1, #0  | 
 | 91 | +; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 92 | +; WATCHABI-SOFT-NEXT:    vcmp.f32 s0, s0  | 
 | 93 | +; WATCHABI-SOFT-NEXT:    vmrs APSR_nzcv, fpscr  | 
 | 94 | +; WATCHABI-SOFT-NEXT:    movwvs r1, #1  | 
 | 95 | +; WATCHABI-SOFT-NEXT:    mov r0, r1  | 
 | 96 | +; WATCHABI-SOFT-NEXT:    bx lr  | 
75 | 97 |   %_0 = fcmp une half %self, %self  | 
76 | 98 |   ret i1 %_0  | 
77 | 99 | }  | 
@@ -111,6 +133,21 @@ define float @f16_to_f32(ptr %p) #0 {  | 
111 | 133 | ; APCS:       @ %bb.0:  | 
112 | 134 | ; APCS-NEXT:    ldrh r0, [r0]  | 
113 | 135 | ; APCS-NEXT:    b __gnu_h2f_ieee  | 
 | 136 | +;  | 
 | 137 | +; WATCHABI-HARD-LABEL: f16_to_f32:  | 
 | 138 | +; WATCHABI-HARD:       @ %bb.0:  | 
 | 139 | +; WATCHABI-HARD-NEXT:    ldrh r0, [r0]  | 
 | 140 | +; WATCHABI-HARD-NEXT:    vmov s0, r0  | 
 | 141 | +; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 142 | +; WATCHABI-HARD-NEXT:    bx lr  | 
 | 143 | +;  | 
 | 144 | +; WATCHABI-SOFT-LABEL: f16_to_f32:  | 
 | 145 | +; WATCHABI-SOFT:       @ %bb.0:  | 
 | 146 | +; WATCHABI-SOFT-NEXT:    ldrh r0, [r0]  | 
 | 147 | +; WATCHABI-SOFT-NEXT:    vmov s0, r0  | 
 | 148 | +; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 149 | +; WATCHABI-SOFT-NEXT:    vmov r0, s0  | 
 | 150 | +; WATCHABI-SOFT-NEXT:    bx lr  | 
114 | 151 |   %load = load half, ptr %p  | 
115 | 152 |   %cvt = fpext half %load to float  | 
116 | 153 |   ret float %cvt  | 
@@ -169,6 +206,21 @@ define void @f32_to_f16(ptr %p, float %arg) #0 {  | 
169 | 206 | ; APCS-NEXT:    bl __gnu_f2h_ieee  | 
170 | 207 | ; APCS-NEXT:    strh r0, [r4]  | 
171 | 208 | ; APCS-NEXT:    pop {r4, pc}  | 
 | 209 | +;  | 
 | 210 | +; WATCHABI-HARD-LABEL: f32_to_f16:  | 
 | 211 | +; WATCHABI-HARD:       @ %bb.0:  | 
 | 212 | +; WATCHABI-HARD-NEXT:    vcvtb.f16.f32 s0, s0  | 
 | 213 | +; WATCHABI-HARD-NEXT:    vmov r1, s0  | 
 | 214 | +; WATCHABI-HARD-NEXT:    strh r1, [r0]  | 
 | 215 | +; WATCHABI-HARD-NEXT:    bx lr  | 
 | 216 | +;  | 
 | 217 | +; WATCHABI-SOFT-LABEL: f32_to_f16:  | 
 | 218 | +; WATCHABI-SOFT:       @ %bb.0:  | 
 | 219 | +; WATCHABI-SOFT-NEXT:    vmov s0, r1  | 
 | 220 | +; WATCHABI-SOFT-NEXT:    vcvtb.f16.f32 s0, s0  | 
 | 221 | +; WATCHABI-SOFT-NEXT:    vmov r1, s0  | 
 | 222 | +; WATCHABI-SOFT-NEXT:    strh r1, [r0]  | 
 | 223 | +; WATCHABI-SOFT-NEXT:    bx lr  | 
172 | 224 |   %cvt = fptrunc float %arg to half  | 
173 | 225 |   store half %cvt, ptr %p  | 
174 | 226 |   ret void  | 
@@ -231,6 +283,23 @@ define double @f16_to_f64(ptr %p) #0 {  | 
231 | 283 | ; APCS-NEXT:    vmov r0, r1, d16  | 
232 | 284 | ; APCS-NEXT:    pop {lr}  | 
233 | 285 | ; APCS-NEXT:    bx lr  | 
 | 286 | +;  | 
 | 287 | +; WATCHABI-HARD-LABEL: f16_to_f64:  | 
 | 288 | +; WATCHABI-HARD:       @ %bb.0:  | 
 | 289 | +; WATCHABI-HARD-NEXT:    ldrh r0, [r0]  | 
 | 290 | +; WATCHABI-HARD-NEXT:    vmov s0, r0  | 
 | 291 | +; WATCHABI-HARD-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 292 | +; WATCHABI-HARD-NEXT:    vcvt.f64.f32 d0, s0  | 
 | 293 | +; WATCHABI-HARD-NEXT:    bx lr  | 
 | 294 | +;  | 
 | 295 | +; WATCHABI-SOFT-LABEL: f16_to_f64:  | 
 | 296 | +; WATCHABI-SOFT:       @ %bb.0:  | 
 | 297 | +; WATCHABI-SOFT-NEXT:    ldrh r0, [r0]  | 
 | 298 | +; WATCHABI-SOFT-NEXT:    vmov s0, r0  | 
 | 299 | +; WATCHABI-SOFT-NEXT:    vcvtb.f32.f16 s0, s0  | 
 | 300 | +; WATCHABI-SOFT-NEXT:    vcvt.f64.f32 d16, s0  | 
 | 301 | +; WATCHABI-SOFT-NEXT:    vmov r0, r1, d16  | 
 | 302 | +; WATCHABI-SOFT-NEXT:    bx lr  | 
234 | 303 |   %load = load half, ptr %p  | 
235 | 304 |   %cvt = fpext half %load to double  | 
236 | 305 |   ret double %cvt  | 
@@ -269,6 +338,28 @@ define void @f64_to_f16(ptr %p, double %arg) #0 {  | 
269 | 338 | ; APCS-NEXT:    bl __truncdfhf2  | 
270 | 339 | ; APCS-NEXT:    strh r0, [r4]  | 
271 | 340 | ; APCS-NEXT:    pop {r4, pc}  | 
 | 341 | +;  | 
 | 342 | +; WATCHABI-HARD-LABEL: f64_to_f16:  | 
 | 343 | +; WATCHABI-HARD:       @ %bb.0:  | 
 | 344 | +; WATCHABI-HARD-NEXT:    push {r4, lr}  | 
 | 345 | +; WATCHABI-HARD-NEXT:    sub sp, sp, #8  | 
 | 346 | +; WATCHABI-HARD-NEXT:    mov r4, r0  | 
 | 347 | +; WATCHABI-HARD-NEXT:    bl ___truncdfhf2  | 
 | 348 | +; WATCHABI-HARD-NEXT:    strh r0, [r4]  | 
 | 349 | +; WATCHABI-HARD-NEXT:    add sp, sp, #8  | 
 | 350 | +; WATCHABI-HARD-NEXT:    pop {r4, pc}  | 
 | 351 | +;  | 
 | 352 | +; WATCHABI-SOFT-LABEL: f64_to_f16:  | 
 | 353 | +; WATCHABI-SOFT:       @ %bb.0:  | 
 | 354 | +; WATCHABI-SOFT-NEXT:    push {r4, lr}  | 
 | 355 | +; WATCHABI-SOFT-NEXT:    sub sp, sp, #8  | 
 | 356 | +; WATCHABI-SOFT-NEXT:    mov r4, r0  | 
 | 357 | +; WATCHABI-SOFT-NEXT:    mov r1, r3  | 
 | 358 | +; WATCHABI-SOFT-NEXT:    mov r0, r2  | 
 | 359 | +; WATCHABI-SOFT-NEXT:    bl ___truncdfhf2  | 
 | 360 | +; WATCHABI-SOFT-NEXT:    strh r0, [r4]  | 
 | 361 | +; WATCHABI-SOFT-NEXT:    add sp, sp, #8  | 
 | 362 | +; WATCHABI-SOFT-NEXT:    pop {r4, pc}  | 
272 | 363 |   %cvt = fptrunc double %arg to half  | 
273 | 364 |   store half %cvt, ptr %p  | 
274 | 365 |   ret void  | 
 | 
0 commit comments