Home | History | Annotate | Download | only in Mips
      1 # RUN: llc -O0 -march=mips -mcpu=mips32r3 -mattr=+micromips,+eva -start-after=expand-isel-pseudos \
      2 # RUN:     -filetype obj %s -o - | llvm-objdump -mattr=+eva -d - | FileCheck %s
      3 
      4 --- |
      5 
      6   @wArray = global [13 x i32] zeroinitializer, align 4
      7   @hArray = global [13 x i16] zeroinitializer, align 2
      8   @bArray = global [13 x i8] zeroinitializer, align 1
      9 
     10   ; Function Attrs: noinline nounwind optnone
     11   define void @_Z3foov() {
     12   entry:
     13     %0 = load i8, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 5), align 1
     14     %conv = sext i8 %0 to i32
     15     %sub = sub nsw i32 %conv, 7
     16     %conv1 = trunc i32 %sub to i8
     17     store i8 %conv1, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 3), align 1
     18     %1 = load i8, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 5), align 1
     19     %conv2 = sext i8 %1 to i32
     20     %sub3 = sub nsw i32 %conv2, 7
     21     %conv4 = trunc i32 %sub3 to i8
     22     store i8 %conv4, i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 3), align 1
     23     %2 = load i16, i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 5), align 2
     24     %conv5 = sext i16 %2 to i32
     25     %sub6 = sub nsw i32 %conv5, 7
     26     %conv7 = trunc i32 %sub6 to i16
     27     store i16 %conv7, i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 3), align 2
     28     %3 = load i16, i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 5), align 2
     29     %conv8 = sext i16 %3 to i32
     30     %sub9 = sub nsw i32 %conv8, 7
     31     %conv10 = trunc i32 %sub9 to i16
     32     store i16 %conv10, i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 3), align 2
     33     %4 = load i32, i32* getelementptr inbounds ([13 x i32], [13 x i32]* @wArray, i32 0, i32 5), align 4
     34     %sub11 = sub nsw i32 %4, 7
     35     store i32 %sub11, i32* getelementptr inbounds ([13 x i32], [13 x i32]* @wArray, i32 0, i32 3), align 4
     36     ret void
     37   }
     38 
     39   ; Function Attrs: noinline nounwind optnone
     40   define i32 @_Z3barPi(i32* %z) {
     41   entry:
     42     %z.addr = alloca i32*, align 4
     43     store i32* %z, i32** %z.addr, align 4
     44     %0 = load i32*, i32** %z.addr, align 4
     45     fence seq_cst
     46     %1 = atomicrmw add i32* %0, i32 42 monotonic
     47     fence seq_cst
     48     %2 = add i32 %1, 42
     49     ret i32 %2
     50   }
     51 
     52 ...
     53 ---
     54 name:            _Z3foov
     55 alignment:       2
     56 exposesReturnsTwice: false
     57 legalized:       false
     58 regBankSelected: false
     59 selected:        false
     60 tracksRegLiveness: true
     61 registers:
     62   - { id: 0, class: gpr32, preferred-register: '' }
     63   - { id: 1, class: gpr32, preferred-register: '' }
     64   - { id: 2, class: gpr32, preferred-register: '' }
     65   - { id: 3, class: gpr32, preferred-register: '' }
     66   - { id: 4, class: gpr32, preferred-register: '' }
     67   - { id: 5, class: gpr32, preferred-register: '' }
     68   - { id: 6, class: gpr32, preferred-register: '' }
     69   - { id: 7, class: gpr32, preferred-register: '' }
     70   - { id: 8, class: gpr32, preferred-register: '' }
     71   - { id: 9, class: gpr32, preferred-register: '' }
     72   - { id: 10, class: gpr32, preferred-register: '' }
     73   - { id: 11, class: gpr32, preferred-register: '' }
     74   - { id: 12, class: gpr32, preferred-register: '' }
     75   - { id: 13, class: gpr32, preferred-register: '' }
     76   - { id: 14, class: gpr32, preferred-register: '' }
     77   - { id: 15, class: gpr32, preferred-register: '' }
     78 liveins:
     79 frameInfo:
     80   isFrameAddressTaken: false
     81   isReturnAddressTaken: false
     82   hasStackMap:     false
     83   hasPatchPoint:   false
     84   stackSize:       0
     85   offsetAdjustment: 0
     86   maxAlignment:    1
     87   adjustsStack:    false
     88   hasCalls:        false
     89   stackProtector:  ''
     90   maxCallFrameSize: 4294967295
     91   hasOpaqueSPAdjustment: false
     92   hasVAStart:      false
     93   hasMustTailInVarArgFunc: false
     94   savePoint:       ''
     95   restorePoint:    ''
     96 fixedStack:
     97 stack:
     98 constants:
     99 body:             |
    100   bb.0.entry:
    101     %0:gpr32 = LUi target-flags(mips-abs-hi) @bArray
    102     %1:gpr32 = ADDiu killed %0, target-flags(mips-abs-lo) @bArray
    103     %2:gpr32 = LBuE %1, 5 :: (dereferenceable load 1 from `i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 5)`)
    104     %3:gpr32 = ADDiu killed %2, -7
    105     SBE killed %3, %1, 3 :: (store 1 into `i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 3)`)
    106     %4:gpr32 = LBE %1, 5 :: (dereferenceable load 1 from `i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 5)`)
    107     %5:gpr32 = ADDiu killed %4, -7
    108     SBE killed %5, %1, 3 :: (store 1 into `i8* getelementptr inbounds ([13 x i8], [13 x i8]* @bArray, i32 0, i32 3)`)
    109     %6:gpr32 = LUi target-flags(mips-abs-hi) @hArray
    110     %7:gpr32 = ADDiu killed %6, target-flags(mips-abs-lo) @hArray
    111     %8:gpr32 = LHuE %7, 10 :: (dereferenceable load 2 from `i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 5)`)
    112     %9:gpr32 = ADDiu killed %8, -7
    113     SHE killed %9, %7, 6 :: (store 2 into `i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 3)`)
    114     %10:gpr32 = LHE %7, 10 :: (dereferenceable load 2 from `i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 5)`)
    115     %11:gpr32 = ADDiu killed %10, -7
    116     SHE killed %11, %7, 6 :: (store 2 into `i16* getelementptr inbounds ([13 x i16], [13 x i16]* @hArray, i32 0, i32 3)`)
    117     %12:gpr32 = LUi target-flags(mips-abs-hi) @wArray
    118     %13:gpr32 = ADDiu killed %12, target-flags(mips-abs-lo) @wArray
    119     %14:gpr32 = LWE %13, 20 :: (dereferenceable load 4 from `i32* getelementptr inbounds ([13 x i32], [13 x i32]* @wArray, i32 0, i32 5)`)
    120     %15:gpr32 = ADDiu killed %14, -7
    121     SWE killed %15, %13, 12 :: (store 4 into `i32* getelementptr inbounds ([13 x i32], [13 x i32]* @wArray, i32 0, i32 3)`)
    122     RetRA
    123 
    124 ...
    125 ---
    126 name:            _Z3barPi
    127 alignment:       2
    128 exposesReturnsTwice: false
    129 legalized:       false
    130 regBankSelected: false
    131 selected:        false
    132 tracksRegLiveness: true
    133 registers:
    134   - { id: 0, class: gpr32, preferred-register: '' }
    135   - { id: 1, class: gpr32, preferred-register: '' }
    136   - { id: 2, class: gpr32, preferred-register: '' }
    137   - { id: 3, class: gpr32, preferred-register: '' }
    138   - { id: 4, class: gpr32, preferred-register: '' }
    139   - { id: 5, class: gpr32, preferred-register: '' }
    140   - { id: 6, class: gpr32, preferred-register: '' }
    141   - { id: 7, class: gpr32, preferred-register: '' }
    142   - { id: 8, class: gpr32, preferred-register: '' }
    143 liveins:
    144   - { reg: '$a0', virtual-reg: '%0' }
    145 frameInfo:
    146   isFrameAddressTaken: false
    147   isReturnAddressTaken: false
    148   hasStackMap:     false
    149   hasPatchPoint:   false
    150   stackSize:       0
    151   offsetAdjustment: 0
    152   maxAlignment:    4
    153   adjustsStack:    false
    154   hasCalls:        false
    155   stackProtector:  ''
    156   maxCallFrameSize: 4294967295
    157   hasOpaqueSPAdjustment: false
    158   hasVAStart:      false
    159   hasMustTailInVarArgFunc: false
    160   savePoint:       ''
    161   restorePoint:    ''
    162 fixedStack:
    163 stack:
    164   - { id: 0, name: z.addr, type: default, offset: 0, size: 4, alignment: 4,
    165       stack-id: 0, callee-saved-register: '', callee-saved-restored: true,
    166       debug-info-variable: '', debug-info-expression: '',
    167       debug-info-location: '' }
    168 constants:
    169 body:             |
    170   bb.0.entry:
    171     successors: %bb.1(0x80000000)
    172     liveins: $a0
    173 
    174     %0:gpr32 = COPY $a0
    175     %1:gpr32 = COPY %0
    176     SW %0, %stack.0.z.addr, 0 :: (store 4 into %ir.z.addr)
    177     %2:gpr32 = LW %stack.0.z.addr, 0 :: (dereferenceable load 4 from %ir.z.addr)
    178     SYNC 0
    179     %3:gpr32 = ADDiu $zero, 42
    180 
    181   bb.1.entry:
    182     successors: %bb.1(0x40000000), %bb.2(0x40000000)
    183 
    184     %4:gpr32 = LLE %2, 0
    185     %6:gpr32 = ADDu %4, %3
    186     %8:gpr32 = SCE %6, %2, 0
    187     BEQ %8, $zero, %bb.1, implicit-def $at
    188 
    189   bb.2.entry:
    190     SYNC 0
    191     %5:gpr32 = ADDiu killed %4, 42
    192     $v0 = COPY %5
    193     CACHEE %1, 5, 2
    194     PREFE %1, 5, 2
    195     RetRA implicit $v0
    196 
    197 ...
    198 
    199 # CHECK: 60 41 60 05  lbue  $2, 5($1)
    200 # CHECK: 60 41 68 05  lbe $2, 5($1)
    201 # CHECK: 60 41 a8 03  sbe $2, 3($1)
    202 
    203 # CHECK: 60 41 62 0a  lhue  $2, 10($1)
    204 # CHECK: 60 41 6a 0a  lhe $2, 10($1)
    205 # CHECK: 60 41 aa 06  she $2, 6($1)
    206 
    207 # CHECK: 60 41 6e 14  lwe $2, 20($1)
    208 # CHECK: 60 41 ae 0c  swe $2, 12($1)
    209 
    210 # CHECK: 60 41 6c 00  lle $2, 0($1)
    211 # CHECK: 60 81 ac 00  sce $4, 0($1)
    212 
    213 # CHECK: 60 41 a6 05  cachee  2, 5($1)
    214 # CHECK: 60 41 a4 05  prefe 2, 5($1)
    215