@@ -359,3 +359,251 @@ define i64 @cmpxchg64(ptr %p) {
359359 %res.0 = extractvalue { i64 , i1 } %res , 0
360360 ret i64 %res.0
361361}
362+
363+ define void @trunc_store8 (ptr %p , i32 %val ) {
364+ ; NO-ATOMIC32-LABEL: trunc_store8:
365+ ; NO-ATOMIC32: @ %bb.0:
366+ ; NO-ATOMIC32-NEXT: .save {r7, lr}
367+ ; NO-ATOMIC32-NEXT: push {r7, lr}
368+ ; NO-ATOMIC32-NEXT: movs r2, #5
369+ ; NO-ATOMIC32-NEXT: bl __atomic_store_1
370+ ; NO-ATOMIC32-NEXT: pop {r7, pc}
371+ ;
372+ ; ATOMIC32-LABEL: trunc_store8:
373+ ; ATOMIC32: @ %bb.0:
374+ ; ATOMIC32-NEXT: dmb sy
375+ ; ATOMIC32-NEXT: strb r1, [r0]
376+ ; ATOMIC32-NEXT: dmb sy
377+ ; ATOMIC32-NEXT: bx lr
378+ %trunc = trunc i32 %val to i8
379+ store atomic i8 %trunc , ptr %p seq_cst , align 1
380+ ret void
381+ }
382+
383+ define i8 @trunc_rmw8 (ptr %p , i32 %val ) {
384+ ; NO-ATOMIC32-LABEL: trunc_rmw8:
385+ ; NO-ATOMIC32: @ %bb.0:
386+ ; NO-ATOMIC32-NEXT: .save {r7, lr}
387+ ; NO-ATOMIC32-NEXT: push {r7, lr}
388+ ; NO-ATOMIC32-NEXT: movs r2, #5
389+ ; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_1
390+ ; NO-ATOMIC32-NEXT: pop {r7, pc}
391+ ;
392+ ; ATOMIC32-LABEL: trunc_rmw8:
393+ ; ATOMIC32: @ %bb.0:
394+ ; ATOMIC32-NEXT: .save {r7, lr}
395+ ; ATOMIC32-NEXT: push {r7, lr}
396+ ; ATOMIC32-NEXT: dmb sy
397+ ; ATOMIC32-NEXT: bl __sync_fetch_and_add_1
398+ ; ATOMIC32-NEXT: dmb sy
399+ ; ATOMIC32-NEXT: pop {r7, pc}
400+ %trunc = trunc i32 %val to i8
401+ %v = atomicrmw add ptr %p , i8 %trunc seq_cst , align 1
402+ ret i8 %v
403+ }
404+
405+ define i8 @trunc_rmw8_signed (ptr %p , i32 %val ) {
406+ ; NO-ATOMIC32-LABEL: trunc_rmw8_signed:
407+ ; NO-ATOMIC32: @ %bb.0:
408+ ; NO-ATOMIC32-NEXT: .save {r4, r5, r6, lr}
409+ ; NO-ATOMIC32-NEXT: push {r4, r5, r6, lr}
410+ ; NO-ATOMIC32-NEXT: .pad #8
411+ ; NO-ATOMIC32-NEXT: sub sp, #8
412+ ; NO-ATOMIC32-NEXT: mov r4, r1
413+ ; NO-ATOMIC32-NEXT: mov r5, r0
414+ ; NO-ATOMIC32-NEXT: ldrb r2, [r0]
415+ ; NO-ATOMIC32-NEXT: b .LBB18_2
416+ ; NO-ATOMIC32-NEXT: .LBB18_1: @ %atomicrmw.start
417+ ; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
418+ ; NO-ATOMIC32-NEXT: mov r0, r5
419+ ; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
420+ ; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
421+ ; NO-ATOMIC32-NEXT: cmp r0, #0
422+ ; NO-ATOMIC32-NEXT: bne .LBB18_4
423+ ; NO-ATOMIC32-NEXT: .LBB18_2: @ %atomicrmw.start
424+ ; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
425+ ; NO-ATOMIC32-NEXT: add r1, sp, #4
426+ ; NO-ATOMIC32-NEXT: strb r2, [r1]
427+ ; NO-ATOMIC32-NEXT: movs r3, #5
428+ ; NO-ATOMIC32-NEXT: str r3, [sp]
429+ ; NO-ATOMIC32-NEXT: sxtb r0, r4
430+ ; NO-ATOMIC32-NEXT: sxtb r6, r2
431+ ; NO-ATOMIC32-NEXT: cmp r6, r0
432+ ; NO-ATOMIC32-NEXT: bgt .LBB18_1
433+ ; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
434+ ; NO-ATOMIC32-NEXT: @ in Loop: Header=BB18_2 Depth=1
435+ ; NO-ATOMIC32-NEXT: mov r2, r4
436+ ; NO-ATOMIC32-NEXT: b .LBB18_1
437+ ; NO-ATOMIC32-NEXT: .LBB18_4: @ %atomicrmw.end
438+ ; NO-ATOMIC32-NEXT: mov r0, r2
439+ ; NO-ATOMIC32-NEXT: add sp, #8
440+ ; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
441+ ;
442+ ; ATOMIC32-LABEL: trunc_rmw8_signed:
443+ ; ATOMIC32: @ %bb.0:
444+ ; ATOMIC32-NEXT: .save {r7, lr}
445+ ; ATOMIC32-NEXT: push {r7, lr}
446+ ; ATOMIC32-NEXT: dmb sy
447+ ; ATOMIC32-NEXT: bl __sync_fetch_and_max_1
448+ ; ATOMIC32-NEXT: dmb sy
449+ ; ATOMIC32-NEXT: pop {r7, pc}
450+ %trunc = trunc i32 %val to i8
451+ %v = atomicrmw max ptr %p , i8 %trunc seq_cst , align 1
452+ ret i8 %v
453+ }
454+
455+ define i8 @trunc_cmpxchg8 (ptr %p , i32 %cmp , i32 %new ) {
456+ ; NO-ATOMIC32-LABEL: trunc_cmpxchg8:
457+ ; NO-ATOMIC32: @ %bb.0:
458+ ; NO-ATOMIC32-NEXT: .save {r4, lr}
459+ ; NO-ATOMIC32-NEXT: push {r4, lr}
460+ ; NO-ATOMIC32-NEXT: .pad #8
461+ ; NO-ATOMIC32-NEXT: sub sp, #8
462+ ; NO-ATOMIC32-NEXT: add r4, sp, #4
463+ ; NO-ATOMIC32-NEXT: strb r1, [r4]
464+ ; NO-ATOMIC32-NEXT: movs r3, #5
465+ ; NO-ATOMIC32-NEXT: str r3, [sp]
466+ ; NO-ATOMIC32-NEXT: mov r1, r4
467+ ; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_1
468+ ; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
469+ ; NO-ATOMIC32-NEXT: add sp, #8
470+ ; NO-ATOMIC32-NEXT: pop {r4, pc}
471+ ;
472+ ; ATOMIC32-LABEL: trunc_cmpxchg8:
473+ ; ATOMIC32: @ %bb.0:
474+ ; ATOMIC32-NEXT: .save {r7, lr}
475+ ; ATOMIC32-NEXT: push {r7, lr}
476+ ; ATOMIC32-NEXT: dmb sy
477+ ; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_1
478+ ; ATOMIC32-NEXT: dmb sy
479+ ; ATOMIC32-NEXT: pop {r7, pc}
480+ %trunc_cmp = trunc i32 %cmp to i8
481+ %trunc_new = trunc i32 %new to i8
482+ %res = cmpxchg ptr %p , i8 %trunc_cmp , i8 %trunc_new seq_cst seq_cst , align 1
483+ %res.0 = extractvalue { i8 , i1 } %res , 0
484+ ret i8 %res.0
485+ }
486+
487+ define void @trunc_store16 (ptr %p , i32 %val ) {
488+ ; NO-ATOMIC32-LABEL: trunc_store16:
489+ ; NO-ATOMIC32: @ %bb.0:
490+ ; NO-ATOMIC32-NEXT: .save {r7, lr}
491+ ; NO-ATOMIC32-NEXT: push {r7, lr}
492+ ; NO-ATOMIC32-NEXT: movs r2, #5
493+ ; NO-ATOMIC32-NEXT: bl __atomic_store_2
494+ ; NO-ATOMIC32-NEXT: pop {r7, pc}
495+ ;
496+ ; ATOMIC32-LABEL: trunc_store16:
497+ ; ATOMIC32: @ %bb.0:
498+ ; ATOMIC32-NEXT: dmb sy
499+ ; ATOMIC32-NEXT: strh r1, [r0]
500+ ; ATOMIC32-NEXT: dmb sy
501+ ; ATOMIC32-NEXT: bx lr
502+ %trunc = trunc i32 %val to i16
503+ store atomic i16 %trunc , ptr %p seq_cst , align 2
504+ ret void
505+ }
506+
507+ define i16 @trunc_rmw16 (ptr %p , i32 %val ) {
508+ ; NO-ATOMIC32-LABEL: trunc_rmw16:
509+ ; NO-ATOMIC32: @ %bb.0:
510+ ; NO-ATOMIC32-NEXT: .save {r7, lr}
511+ ; NO-ATOMIC32-NEXT: push {r7, lr}
512+ ; NO-ATOMIC32-NEXT: movs r2, #5
513+ ; NO-ATOMIC32-NEXT: bl __atomic_fetch_add_2
514+ ; NO-ATOMIC32-NEXT: pop {r7, pc}
515+ ;
516+ ; ATOMIC32-LABEL: trunc_rmw16:
517+ ; ATOMIC32: @ %bb.0:
518+ ; ATOMIC32-NEXT: .save {r7, lr}
519+ ; ATOMIC32-NEXT: push {r7, lr}
520+ ; ATOMIC32-NEXT: dmb sy
521+ ; ATOMIC32-NEXT: bl __sync_fetch_and_add_2
522+ ; ATOMIC32-NEXT: dmb sy
523+ ; ATOMIC32-NEXT: pop {r7, pc}
524+ %trunc = trunc i32 %val to i16
525+ %v = atomicrmw add ptr %p , i16 %trunc seq_cst , align 2
526+ ret i16 %v
527+ }
528+
529+ define i16 @trunc_rmw16_signed (ptr %p , i32 %val ) {
530+ ; NO-ATOMIC32-LABEL: trunc_rmw16_signed:
531+ ; NO-ATOMIC32: @ %bb.0:
532+ ; NO-ATOMIC32-NEXT: .save {r4, r5, r6, lr}
533+ ; NO-ATOMIC32-NEXT: push {r4, r5, r6, lr}
534+ ; NO-ATOMIC32-NEXT: .pad #8
535+ ; NO-ATOMIC32-NEXT: sub sp, #8
536+ ; NO-ATOMIC32-NEXT: mov r4, r1
537+ ; NO-ATOMIC32-NEXT: mov r5, r0
538+ ; NO-ATOMIC32-NEXT: ldrh r2, [r0]
539+ ; NO-ATOMIC32-NEXT: b .LBB22_2
540+ ; NO-ATOMIC32-NEXT: .LBB22_1: @ %atomicrmw.start
541+ ; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
542+ ; NO-ATOMIC32-NEXT: mov r0, r5
543+ ; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
544+ ; NO-ATOMIC32-NEXT: ldr r2, [sp, #4]
545+ ; NO-ATOMIC32-NEXT: cmp r0, #0
546+ ; NO-ATOMIC32-NEXT: bne .LBB22_4
547+ ; NO-ATOMIC32-NEXT: .LBB22_2: @ %atomicrmw.start
548+ ; NO-ATOMIC32-NEXT: @ =>This Inner Loop Header: Depth=1
549+ ; NO-ATOMIC32-NEXT: add r1, sp, #4
550+ ; NO-ATOMIC32-NEXT: strh r2, [r1]
551+ ; NO-ATOMIC32-NEXT: movs r3, #5
552+ ; NO-ATOMIC32-NEXT: str r3, [sp]
553+ ; NO-ATOMIC32-NEXT: sxth r0, r4
554+ ; NO-ATOMIC32-NEXT: sxth r6, r2
555+ ; NO-ATOMIC32-NEXT: cmp r6, r0
556+ ; NO-ATOMIC32-NEXT: bgt .LBB22_1
557+ ; NO-ATOMIC32-NEXT: @ %bb.3: @ %atomicrmw.start
558+ ; NO-ATOMIC32-NEXT: @ in Loop: Header=BB22_2 Depth=1
559+ ; NO-ATOMIC32-NEXT: mov r2, r4
560+ ; NO-ATOMIC32-NEXT: b .LBB22_1
561+ ; NO-ATOMIC32-NEXT: .LBB22_4: @ %atomicrmw.end
562+ ; NO-ATOMIC32-NEXT: mov r0, r2
563+ ; NO-ATOMIC32-NEXT: add sp, #8
564+ ; NO-ATOMIC32-NEXT: pop {r4, r5, r6, pc}
565+ ;
566+ ; ATOMIC32-LABEL: trunc_rmw16_signed:
567+ ; ATOMIC32: @ %bb.0:
568+ ; ATOMIC32-NEXT: .save {r7, lr}
569+ ; ATOMIC32-NEXT: push {r7, lr}
570+ ; ATOMIC32-NEXT: dmb sy
571+ ; ATOMIC32-NEXT: bl __sync_fetch_and_max_2
572+ ; ATOMIC32-NEXT: dmb sy
573+ ; ATOMIC32-NEXT: pop {r7, pc}
574+ %trunc = trunc i32 %val to i16
575+ %v = atomicrmw max ptr %p , i16 %trunc seq_cst , align 2
576+ ret i16 %v
577+ }
578+
579+ define i16 @trunc_cmpxchg16 (ptr %p , i32 %cmp , i32 %new ) {
580+ ; NO-ATOMIC32-LABEL: trunc_cmpxchg16:
581+ ; NO-ATOMIC32: @ %bb.0:
582+ ; NO-ATOMIC32-NEXT: .save {r4, lr}
583+ ; NO-ATOMIC32-NEXT: push {r4, lr}
584+ ; NO-ATOMIC32-NEXT: .pad #8
585+ ; NO-ATOMIC32-NEXT: sub sp, #8
586+ ; NO-ATOMIC32-NEXT: add r4, sp, #4
587+ ; NO-ATOMIC32-NEXT: strh r1, [r4]
588+ ; NO-ATOMIC32-NEXT: movs r3, #5
589+ ; NO-ATOMIC32-NEXT: str r3, [sp]
590+ ; NO-ATOMIC32-NEXT: mov r1, r4
591+ ; NO-ATOMIC32-NEXT: bl __atomic_compare_exchange_2
592+ ; NO-ATOMIC32-NEXT: ldr r0, [sp, #4]
593+ ; NO-ATOMIC32-NEXT: add sp, #8
594+ ; NO-ATOMIC32-NEXT: pop {r4, pc}
595+ ;
596+ ; ATOMIC32-LABEL: trunc_cmpxchg16:
597+ ; ATOMIC32: @ %bb.0:
598+ ; ATOMIC32-NEXT: .save {r7, lr}
599+ ; ATOMIC32-NEXT: push {r7, lr}
600+ ; ATOMIC32-NEXT: dmb sy
601+ ; ATOMIC32-NEXT: bl __sync_val_compare_and_swap_2
602+ ; ATOMIC32-NEXT: dmb sy
603+ ; ATOMIC32-NEXT: pop {r7, pc}
604+ %trunc_cmp = trunc i32 %cmp to i16
605+ %trunc_new = trunc i32 %new to i16
606+ %res = cmpxchg ptr %p , i16 %trunc_cmp , i16 %trunc_new seq_cst seq_cst , align 2
607+ %res.0 = extractvalue { i16 , i1 } %res , 0
608+ ret i16 %res.0
609+ }
0 commit comments