Index: lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp =================================================================== --- lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp +++ lib/Target/WebAssembly/WebAssemblyInstrInfo.cpp @@ -70,6 +70,8 @@ CopyOpcode = WebAssembly::COPY_F32; else if (RC == &WebAssembly::F64RegClass) CopyOpcode = WebAssembly::COPY_F64; + else if (RC == &WebAssembly::V128RegClass) + CopyOpcode = WebAssembly::COPY_V128; else llvm_unreachable("Unexpected register class"); Index: test/CodeGen/WebAssembly/regcopy.mir =================================================================== --- /dev/null +++ test/CodeGen/WebAssembly/regcopy.mir @@ -0,0 +1,115 @@ +# RUN: llc %s -o - -run-pass=postrapseudos | FileCheck %s +--- | + target datalayout = "e-m:e-p:32:32-i64:64-n32:64-S128" + target triple = "wasm32-unknown-unknown" + + define void @copy_i32() { + ret void + } + + define void @copy_i64() { + ret void + } + + define void @copy_f32() { + ret void + } + + define void @copy_f64() { + ret void + } + + define void @copy_v128() { + ret void + } +... +--- +name: copy_i32 +# CHECK-LABEL: copy_i32 +registers: + - { id: 0, class: i32 } + - { id: 1, class: i32 } +liveins: + - { reg: '$arguments' } +frameInfo: + maxCallFrameSize: 0 +body: | + ; CHECK-LABEL: bb.0: + ; CHECK-NEXT: %0:i32 = COPY_I32 %1:i32 + ; CHECK-NEXT: RETURN_VOID + bb.0: + %0:i32 = COPY %1 + RETURN_VOID implicit-def dead $arguments +... +--- +name: copy_i64 +# CHECK-LABEL: copy_i64 +registers: + - { id: 0, class: i64 } + - { id: 1, class: i64 } +liveins: + - { reg: '$arguments' } +frameInfo: + maxCallFrameSize: 0 +body: | + ; CHECK-LABEL: bb.0: + ; CHECK-NEXT: %0:i64 = COPY_I64 %1:i64 + ; CHECK-NEXT: RETURN_VOID + bb.0: + %0:i64 = COPY %1 + RETURN_VOID implicit-def dead $arguments +... +--- +name: copy_f32 +# CHECK-LABEL: copy_f32 +registers: + - { id: 0, class: f32 } + - { id: 1, class: f32 } +liveins: + - { reg: '$arguments' } +frameInfo: + maxCallFrameSize: 0 +body: | + ; CHECK-LABEL: bb.0: + ; CHECK-NEXT: %0:f32 = COPY_F32 %1:f32 + ; CHECK-NEXT: RETURN_VOID + bb.0: + %0:f32 = COPY %1 + RETURN_VOID implicit-def dead $arguments +... +--- +name: copy_f64 +# CHECK-LABEL: copy_f64 +registers: + - { id: 0, class: f64 } + - { id: 1, class: f64 } +liveins: + - { reg: '$arguments' } +frameInfo: + maxCallFrameSize: 0 +body: | + ; CHECK-LABEL: bb.0: + ; CHECK-NEXT: %0:f64 = COPY_F64 %1:f64 + ; CHECK-NEXT: RETURN_VOID + bb.0: + %0:f64 = COPY %1 + RETURN_VOID implicit-def dead $arguments +... +--- +name: copy_v128 +# CHECK-LABEL: copy_v128 +registers: + - { id: 0, class: v128 } + - { id: 1, class: v128 } +liveins: + - { reg: '$arguments' } +frameInfo: + maxCallFrameSize: 0 +body: | + ; CHECK-LABEL: bb.0: + ; CHECK-NEXT: %0:v128 = COPY_V128 %1:v128 + ; CHECK-NEXT: RETURN_VOID + bb.0: + %0:v128 = COPY %1 + RETURN_VOID implicit-def dead $arguments +...