Home | History | Annotate | Download | only in AMDGPU
      1 ; RUN: llc -march=amdgcn -mcpu=SI -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
      2 ; RUN: llc -march=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefix=SI %s
      3 
      4 ; SI-LABEL: {{^}}s_movk_i32_k0:
      5 ; SI-DAG: s_mov_b32 [[LO_S_IMM:s[0-9]+]], 0xffff{{$}}
      6 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
      7 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
      8 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 1, v[[HI_VREG]]
      9 ; SI: s_endpgm
     10 define void @s_movk_i32_k0(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     11   %loada = load i64, i64 addrspace(1)* %a, align 4
     12   %or = or i64 %loada, 4295032831 ; ((1 << 16) - 1) | (1 << 32)
     13   store i64 %or, i64 addrspace(1)* %out
     14   ret void
     15 }
     16 
     17 ; SI-LABEL: {{^}}s_movk_i32_k1:
     18 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x7fff{{$}}
     19 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     20 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     21 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 1, v[[HI_VREG]]
     22 ; SI: s_endpgm
     23 define void @s_movk_i32_k1(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     24   %loada = load i64, i64 addrspace(1)* %a, align 4
     25   %or = or i64 %loada, 4295000063 ; ((1 << 15) - 1) | (1 << 32)
     26   store i64 %or, i64 addrspace(1)* %out
     27   ret void
     28 }
     29 
     30 ; SI-LABEL: {{^}}s_movk_i32_k2:
     31 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x7fff{{$}}
     32 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     33 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     34 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 64, v[[HI_VREG]]
     35 ; SI: s_endpgm
     36 define void @s_movk_i32_k2(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     37   %loada = load i64, i64 addrspace(1)* %a, align 4
     38   %or = or i64 %loada, 274877939711 ; ((1 << 15) - 1) | (64 << 32)
     39   store i64 %or, i64 addrspace(1)* %out
     40   ret void
     41 }
     42 
     43 ; SI-LABEL: {{^}}s_movk_i32_k3:
     44 ; SI-DAG: s_mov_b32 [[LO_S_IMM:s[0-9]+]], 0x8000{{$}}
     45 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     46 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     47 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 1, v[[HI_VREG]]
     48 ; SI: s_endpgm
     49 define void @s_movk_i32_k3(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     50   %loada = load i64, i64 addrspace(1)* %a, align 4
     51   %or = or i64 %loada, 4295000064 ; (1 << 15) | (1 << 32)
     52   store i64 %or, i64 addrspace(1)* %out
     53   ret void
     54 }
     55 
     56 ; SI-LABEL: {{^}}s_movk_i32_k4:
     57 ; SI-DAG: s_mov_b32 [[LO_S_IMM:s[0-9]+]], 0x20000{{$}}
     58 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     59 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     60 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 1, v[[HI_VREG]]
     61 ; SI: s_endpgm
     62 define void @s_movk_i32_k4(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     63   %loada = load i64, i64 addrspace(1)* %a, align 4
     64   %or = or i64 %loada, 4295098368 ; (1 << 17) | (1 << 32)
     65   store i64 %or, i64 addrspace(1)* %out
     66   ret void
     67 }
     68 
     69 ; SI-LABEL: {{^}}s_movk_i32_k5:
     70 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0xffef{{$}}
     71 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0xff00ffff{{$}}
     72 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     73 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     74 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
     75 ; SI: s_endpgm
     76 define void @s_movk_i32_k5(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     77   %loada = load i64, i64 addrspace(1)* %a, align 4
     78   %or = or i64 %loada, 18374967954648334319 ; -17 & 0xff00ffffffffffff
     79   store i64 %or, i64 addrspace(1)* %out
     80   ret void
     81 }
     82 
     83 ; SI-LABEL: {{^}}s_movk_i32_k6:
     84 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x41{{$}}
     85 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
     86 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
     87 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, 63, v[[HI_VREG]]
     88 ; SI: s_endpgm
     89 define void @s_movk_i32_k6(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
     90   %loada = load i64, i64 addrspace(1)* %a, align 4
     91   %or = or i64 %loada, 270582939713 ; 65 | (63 << 32)
     92   store i64 %or, i64 addrspace(1)* %out
     93   ret void
     94 }
     95 
     96 ; SI-LABEL: {{^}}s_movk_i32_k7:
     97 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x2000{{$}}
     98 ; SI-DAG: s_movk_i32 [[HI_S_IMM:s[0-9]+]], 0x4000{{$}}
     99 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    100 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    101 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    102 ; SI: s_endpgm
    103 define void @s_movk_i32_k7(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    104   %loada = load i64, i64 addrspace(1)* %a, align 4
    105   %or = or i64 %loada, 70368744185856; ((1 << 13)) | ((1 << 14) << 32)
    106   store i64 %or, i64 addrspace(1)* %out
    107   ret void
    108 }
    109 
    110 
    111 ; SI-LABEL: {{^}}s_movk_i32_k8:
    112 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x8000{{$}}
    113 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0x11111111{{$}}
    114 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    115 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    116 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    117 ; SI: s_endpgm
    118 define void @s_movk_i32_k8(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    119   %loada = load i64, i64 addrspace(1)* %a, align 4
    120   %or = or i64 %loada, 1229782942255906816 ; 0x11111111ffff8000
    121   store i64 %or, i64 addrspace(1)* %out
    122   ret void
    123 }
    124 
    125 ; SI-LABEL: {{^}}s_movk_i32_k9:
    126 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x8001{{$}}
    127 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0x11111111{{$}}
    128 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    129 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    130 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    131 ; SI: s_endpgm
    132 define void @s_movk_i32_k9(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    133   %loada = load i64, i64 addrspace(1)* %a, align 4
    134   %or = or i64 %loada, 1229782942255906817 ; 0x11111111ffff8001
    135   store i64 %or, i64 addrspace(1)* %out
    136   ret void
    137 }
    138 
    139 ; SI-LABEL: {{^}}s_movk_i32_k10:
    140 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x8888{{$}}
    141 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0x11111111{{$}}
    142 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    143 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    144 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    145 ; SI: s_endpgm
    146 define void @s_movk_i32_k10(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    147   %loada = load i64, i64 addrspace(1)* %a, align 4
    148   %or = or i64 %loada, 1229782942255909000 ; 0x11111111ffff8888
    149   store i64 %or, i64 addrspace(1)* %out
    150   ret void
    151 }
    152 
    153 ; SI-LABEL: {{^}}s_movk_i32_k11:
    154 ; SI-DAG: s_movk_i32 [[LO_S_IMM:s[0-9]+]], 0x8fff{{$}}
    155 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0x11111111{{$}}
    156 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    157 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    158 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    159 ; SI: s_endpgm
    160 define void @s_movk_i32_k11(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    161   %loada = load i64, i64 addrspace(1)* %a, align 4
    162   %or = or i64 %loada, 1229782942255910911 ; 0x11111111ffff8fff
    163   store i64 %or, i64 addrspace(1)* %out
    164   ret void
    165 }
    166 
    167 ; SI-LABEL: {{^}}s_movk_i32_k12:
    168 ; SI-DAG: s_mov_b32 [[LO_S_IMM:s[0-9]+]], 0xffff7001{{$}}
    169 ; SI-DAG: s_mov_b32 [[HI_S_IMM:s[0-9]+]], 0x11111111{{$}}
    170 ; SI-DAG: buffer_load_dwordx2 v{{\[}}[[LO_VREG:[0-9]+]]:[[HI_VREG:[0-9]+]]{{\]}},
    171 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[LO_S_IMM]], v[[LO_VREG]]
    172 ; SI-DAG: v_or_b32_e32 {{v[0-9]+}}, [[HI_S_IMM]], v[[HI_VREG]]
    173 ; SI: s_endpgm
    174 define void @s_movk_i32_k12(i64 addrspace(1)* %out, i64 addrspace(1)* %a, i64 addrspace(1)* %b) {
    175   %loada = load i64, i64 addrspace(1)* %a, align 4
    176   %or = or i64 %loada, 1229782942255902721 ; 0x11111111ffff7001
    177   store i64 %or, i64 addrspace(1)* %out
    178   ret void
    179 }
    180