Home | History | Annotate | Download | only in SystemZ
      1 ; Test 64-bit GPR accesses to a PC-relative location.
      2 ;
      3 ; RUN: llc < %s -mtriple=s390x-linux-gnu | FileCheck %s
      4 
      5 @gsrc16 = global i16 1
      6 @gsrc32 = global i32 1
      7 @gsrc64 = global i64 1
      8 @gdst16 = global i16 2
      9 @gdst32 = global i32 2
     10 @gdst64 = global i64 2
     11 @gsrc16u = global i16 1, align 1, section "foo"
     12 @gsrc32u = global i32 1, align 2, section "foo"
     13 @gsrc64u = global i64 1, align 4, section "foo"
     14 @gdst16u = global i16 2, align 1, section "foo"
     15 @gdst32u = global i32 2, align 2, section "foo"
     16 @gdst64u = global i64 2, align 4, section "foo"
     17 
     18 ; Check sign-extending loads from i16.
     19 define i64 @f1() {
     20 ; CHECK-LABEL: f1:
     21 ; CHECK: lghrl %r2, gsrc16
     22 ; CHECK: br %r14
     23   %val = load i16 , i16 *@gsrc16
     24   %ext = sext i16 %val to i64
     25   ret i64 %ext
     26 }
     27 
     28 ; Check zero-extending loads from i16.
     29 define i64 @f2() {
     30 ; CHECK-LABEL: f2:
     31 ; CHECK: llghrl %r2, gsrc16
     32 ; CHECK: br %r14
     33   %val = load i16 , i16 *@gsrc16
     34   %ext = zext i16 %val to i64
     35   ret i64 %ext
     36 }
     37 
     38 ; Check sign-extending loads from i32.
     39 define i64 @f3() {
     40 ; CHECK-LABEL: f3:
     41 ; CHECK: lgfrl %r2, gsrc32
     42 ; CHECK: br %r14
     43   %val = load i32 , i32 *@gsrc32
     44   %ext = sext i32 %val to i64
     45   ret i64 %ext
     46 }
     47 
     48 ; Check zero-extending loads from i32.
     49 define i64 @f4() {
     50 ; CHECK-LABEL: f4:
     51 ; CHECK: llgfrl %r2, gsrc32
     52 ; CHECK: br %r14
     53   %val = load i32 , i32 *@gsrc32
     54   %ext = zext i32 %val to i64
     55   ret i64 %ext
     56 }
     57 
     58 ; Check truncating 16-bit stores.
     59 define void @f5(i64 %val) {
     60 ; CHECK-LABEL: f5:
     61 ; CHECK: sthrl %r2, gdst16
     62 ; CHECK: br %r14
     63   %half = trunc i64 %val to i16
     64   store i16 %half, i16 *@gdst16
     65   ret void
     66 }
     67 
     68 ; Check truncating 32-bit stores.
     69 define void @f6(i64 %val) {
     70 ; CHECK-LABEL: f6:
     71 ; CHECK: strl %r2, gdst32
     72 ; CHECK: br %r14
     73   %word = trunc i64 %val to i32
     74   store i32 %word, i32 *@gdst32
     75   ret void
     76 }
     77 
     78 ; Check plain loads and stores.
     79 define void @f7() {
     80 ; CHECK-LABEL: f7:
     81 ; CHECK: lgrl %r0, gsrc64
     82 ; CHECK: stgrl %r0, gdst64
     83 ; CHECK: br %r14
     84   %val = load i64 , i64 *@gsrc64
     85   store i64 %val, i64 *@gdst64
     86   ret void
     87 }
     88 
     89 ; Repeat f1 with an unaligned variable.
     90 define i64 @f8() {
     91 ; CHECK-LABEL: f8:
     92 ; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT
     93 ; CHECK: lgh %r2, 0([[REG]])
     94 ; CHECK: br %r14
     95   %val = load i16 , i16 *@gsrc16u, align 1
     96   %ext = sext i16 %val to i64
     97   ret i64 %ext
     98 }
     99 
    100 ; Repeat f2 with an unaligned variable.
    101 define i64 @f9() {
    102 ; CHECK-LABEL: f9:
    103 ; CHECK: lgrl [[REG:%r[0-5]]], gsrc16u@GOT
    104 ; CHECK: llgh %r2, 0([[REG]])
    105 ; CHECK: br %r14
    106   %val = load i16 , i16 *@gsrc16u, align 1
    107   %ext = zext i16 %val to i64
    108   ret i64 %ext
    109 }
    110 
    111 ; Repeat f3 with an unaligned variable.
    112 define i64 @f10() {
    113 ; CHECK-LABEL: f10:
    114 ; CHECK: larl [[REG:%r[0-5]]], gsrc32u
    115 ; CHECK: lgf %r2, 0([[REG]])
    116 ; CHECK: br %r14
    117   %val = load i32 , i32 *@gsrc32u, align 2
    118   %ext = sext i32 %val to i64
    119   ret i64 %ext
    120 }
    121 
    122 ; Repeat f4 with an unaligned variable.
    123 define i64 @f11() {
    124 ; CHECK-LABEL: f11:
    125 ; CHECK: larl [[REG:%r[0-5]]], gsrc32u
    126 ; CHECK: llgf %r2, 0([[REG]])
    127 ; CHECK: br %r14
    128   %val = load i32 , i32 *@gsrc32u, align 2
    129   %ext = zext i32 %val to i64
    130   ret i64 %ext
    131 }
    132 
    133 ; Repeat f5 with an unaligned variable.
    134 define void @f12(i64 %val) {
    135 ; CHECK-LABEL: f12:
    136 ; CHECK: lgrl [[REG:%r[0-5]]], gdst16u@GOT
    137 ; CHECK: sth %r2, 0([[REG]])
    138 ; CHECK: br %r14
    139   %half = trunc i64 %val to i16
    140   store i16 %half, i16 *@gdst16u, align 1
    141   ret void
    142 }
    143 
    144 ; Repeat f6 with an unaligned variable.
    145 define void @f13(i64 %val) {
    146 ; CHECK-LABEL: f13:
    147 ; CHECK: larl [[REG:%r[0-5]]], gdst32u
    148 ; CHECK: st %r2, 0([[REG]])
    149 ; CHECK: br %r14
    150   %word = trunc i64 %val to i32
    151   store i32 %word, i32 *@gdst32u, align 2
    152   ret void
    153 }
    154 
    155 ; Repeat f7 with unaligned variables.
    156 define void @f14() {
    157 ; CHECK-LABEL: f14:
    158 ; CHECK: larl [[REG:%r[0-5]]], gsrc64u
    159 ; CHECK: lg [[VAL:%r[0-5]]], 0([[REG]])
    160 ; CHECK: larl [[REG:%r[0-5]]], gdst64u
    161 ; CHECK: stg [[VAL]], 0([[REG]])
    162 ; CHECK: br %r14
    163   %val = load i64 , i64 *@gsrc64u, align 4
    164   store i64 %val, i64 *@gdst64u, align 4
    165   ret void
    166 }
    167