158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
			
		
		
	
	
			158 lines
		
	
	
		
			3.8 KiB
		
	
	
	
		
			LLVM
		
	
	
	
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
 | 
						|
; RUN: llc < %s -o - -verify-machineinstrs -global-isel=1 -global-isel-abort=1 | FileCheck %s --check-prefixes=CHECK,GISEL
 | 
						|
; RUN: llc < %s -o - -verify-machineinstrs -global-isel=0 | FileCheck %s --check-prefixes=CHECK,SDAG
 | 
						|
 | 
						|
target datalayout = "e-m:o-i64:64-i128:128-n32:64-S128"
 | 
						|
target triple = "arm64-apple-ios14.5.0"
 | 
						|
 | 
						|
define i32 @bfi_w_31(i32 %in1, i32 %in2) {
 | 
						|
; CHECK-LABEL: bfi_w_31:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi w1, w0, #31, #1
 | 
						|
; CHECK-NEXT:    mov w0, w1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i32 %in1, 31
 | 
						|
  %tmp4 = and i32 %in2, 2147483647
 | 
						|
  %out = or i32 %tmp3, %tmp4
 | 
						|
  ret i32 %out
 | 
						|
}
 | 
						|
 | 
						|
define i32 @bfi_w_8(i32 %in1, i32 %in2) {
 | 
						|
; CHECK-LABEL: bfi_w_8:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi w1, w0, #8, #24
 | 
						|
; CHECK-NEXT:    mov w0, w1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i32 %in1, 8
 | 
						|
  %tmp4 = and i32 %in2, 255
 | 
						|
  %out = or i32 %tmp3, %tmp4
 | 
						|
  ret i32 %out
 | 
						|
}
 | 
						|
 | 
						|
define i32 @bfi_w_1(i32 %in1, i32 %in2) {
 | 
						|
; CHECK-LABEL: bfi_w_1:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi w1, w0, #1, #31
 | 
						|
; CHECK-NEXT:    mov w0, w1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i32 %in1, 1
 | 
						|
  %tmp4 = and i32 %in2, 1
 | 
						|
  %out = or i32 %tmp3, %tmp4
 | 
						|
  ret i32 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @bfi_x_63(i64 %in1, i64 %in2) {
 | 
						|
; CHECK-LABEL: bfi_x_63:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi x1, x0, #63, #1
 | 
						|
; CHECK-NEXT:    mov x0, x1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 63
 | 
						|
  %tmp4 = and i64 %in2, 9223372036854775807
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @bfi_x_31(i64 %in1, i64 %in2) {
 | 
						|
; CHECK-LABEL: bfi_x_31:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi x1, x0, #31, #33
 | 
						|
; CHECK-NEXT:    mov x0, x1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 31
 | 
						|
  %tmp4 = and i64 %in2, 2147483647
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @bfi_x_8(i64 %in1, i64 %in2) {
 | 
						|
; CHECK-LABEL: bfi_x_8:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi x1, x0, #8, #56
 | 
						|
; CHECK-NEXT:    mov x0, x1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 8
 | 
						|
  %tmp4 = and i64 %in2, 255
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @bfi_x_1(i64 %in1, i64 %in2) {
 | 
						|
; CHECK-LABEL: bfi_x_1:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi x1, x0, #1, #63
 | 
						|
; CHECK-NEXT:    mov x0, x1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 1
 | 
						|
  %tmp4 = and i64 %in2, 1
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @bfi_x_1_swapped(i64 %in1, i64 %in2) {
 | 
						|
; CHECK-LABEL: bfi_x_1_swapped:
 | 
						|
; CHECK:       ; %bb.0: ; %bb
 | 
						|
; CHECK-NEXT:    bfi x1, x0, #1, #63
 | 
						|
; CHECK-NEXT:    mov x0, x1
 | 
						|
; CHECK-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 1
 | 
						|
  %tmp4 = and i64 %in2, 1
 | 
						|
  %out = or i64 %tmp4, %tmp3
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @extra_use1(i64 %in1, i64 %in2, i64* %p) {
 | 
						|
; GISEL-LABEL: extra_use1:
 | 
						|
; GISEL:       ; %bb.0: ; %bb
 | 
						|
; GISEL-NEXT:    lsl x8, x0, #1
 | 
						|
; GISEL-NEXT:    and x9, x1, #0x1
 | 
						|
; GISEL-NEXT:    orr x0, x8, x9
 | 
						|
; GISEL-NEXT:    str x8, [x2]
 | 
						|
; GISEL-NEXT:    ret
 | 
						|
;
 | 
						|
; SDAG-LABEL: extra_use1:
 | 
						|
; SDAG:       ; %bb.0: ; %bb
 | 
						|
; SDAG-NEXT:    bfi x1, x0, #1, #63
 | 
						|
; SDAG-NEXT:    lsl x8, x0, #1
 | 
						|
; SDAG-NEXT:    mov x0, x1
 | 
						|
; SDAG-NEXT:    str x8, [x2]
 | 
						|
; SDAG-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 1
 | 
						|
  %tmp4 = and i64 %in2, 1
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  store i64 %tmp3, i64* %p
 | 
						|
  ret i64 %out
 | 
						|
}
 | 
						|
 | 
						|
define i64 @extra_use2(i64 %in1, i64 %in2, i64* %p) {
 | 
						|
; GISEL-LABEL: extra_use2:
 | 
						|
; GISEL:       ; %bb.0: ; %bb
 | 
						|
; GISEL-NEXT:    and x8, x1, #0x1
 | 
						|
; GISEL-NEXT:    orr x0, x8, x0, lsl #1
 | 
						|
; GISEL-NEXT:    str x8, [x2]
 | 
						|
; GISEL-NEXT:    ret
 | 
						|
;
 | 
						|
; SDAG-LABEL: extra_use2:
 | 
						|
; SDAG:       ; %bb.0: ; %bb
 | 
						|
; SDAG-NEXT:    and x8, x1, #0x1
 | 
						|
; SDAG-NEXT:    bfi x1, x0, #1, #63
 | 
						|
; SDAG-NEXT:    mov x0, x1
 | 
						|
; SDAG-NEXT:    str x8, [x2]
 | 
						|
; SDAG-NEXT:    ret
 | 
						|
bb:
 | 
						|
  %tmp3 = shl i64 %in1, 1
 | 
						|
  %tmp4 = and i64 %in2, 1
 | 
						|
  %out = or i64 %tmp3, %tmp4
 | 
						|
  store i64 %tmp4, i64* %p
 | 
						|
  ret i64 %out
 | 
						|
}
 |