| # RUN: llc -O0 -mtriple=mips -mcpu=mips32r3 -mattr=+micromips,+eva -start-after=finalize-isel \ |
| # RUN: -filetype obj %s -o - | llvm-objdump --no-print-imm-hex --mattr=+eva -d - | FileCheck %s |
| |
| # Test that MIPS unaligned load/store instructions can be mapped to their |
| # corresponding microMIPS instructions. |
| --- | |
| define void @g(ptr %a, ptr %b) { |
| entry: |
| %0 = load i32, ptr %a, align 1 |
| store i32 %0, ptr %b, align 1 |
| ret void |
| } |
| |
| define void @g2(ptr %a, ptr %b) { |
| entry: |
| %0 = load i32, ptr %a, align 1 |
| store i32 %0, ptr %b, align 1 |
| ret void |
| } |
| ... |
| --- |
| name: g |
| alignment: 4 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| failedISel: false |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$a0', virtual-reg: '%0' } |
| - { reg: '$a1', virtual-reg: '%1' } |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: false |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 1 |
| adjustsStack: false |
| hasCalls: false |
| stackProtector: '' |
| maxCallFrameSize: 4294967295 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| savePoint: '' |
| restorePoint: '' |
| fixedStack: |
| stack: |
| constants: |
| body: | |
| bb.0.entry: |
| liveins: $a0, $a1 |
| |
| %1:gpr32 = COPY $a1 |
| %0:gpr32 = COPY $a0 |
| %3:gpr32 = IMPLICIT_DEF |
| %2:gpr32 = LWL %0, 0, %3 :: (load (s32) from %ir.a, align 1) |
| %4:gpr32 = LWR %0, 3, %2 :: (load (s32) from %ir.a, align 1) |
| SWL %4, %1, 0 :: (store (s32) into %ir.b, align 1) |
| SWR %4, %1, 3 :: (store (s32) into %ir.b, align 1) |
| RetRA |
| |
| ... |
| --- |
| name: g2 |
| alignment: 4 |
| exposesReturnsTwice: false |
| legalized: false |
| regBankSelected: false |
| selected: false |
| failedISel: false |
| tracksRegLiveness: true |
| liveins: |
| - { reg: '$a0', virtual-reg: '%0' } |
| - { reg: '$a1', virtual-reg: '%1' } |
| frameInfo: |
| isFrameAddressTaken: false |
| isReturnAddressTaken: false |
| hasStackMap: false |
| hasPatchPoint: false |
| stackSize: 0 |
| offsetAdjustment: 0 |
| maxAlignment: 1 |
| adjustsStack: false |
| hasCalls: false |
| stackProtector: '' |
| maxCallFrameSize: 4294967295 |
| hasOpaqueSPAdjustment: false |
| hasVAStart: false |
| hasMustTailInVarArgFunc: false |
| savePoint: '' |
| restorePoint: '' |
| fixedStack: |
| stack: |
| constants: |
| body: | |
| bb.0.entry: |
| liveins: $a0, $a1 |
| |
| %1:gpr32 = COPY $a1 |
| %0:gpr32 = COPY $a0 |
| %3:gpr32 = IMPLICIT_DEF |
| %2:gpr32 = LWLE %0, 0, %3 :: (load (s32) from %ir.a, align 1) |
| %4:gpr32 = LWRE %0, 3, %2 :: (load (s32) from %ir.a, align 1) |
| SWLE %4, %1, 0 :: (store (s32) into %ir.b, align 1) |
| SWRE %4, %1, 3 :: (store (s32) into %ir.b, align 1) |
| RetRA |
| |
| ... |
| |
| # CHECK-LABEL: <g>: |
| # CHECK: 0: 60 24 00 00 lwl $1, 0($4) |
| # CHECK: 4: 60 24 10 03 lwr $1, 3($4) |
| # CHECK: 8: 60 25 80 00 swl $1, 0($5) |
| # CHECK: c: 60 25 90 03 swr $1, 3($5) |
| |
| # CHECK-LABEL: <g2>: |
| # CHECK: 14: 60 24 64 00 lwle $1, 0($4) |
| # CHECK: 18: 60 24 66 03 lwre $1, 3($4) |
| # CHECK: 1c: 60 25 a0 00 swle $1, 0($5) |
| # CHECK: 20: 60 25 a2 03 swre $1, 3($5) |